回答:
「ニューロン」または「細胞」の量、または層がその中に持っているもの。
これは各レイヤーのプロパティであり、はい、出力形状に関連しています(後で説明します)。あなたの写真では、他のレイヤーと概念的に異なる入力レイヤーを除いて、次のようになっています:
形状は、モデルの構成の結果です。形状とは、配列またはテンソルが各次元に持つ要素の数を表すタプルです。
例:形状と(30,4,10)
は、3次元の配列またはテンソルを意味し、最初の次元に30要素、2番目に4要素、3番目に10要素を含み、合計30 * 4 * 10 = 1200要素または数です。
レイヤー間を流れるのはテンソルです。テンソルは、形状を持つ行列として見ることができます。
Kerasでは、入力層自体は層ではなくテンソルです。これは、最初の非表示レイヤーに送信する開始テンソルです。このテンソルは、トレーニングデータと同じ形状でなければなりません。
例: RGB(3チャネル)に50x50ピクセルの画像が30個ある場合、入力データの形状は(30,50,50,3)
です。次に、入力レイヤーテンソルはこの形状でなければなりません(「ケラスの形状」セクションの詳細を参照してください)。
レイヤーのタイプごとに、特定の数の次元を持つ入力が必要です。
Dense
レイヤーには入力が必要です (batch_size, input_size)
(batch_size, optional,...,optional, input_size)
channels_last
:(batch_size, imageside1, imageside2, channels)
channels_first
:(batch_size, channels, imageside1, imageside2)
(batch_size, sequence_length, features)
これで、モデルはそれを認識できないため、入力形状のみを定義する必要があります。トレーニングデータに基づいて、あなただけがそれを知っています。
他のすべての形状は、各レイヤーの単位と特殊性に基づいて自動的に計算されます。
入力形状を考えると、他のすべての形状はレイヤー計算の結果です。
各レイヤーの「単位」は、出力形状(レイヤーによって生成され、次のレイヤーの入力となるテンソルの形状)を定義します。
各タイプのレイヤーは特定の方法で機能します。密な層は「単位」に基づく出力形状を持ち、畳み込み層は「フィルター」に基づく出力形状を持ちます。しかし、それは常にいくつかのレイヤープロパティに基づいています。(各レイヤーの出力については、ドキュメントを参照してください)
グラフに表示されるタイプである「高密度」レイヤーで何が起こるかを見てみましょう。
密なレイヤーの出力形状は(batch_size,units)
です。つまり、レイヤーのプロパティである単位も出力形状を定義します。
(batch_size,4)
。 (batch_size,4)
。 (batch_size,1)
。 重みは、入力と出力の形状に基づいて完全に自動的に計算されます。この場合も、各タイプのレイヤーは特定の方法で機能します。しかし、重みは、いくつかの数学的な操作によって入力形状を出力形状に変換できる行列になります。
密なレイヤーでは、重みはすべての入力を乗算します。これは、入力ごとに1列、ユニットごとに1行の行列ですが、これは基本的な作業では重要ではありません。
画像では、各矢印に乗算数がある場合、すべての数値が一緒になって重み行列を形成します。
以前に、入力形状がの50個の画像、50x50ピクセル、3つのチャネルの30個の画像の例を示しました(30,50,50,3)
。
入力形状は定義する必要がある唯一のものなので、Kerasは最初のレイヤーでそれを要求します。
しかし、この定義では、Kerasは最初の次元(バッチサイズ)を無視します。モデルは任意のバッチサイズを処理できる必要があるため、他のディメンションのみを定義します。
input_shape = (50,50,3)
#regardless of how many images I have, each image has this shape
それはモデルの特定の種類によって必要なとき、必要に応じて、または、あなたが経由してバッチサイズを含む形状渡すことができますbatch_input_shape=(30,50,50,3)
かをbatch_shape=(30,50,50,3)
。これにより、トレーニングの可能性がこの固有のバッチサイズに制限されるため、本当に必要な場合にのみ使用してください。
どちらの方法を選択しても、モデルのテンソルにはバッチディメンションがあります。
したがって、を使用した場合でもinput_shape=(50,50,3)
、kerasがメッセージを送信するとき、またはモデルの概要を印刷するときに、が表示され(None,50,50,3)
ます。
最初のディメンションはバッチサイズNone
です。これは、トレーニングに使用するサンプルの数によって異なる可能性があるためです。(バッチサイズを明示的に定義した場合は、の代わりに定義した数が表示されますNone
)
また、高度な作業では、実際にテンソル(たとえば、Lambdaレイヤー内または損失関数)を直接操作すると、バッチサイズのディメンションがそこにあります。
input_shape=(50,50,3)
(30,50,50,3)
(None,50,50,3)
または(30,50,50,3)
になります。 そして最後に、何dim
ですか?
入力図形の次元が1つだけの場合、それをタプルとして指定する必要はなくinput_dim
、スカラー数として指定します。
したがって、入力レイヤーに3つの要素があるモデルでは、次の2つの要素のいずれかを使用できます。
input_shape=(3,)
-ディメンションが1つしかない場合はカンマが必要です input_dim = 3
しかし、テンソルを直接処理する場合、テンソルのdim
次元数を参照することがよくあります。たとえば、形状(25,10909)のテンソルには2次元があります。
Kerasには、Sequential
モデル、または関数型APIの2つの方法がありますModel
。シーケンシャルモデルを使用するのは好きではありません。ブランチを持つモデルが必要になるため、後でそれを忘れる必要があります。
PS:ここでは、アクティベーション機能などの他の側面を無視しました。
順次モデルの場合:
from keras.models import Sequential
from keras.layers import *
model = Sequential()
#start from the first hidden layer, since the input is not actually a layer
#but inform the shape of the input, with 3 elements.
model.add(Dense(units=4,input_shape=(3,))) #hidden layer 1 with input
#further layers:
model.add(Dense(units=4)) #hidden layer 2
model.add(Dense(units=1)) #output layer
関数型APIモデルの場合:
from keras.models import Model
from keras.layers import *
#Start defining the input tensor:
inpTensor = Input((3,))
#create the layers and pass them the input tensor to get the output tensor:
hidden1Out = Dense(units=4)(inpTensor)
hidden2Out = Dense(units=4)(hidden1Out)
finalOut = Dense(units=1)(hidden2Out)
#define the model's start and end points
model = Model(inpTensor,finalOut)
テンソルの形状
レイヤーを定義するときは、バッチサイズを無視することを忘れないでください。
(None,3)
(None,4)
(None,4)
(None,1)
tuple
要素を1つだけ含むを作成するためのpython表記です。input_shape(728,)
と同じbatch_input=(batch_size,728)
です。つまり、各サンプルには728個の値があります。
data_format = 'channels_first'
またはを使用するようにKerasを設定できますdata_format='channels_last'
。常にチャネルを最後に使用することをお勧めします(Kerasのデフォルト)。他のすべてのレイヤーとの互換性が高くなります。
明確化された入力次元:
直接的な回答ではありませんが、「入力ディメンション」という単語は十分に混乱を招く可能性があるので、注意してください。
それ(次元という単語のみ)は、以下を参照できます。
a)時系列信号をビームするセンサー軸の#Nなどの入力データ(またはストリーム)の次元、またはRGBカラーチャネル(3):推奨ワード=> "InputStream次元"
b)入力フィーチャ(または入力レイヤー)の総数/長さ(MINSTカラーイメージの場合、28 x 28 = 784)またはFFT変換されたスペクトル値の3000、または
「入力レイヤー/入力フィーチャディメンション」
c)入力の次元数(次元数)(通常、Keras LSTMで予想される3D)または(#RowofSamples、#of Senors、#of Values ..)3が答えです。
「入力のN次元性」
d)ラップされたこの入力画像データの特定の入力形状(例:(30,50,50,3)、またはラップされていない場合は(30、250、3)Keras :
Kerasのinput_dimは、入力レイヤーのディメンション/入力フィーチャの数を参照します
model = Sequential()
model.add(Dense(32, input_dim=784)) #or 3 in the current posted example above
model.add(Activation('relu'))
Keras LSTMでは、合計タイムステップを指します
用語は非常に紛らわしく、正しく、私たちは非常に紛らわしい世界に住んでいます!!
機械学習における課題の1つは、さまざまな言語や方言や用語に対応することです(たとえば、英語のバージョンが5〜8種類ある場合、さまざまな話者と会話するには非常に高い能力が必要です)。おそらくこれはプログラミング言語でも同じです。
input_shape=
パラメータに関する疑問が1つ残っています。引数の最初の値が参照する次元はどれですか。私はのようなものを見ているinput_shape=(728, )
ので、私の頭では、最初の引数は列(固定)を参照し、2番目の行は(自由に変更できます)を参照しています。しかし、これはPythonの行優先の配列の順序とどのように一致しますか?