Keras 入力の説明: input_shape、units、batch_size、dim など 質問する

Keras 入力の説明: input_shape、units、batch_size、dim など 質問する

任意の Keras レイヤー (クラス) について、、、などLayerの違いを理解する方法を説明できますか?input_shapeunitsdim

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

下のニューラル ネットの画像にはhidden layer14 つのユニットがあります。これはオブジェクトunitsの属性に直接変換されますかLayer? それとも、unitsKeras では、非表示層のすべての重みの形状にユニット数を掛けたものに等しいのでしょうか?

つまり、下の画像でモデルの属性、特にレイヤーをどのように理解/視覚化すればよいのでしょうか?ここに画像の説明を入力してください

ベストアンサー1

単位:

「ニューロン」または「セル」、あるいはレイヤー内に含まれるその他のものの量。

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

  • 隠れ層 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)。入力レイヤー テンソルは、この形状である必要があります (詳細については、「keras の形状」セクションを参照してください)。

各タイプのレイヤーには、特定の数の次元を持つ入力が必要です。

  • 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 行の行列ですが、基本的な作業ではこれは重要ではないことがよくあります。

画像では、各矢印に乗算の数字が付いており、すべての数字を合わせると重みマトリックスが形成されます。

Keras のシェイプ

先ほど、入力形状が である、50 x 50 ピクセル、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)
  • 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で画像を定義する

SequentialKeras には、モデルまたは機能 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)
  • 非表示1Out:(None,4)
  • 隠された2Out:(None,4)
  • 最終アウト:(None,1)

おすすめ記事