1. ホーム
  2. machine-learning

[解決済み] Kerasにおける "Flatten "の役割とは?

2022-01-31 16:11:35

質問内容

の役割を理解しようとしています。 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個のノードを持つ隠れ完全連結層を作成しています。これらのノードはそれぞれ3x2の入力要素に接続されています。したがって、この最初の層の出力にある16個のノードは、すでに"flat"です。したがって、第1層の出力形状は(1, 16)となるはずである。そして、第2層はこれを入力とし、(1, 4)の形状のデータを出力する。

では、第1層の出力がすでにquot;flat"で形状が(1, 16)の場合、なぜさらに平坦化する必要があるのでしょうか?

どのように解決するのですか?

のKerasドキュメントのエントリを読むと Dense というように、この呼び出しがあることがわかります。

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

を使用すると、結果的に Dense のネットワークは、3つの入力と16の出力を持ち、5つのステップごとに独立して適用されます。つまり、もし D(x) は3次元のベクトルを16次元のベクトルに変換し、出力として得られるのは一連のベクトルである。 [D(x[0,:]), D(x[1,:]),..., D(x[4,:])] 形状 (5, 16) . 指定した動作をさせるために、最初に Flatten の入力を15次元ベクトルに変換し、そのベクトルに 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')

EDITです。 わかりにくいという声がありましたので、説明用の画像を用意しました。