web-dev-qa-db-ja.com

ケラスにおける「平坦化」の役割

KerasのFlatten関数の役割を理解しようとしています。以下は私のコードです。これは単純な2層ネットワークです。形状(3、2)の2次元データを取り込み、形状(1、4)の1次元データを出力します。

model = Sequential()
model.add(Dense(16, input_shape=(3, 2)))
model.add(Activation('relu'))
model.add(Flatten())
model.add(Dense(4))
model.compile(loss='mean_squared_error', optimizer='SGD')

x = np.array([[[1, 2], [3, 4], [5, 6]]])

y = model.predict(x)

print y.shape

これはyが(1、4)の形をしていることを出力します。ただし、Flatten行を削除すると、yの形状は(1、3、4)です。

わかりません。私のニューラルネットワークの理解から、model.add(Dense(16, input_shape=(3, 2)))関数は16ノードで隠れた完全接続層を作成しています。これらの各ノードは、3 x 2の各入力エレメントに接続されています。したがって、この最初のレイヤの出力にある16個のノードはすでに「フラット」です。したがって、最初のレイヤーの出力形状は(1,16)になります。そして、第2層はこれを入力として形状(1,4)のデータを出力する。

それで、最初のレイヤーの出力が既に「フラット」で形状(1、16)の場合、なぜそれをさらにフラットにする必要があるのでしょうか。

ありがとうございます。

58
Karnivaurus

あなたが Dense のドキュメントを読むなら、あなたはそれを見るでしょう:

Dense(16, input_shape=(5,3))

3つの入力と16の出力を持つDenseネットワークは、5つのステップそれぞれに独立して適用されます。 D(x)が3次元ベクトルを16次元ベクトルに変換すると、レイヤーからの出力として得られるものは、一連のベクトル:[D(x[0,:], D(x[1,:],..., D(x[4,:]]の形状を持つ(5, 16)になります。あなたが指定した振る舞いをさせるために、あなたは最初にあなたの入力を15-dベクトルにFlattenし、次にDenseを適用することができます:

model = Sequential()
model.add(Flatten(input_shape=(3, 2)))
model.add(Dense(16))
model.add(Activation('relu'))
model.add(Dense(4))
model.compile(loss='mean_squared_error', optimizer='SGD')

編集:何人かの人々が理解するのに苦労したように - ここにあなたは説明のイメージがあります:

enter image description here

79
Marcin Możejko

短い読み:

テンソルを平坦化するとは、1つの次元を除くすべての次元を削除することを意味します。これがFlattenレイヤーの動作です。

長い読む:

考慮して作成された元のモデル(Flattenレイヤー付き)を使用すると、次のようなモデルの概要が得られます。

Layer (type)                 Output Shape              Param #   
=================================================================
D16 (Dense)                  (None, 3, 16)             48        
_________________________________________________________________
A (Activation)               (None, 3, 16)             0         
_________________________________________________________________
F (Flatten)                  (None, 48)                0         
_________________________________________________________________
D4 (Dense)                   (None, 4)                 196       
=================================================================
Total params: 244
Trainable params: 244
Non-trainable params: 0

この要約のために、次の画像は各レイヤーの入力と出力のサイズについてもう少し意味があると思います。

あなたが読むことができるようにFlattenレイヤーのための出力形状は、(なし、48)です。これが先端です。あなたはそれを実際に読むべきです(1、48)。ランク1の配列です。

Tensorflowがグラフ作成中に形状を推測できない場合は、次元値をNoneに設定しますが、1であることがわかります。

Kerasにおける平坦化レイヤの役割はとても単純です。

テンソルに対する平坦化操作は、テンソルをテンソルに含まれる要素の数に等しい形状を持つように変形します。これは要素の1次元配列と同じものです。

あなたの場合、それは次元を単一のrawに減らすでしょう:(1、48)

enter image description here


Flattenレイヤーを削除した2番目のケースを確認しましょう。

Layer (type)                 Output Shape              Param #   
=================================================================
D16 (Dense)                  (None, 3, 16)             48        
_________________________________________________________________
A (Activation)               (None, 3, 16)             0         
_________________________________________________________________
D4 (Dense)                   (None, 3, 4)              68        
=================================================================
Total params: 116
Trainable params: 116
Non-trainable params: 0

enter image description here

Flattenレイヤーがなければ、次元の縮小や入力配列はありません。

x = np.array([[[1, 2], [3, 4], [5, 6]]])

(1,3,2)の形では(1、3、4)の形でyが出力されます。


注:出力形状とパラメーターの詳細を提供するためにmodel.summary()メソッドを使用しました。

9
prosti