1. ホーム
  2. neural-network

[解決済み] Kerasの入力説明:input_shape, units, batch_size, dim, etc.

2022-03-15 22:20:20

質問

任意のKerasレイヤーに対して( Layer クラス) の違いをどのように理解したらよいのか、どなたか説明してください。 input_shape , units , dim などでしょうか?

例えば、ドキュメントによると units レイヤーの出力形状を指定します。

下のニューラルネットの画像では hidden layer1 は4ユニットです。これを直訳すると units 属性は Layer オブジェクトを作成しますか?それとも units は、Kerasの場合、隠れ層の各ウェイトの形状にユニット数を掛けたものに相当するのでしょうか?

要するに、下の画像でモデルの属性(特にレイヤー)をどのように理解・視覚化するのか?

解決方法は?

単位は?

<ブロッククオート

ニューロンやセルなど、そのレイヤーの中にあるものの量です。

これは各層の特性で、そう、(後で見るように)出力の形状に関係しているんだ。あなたの絵では、他のレイヤーと概念的に異なる入力レイヤーを除いて、次のようになっています。

  • 隠れ層1:4ユニット(4ニューロン)
  • 隠れ層2:4ユニット
  • 最後のレイヤー 1単位

形状

Shapesはモデルの構成の結果である。Shapesは、配列やテンソルが各次元にいくつの要素を持つかを表すタプルである。

形状 (30,4,10) は3次元の配列またはテンソルを意味し、1次元に30、2次元に4、3次元に10の要素を含み、合計30*4*10=1200の要素または数を持つ。

入力形状

レイヤー間を流れるのは、テンソルである。テンソルは形状を持った行列と見なすことができる。

Kerasでは、入力層そのものは層ではなく、テンソルである。それは最初の隠れ層に送るスタートテンソルです。このテンソルは、学習データと同じ形状でなければならない。

RGB(3チャンネル)の50x50ピクセルの画像が30枚ある場合、入力データの形状は次のようになります。 (30,50,50,3) . そして、入力層のテンソルはこの形状でなければなりません(詳細は "shapes in keras" のセクションを参照してください)。

各レイヤーは特定の次元数の入力を必要とします。

  • Dense 層は (batch_size, input_size)
    • または (batch_size, optional,...,optional, input_size)
  • 2次元畳み込み層は、次のような入力を必要とする。
    • を使用する場合 channels_last : (batch_size, imageside1, imageside2, channels)
    • を使用する場合 channels_first : (batch_size, channels, imageside1, imageside2)
  • 1次元畳み込みとリカレントレイヤー使用 (batch_size, sequence_length, features)

さて、入力形状はモデルが知ることができないので、あなたが定義しなければならない唯一のものです。なぜなら、モデルは入力形状を知ることができないからです。

それ以外の形状は、各レイヤーのユニットや特殊性に基づいて自動的に計算されます。

形状とユニットの関係 - 出力形状

入力形状があれば、それ以外の形状はすべてレイヤー計算の結果である。

各層のquot;units"が出力形状(その層で生成され、次の層の入力となるテンソルの形状)を定義することになる。

各レイヤーは特定の方法で機能します。Dense層はquot;unit"に基づいて出力形状を決定し、Convolutional層はquot;filter"に基づいて出力形状を決定します。しかし、それは常に何らかのレイヤープロパティに基づくものです。(各レイヤーが何を出力するかはドキュメントをご覧ください)

グラフにあるような、quot;Dense" レイヤーで何が起こるか見てみましょう。

密なレイヤーは、出力形状が (batch_size,units) . そう、レイヤーの特性である単位が、出力形状も定義しているのです。

  • 隠れ層1:4ユニット、出力形状。 (batch_size,4) .
  • 隠れ層2:4ユニット、出力形状。 (batch_size,4) .
  • 最後のレイヤーです。1台、出力形状。 (batch_size,1) .

重量

重みは、入力と出力の形状をもとに、すべて自動で計算されます。ここでも、レイヤーの種類によって動作が異なる。しかし、重みは、入力形状を何らかの数学的操作によって出力形状に変換することができる行列となる。

密な層では、重みはすべての入力を掛け合わせる。入力ごとに1列、単位ごとに1行の行列になりますが、基本的な作業では重要でないことが多いです。

画像では、それぞれの矢印に掛け算の数字が書かれていたら、すべての数字を合わせて重み行列を構成します。

Kerasのシェイプ

先ほど、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 )

また、高度な作業では、実際にテンソルを直接操作する場合(例えばラムダ層の中や損失関数の中)、バッチサイズの次元が存在することになる。

  • そこで、入力形状を定義する際に、バッチサイズを無視するのです。 input_shape=(50,50,3)
  • テンソルに対して直接演算を行う場合、その形状は再び (30,50,50,3)
  • kerasがメッセージを送るとき、その形状は (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には2つの方法があります。 Sequential モデル、または関数型 API Model . 私はシーケンシャルモデルを使うのが好きではありません。後でブランチを持つモデルが欲しくなるので、どうせ忘れなければなりません。

追記:ここでは活性化関数など、他の面は無視しました。

シーケンシャルモデルで :

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)