2

1つの反復レイヤーでネットワークをコンパイルしようとすると問題が見つかりました。最初のレイヤーの次元性に問題があるようで、RNNレイヤーがKerasでどのように機能するかを理解しているようです。KerasシンプルなRNNの実装

私のコードサンプルは次のとおりです。

model.add(Dense(8, 
       input_dim = 2, 
       activation = "tanh", 
       use_bias = False)) 
model.add(SimpleRNN(2, 
        activation = "tanh", 
        use_bias = False)) 
model.add(Dense(1, 
       activation = "tanh", 
       use_bias = False)) 

エラーは、このエラーに関係なくinput_dim値の返され

ValueError: Input 0 is incompatible with layer simple_rnn_1: expected ndim=3, found ndim=2 

です。私は何が欠けていますか?

答えて

2

このメッセージは、rnnに入力される入力が2次元であるが、rnnレイヤーが3次元であることを意味します。

RNNレイヤの場合は、(BatchSize, TimeSteps, FeaturesPerStep)のような入力が必要です。これらは予想される3つの次元です。

Denseレイヤー(ケラス2)は、2次元または3次元のどちらでも使用できます。 input_shape=(Steps,Features)を渡すのではなく、input_dimを渡したため、2で作業していることがわかります。

これを解決する方法は数多くありますが、最も有意義で論理的なのは、入力データが時間ステップ付きのシーケンスである場合です。

ソリューション1 - あなたのトレーニングデータが配列である

あなたのトレーニングデータが列である場合、あなたは(NumberOfSamples, TimeSteps, Features)のようにそれを形作るし、モデルにそれを渡します。 input_dimではなく、最初のレイヤーでinput_shape=(TimeSteps,Features)を使用してください。

ソリューション2 - それは追加の次元があるので、あなたは最初の緻密層の出力を再構築:

model.add(Reshape((TimeSteps,Features))) 

を、あなたの最初の緻密層の出力を製品TimeSteps*Features8に等しいことを確認します。

+0

素晴らしいです、もう1つ質問ありがとうございます。最初の解は完璧に働いていますが、無限の時間ステップ(理論上の質問、私が知っている限り、無限の時間ステップは愚かです)を持ちたいのですが?次に、第1の層からの出力を再構成して、2番目のソリューションを使用する必要があります。しかし、私は単純なテストをXORのメモシーケンスで行いました。出力をシャッフルしたとき、ネットワークは期待通りに反応しませんでした。シャッフル前と同じ出力を戻していた方がいいと言っていました。どのように再形成が反復層の作業に影響するか(最初の解と比較した場合) – Seraph

+1

形状変更はデータ(任意のデータ)を取ります。これはセグメントで分割された連続した数字のシーケンスに過ぎません。 300要素があるとします。あなたが(30,10,1)のようにそれらを形作るとき、あなたはちょうど異なる方法でこれらの300要素を分けました。したがって、シーケンス目的のために再構成する場合は、達成したいこととデータの形式を理解しておく必要があります。そのため、重要な形で再構成することができます。 –

+0

あなたの無限のシーケンスのためには、おそらく1つのサンプル 'BatchSize = 1、TimeSteps、Features 'の入力で作業し、' stateful = True'を使って繰り返しレイヤーをマークするべきです。これは、レイヤーがメモリを維持し、次のバッチが1つのシーケンスで前のバッチを続けるとみなされることを意味します。この場合、あるシーケンスが終了したと判断し、別のシーケンスの供給を開始すると、手動で「メモリを消去する」(「リセット状態」と呼ばれる)必要があります。 –

関連する問題