KerasでRNNを構築しようとしています。必要な入力形式がよくわかりません。密なネットワークを問題なく構築できますが、RNNレイヤーは入力次元xバッチxタイムステップを期待していると思いますか?誰かがこれを確認できますか?
更新したいコードは次のとおりです。
元のコード:
def get_generative(G_in, dense_dim=200, out_dim=50, lr=1e-3):
x = Dense(dense_dim)(G_in)
x = Activation('tanh')(x)
G_out = Dense(out_dim, activation='tanh')(x)
G = Model(G_in, G_out)
opt = SGD(lr=lr)
G.compile(loss='binary_crossentropy', optimizer=opt)
return G, G_out
G_in = Input(shape=[10])
G, G_out = get_generative(G_in)
G.summary()
GRUレイヤーといくつかのわずかに異なる寸法で変更:
def get_generative(G_in, dense_dim=10, out_dim=37, lr=1e-3):
clear_session()
x = GRU(dense_dim, activation='tanh',return_state=True)(G_in)
G_out = GRU(out_dim, return_state=True)(x)
G = Model(G_in, G_out)
opt = SGD(lr=lr)
G.compile(loss='binary_crossentropy', optimizer=opt)
return G, G_out
G_in = Input(shape=(None,3))
G, G_out = get_generative(G_in)
G.summary()
このコードで見られるエラーは次のとおりです。
ValueError:Tensor( "gru_1 / strided_slice:0"、shape =(3、10)、dtype = float32)は、Tensor( "strided_slice_1:0"、shape =(?, 3)、dtype = float32と同じグラフからのものである必要があります)。
None
上記を削除すると、次のようになります。
ValueError:入力0はレイヤーgru_1と互換性がありません:予期されるndim = 3、見つかったndim = 2
ここでどんな説明も役に立ちます。
入力テンソルの作成後にセッションをクリアしたため、エラーが発生します。そのため、入力テンソルはネットワークの他の部分と同じグラフから取得されていません。これを修正するには、行を省略しclear_session()
ます。
コードに関する別の問題:2番目のGRUレイヤーはシーケンス入力を想定しているためreturn_sequences=True
、最初のGRUレイヤー内で使用する必要があります。return_state=True
レイヤーが1つの出力テンソルではなく、テンソルのタプル(出力と状態)を返すようになるため、引数を省略したい場合があります。
要約すると、次のコードがそれを行う必要があります。
def get_generative(G_in, dense_dim=10, out_dim=37, lr=1e-3):
x = GRU(dense_dim, activation='tanh', return_sequences=True)(G_in)
G_out = GRU(out_dim)(x)
G = Model(G_in, G_out)
opt = SGD(lr=lr)
G.compile(loss='binary_crossentropy', optimizer=opt)
return G, G_out
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加