Keras入力の説明:input_shape、units、batch_size、dimなど


262

任意のKeras層(の場合はLayerクラス)、缶誰かが違いを理解する方法を説明しinput_shapeunitsdim、などを?

たとえば、ドキュメントにはunits、レイヤーの出力形状を指定すると書かれています。

下のニューラルネットの画像にhidden layer1は4ユニットあります。これunitsLayerオブジェクトの属性に直接変換されますか?それともunitsケラスでは、隠しレイヤーのすべてのウェイトの形状にユニット数を掛けたものに等しいですか?

簡単に言うと、下の画像を使用して、モデルの属性、特にレイヤーをどのように理解/視覚化するのですか? ここに画像の説明を入力してください

回答:


412

単位:

「ニューロン」または「細胞」の量、または層がその中に持っているもの。

これは各レイヤーのプロパティであり、はい、出力形状に関連しています(後で説明します)。あなたの写真では、他のレイヤーと概念的に異なる入力レイヤーを除いて、次のようになっています:

  • 非表示レイヤー1:4ユニット(4ニューロン)
  • 非表示レイヤー2:4ユニット
  • 最終層:1ユニット

形状は、モデルの構成の結果です。形状とは、配列またはテンソルが各次元に持つ要素の数を表すタプルです。

例:形状と(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)
  • 2Dたたみ込み層には、次のような入力が必要です。
    • 使用する場合channels_last(batch_size, imageside1, imageside2, channels)
    • 使用する場合channels_first(batch_size, channels, imageside1, imageside2)
  • 1D畳み込みとリカレントレイヤーの使用 (batch_size, sequence_length, features)

これで、モデルはそれを認識できないため、入力形状のみを定義する必要があります。トレーニングデータに基づいて、あなただけがそれを知っています。

他のすべての形状は、各レイヤーの単位と特殊性に基づいて自動的に計算されます。

形状と単位の関係-出力形状

入力形状を考えると、他のすべての形状はレイヤー計算の結果です。

各レイヤーの「単位」は、出力形状(レイヤーによって生成され、次のレイヤーの入力となるテンソルの形状)を定義します。

各タイプのレイヤーは特定の方法で機能します。密な層は「単位」に基づく出力形状を持ち、畳み込み層は「フィルター」に基づく出力形状を持ちます。しかし、それは常にいくつかのレイヤープロパティに基づいています。(各レイヤーの出力については、ドキュメントを参照してください)

グラフに表示されるタイプである「高密度」レイヤーで何が起こるかを見てみましょう。

密なレイヤーの出力形状は(batch_size,units)です。つまり、レイヤーのプロパティである単位も出力形状を定義します。

  • 非表示のレイヤー1:4ユニット、出力形状:(batch_size,4)
  • 非表示のレイヤー2:4ユニット、出力形状:(batch_size,4)
  • 最後のレイヤー:1ユニット、出力形状:(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でイメージを定義する

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)

テンソルの形状

レイヤーを定義するときは、バッチサイズを無視することを忘れないでください。

  • inpTensor: (None,3)
  • hidden1Out: (None,4)
  • hidden2Out: (None,4)
  • finalOut: (None,1)

7
input_shape=パラメータに関する疑問が1つ残っています。引数の最初の値が参照する次元はどれですか。私はのようなものを見ているinput_shape=(728, )ので、私の頭では、最初の引数は列(固定)を参照し、2番目の行は(自由に変更できます)を参照しています。しかし、これはPythonの行優先の配列の順序とどのように一致しますか?
Maxim.K 2017

17
そのコンマは2番目の次元を作成しません。tuple要素を1つだけ含むを作成するためのpython表記です。input_shape(728,)と同じbatch_input=(batch_size,728)です。つまり、各サンプルには728個の値があります。
DanielMöller17年

@DanielMöller:「入力要素」と「寸法」の違いは何ですか?上記のグラフには3次元の入力レイヤーがあり、dim = 3だったと思うので、入力が1次元であると書いてあるので、ここで何が欠けているのだろうと思います...
ヘレン

1
ベクトルは1次元ですが、多くの要素があります。形状は(n、)です。---マトリックスには2つの次元があり、次元0にはm要素、次元1にはn要素、合計mxn要素、形状(m、n)があります。小さな立方体に分割された「立方体」を想像してみてください。それぞれの小さな立方体にデータがあり、mxnxo要素、形状(m、n、o)を持つ3Dになります。
ダニエル・メーラー

2
@Prince、順序が重要です。data_format = 'channels_first'またはを使用するようにKerasを設定できますdata_format='channels_last'。常にチャネルを最後に使用することをお勧めします(Kerasのデフォルト)。他のすべてのレイヤーとの互換性が高くなります。
ダニエル・メーラー

11

明確化された入力次元:

直接的な回答ではありませんが、「入力ディメンション」という単語は十分に混乱を招く可能性があるので、注意してください。

それ(次元という単語のみ)は、以下を参照できます。

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種類ある場合、さまざまな話者と会話するには非常に高い能力が必要です)。おそらくこれはプログラミング言語でも同じです。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.