web-dev-qa-db-ja.com

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

どのKeras層(Layerクラス)についても、誰かがinput_shapeunitsdimなどの違いを理解する方法を説明できますか?

例えば、ドキュメントはunitsがレイヤーの出力形状を指定すると言っています。

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

手短に言うと、モデルの属性、特にレイヤーを以下の画像でどのように理解/視覚化するのでしょうか。 enter image description here

138
scarecrow

単位:

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

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

  • 隠れ層1:4単位(4ニューロン)
  • 隠れ層2:4個
  • 最終層:1ユニット

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

例: aシェイプ(30,4,10)は、最初の次元に30個の要素、2番目に4個、3番目に10個、合計30 * 4 * 10 = 1200個の要素または数を含む3次元の配列またはテンソルを意味します。

入力形状

層間を流れるのはテンソルです。テンソルは形をした行列として見ることができます。

Kerasでは、入力レイヤ自体はレイヤではなくテンソルです。それはあなたが最初の隠れ層に送る最初のテンソルです。このテンソルは、学習データと同じ形をしていなければなりません。

例: RGB(3チャンネル)に50 x 50ピクセルの画像が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)
  • 1次元畳み込みと回帰層は(batch_size, sequence_length, features) を使用します。

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

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

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

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

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

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

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

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

  • 隠れ層1:4単位、出力形状:(batch_size,4)
  • 隠れ層2:4単位、出力形状:(batch_size,4)
  • 最後のレイヤー:1単位、出力形状:(batch_size,1)

おもり

ウェイトは入力と出力の形状に基づいて完全に自動的に計算されます。繰り返しますが、各タイプのレイヤーは特定の方法で機能します。しかし、重みは、何らかの数学的演算によって入力形状を出力形状に変換することが可能な行列になるだろう。

密集層では、重みはすべての入力を乗算します。これは入力ごとに1列、単位ごとに1行の行列ですが、これは基本的な作業にはあまり重要ではありません。

画像では、各矢印に乗算番号が付いていると、すべての番号が一緒になって重み行列を形成します。

ケラスの形

先ほど、(30,50,50,3)の入力形状を持つ30画像、50 x 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次元しかない場合は、それをTupleとして指定する必要はなく、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)
224
Daniel Möller

入力寸法の明確化:

直接的な答えではありませんが、Word Input Dimensionが混乱を招く可能性があることに気付いたので、慎重に行ってください。

これは(Wordディメンションのみ)参照できます。

a)入力データ(またはストリーム)の次元 _(時系列信号を送信するセンサー軸の#N、またはRGBカラーチャンネル(3)など):Suggested Word => "InputStream Dimension"

b)入力フィーチャの総数/長さ(または入力レイヤ)(MINSTカラー画像の場合は28 x 28 = 784)、またはFFT変換されたスペクトル値で3000、

「入力レイヤ/入力フィーチャ寸法」

c)入力の次元数(次元数)(通常はKeras LSTMで予想される3D)または(#RowofSamples、#of Senors、#of Values ..)3が答えです。

「入力のN次元」

d)このアンラップ入力画像データの中のSPECIFIC Input Shape(例えば、(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の非常に異なるバージョンの英語がある場合、異なる話者と会話するには非常に高い熟練が必要です)。おそらくこれはプログラミング言語でも同じです。

3
r poon