入力レイヤーの出力形状を再構築したいのですが、たとえば(None、42)の場合、1番目のニューロンから始めて1番目から7番目に進み、次にニューロンを右にスライドさせて2番目から8番目に取ります。など。このようにして、出力レイヤーは形状になります(なし、36、7)。
私はそれを行うためにkeras.layers.Lambda()レイヤーを使用していますが、それは正しく機能しておらず、寸法は私が期待するものではありません。私が書いたコードは次のとおりです。
Inpt_lyr = keras.Input(shape = (42,))
for k in range(42 - 7 + 1):
F = keras.layers.Lambda(lambda x, i, j: x[:,j : j + i])
F.arguments ={ 'i' : 7, 'j' : k}
tmp_rfrm = F(Inpt_lyr)
lst_rfrm.append(tmp_rfrm)
cnctnt_lyr = keras.layers.merge.Concatenate(axis = 0)(lst_rfrm)
tmp_dns = keras.layers.Dense(3 , activation = 'softmax')(cnctnt_lyr)
tmp_model = Model(Inpt_lyr, tmp_dns)
tmp_model.compile(loss = 'categorical_crossentropy', optimizer = 'adam')
tmp_model.summary()
conct_lyrの形状は(None、36、7)であると思いますが、(None、7)であり、エラーValueError:グラフが切断されました:テンソルTensor( "input_3:0"、shape =(? 、42)、dtype = float32)レイヤー「input_3」。次の前のレイヤーは問題なくアクセスされました:['input_4']
あなたのアプローチは私には理にかなっているように見えますが、テンソルは現在バッチ軸に沿って連結されており、この場合は望ましくありません。
ウィンドウをスライドさせながらディメンション1を拡張することをお勧めします。
for k in range(42 - 7 + 1):
F = keras.layers.Lambda(lambda x, i, j: x[:, None, j: j + i])
# F(Inpt_lyr).shape=(?, 1, 7)
次に、展開された軸に沿ってテンソルを連結します。
cnctnt_lyr = keras.layers.merge.Concatenate(axis=1)(lst_rfrm)
# cnctnt_lyr.shape=(?, 36, 7)
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加