2017-10-17 7 views
1

は単一の出力回帰モデルを構築しようとするが、最後の層エラー私はkeras ...に新しいです<p>は私が</p> <blockquote> <p>ValueError: Error when checking target: expected time_distributed_5 to have 3 dimensions, but got array with shape (14724, 1)</p> </blockquote>

inputs = Input(shape=(48, 1)) 
lstm = CuDNNLSTM(256,return_sequences=True)(inputs) 
lstm = Dropout(dropouts[0])(lstm) 

#aux_input 
auxiliary_inputs = Input(shape=(48, 7)) 
auxiliary_outputs = TimeDistributed(Dense(4))(auxiliary_inputs) 
auxiliary_outputs = TimeDistributed(Dense(7))(auxiliary_outputs) 

#concatenate 
output = keras.layers.concatenate([lstm, auxiliary_outputs]) 

output = TimeDistributed(Dense(64, activation='linear'))(output) 
output = TimeDistributed(Dense(64, activation='linear'))(output) 
output = TimeDistributed(Dense(1, activation='linear'))(output) 

model = Model(inputs=[inputs, auxiliary_inputs], outputs=[output]) 
に問題があるように思われる(1、14724)3次元を持つことが期待time_distributed_5が、形状を持つ配列を得た:ターゲットをチェック

答えて

0

いいえ、私が修正を見つけたと思っています - https://keras.io/layers/wrappers/によれば、私たちは各タイムステップに高密度の層を適用していると言います(私の場合、タイムステップは48です)。だから、私の最終層の出力以下のために(BATCH_SIZE、タイムステップ、寸法)のようになります。

output = TimeDistributed(Dense(1, activation='linear'))(output) 

は、それゆえ寸法のミスマッチ(?、48,1)になります。私は、単一の回帰出力にこれを変換したい場合はしかし、我々は最終的TimeDistributed層

を平らにする必要がありますので、私はそれを修正するために以下の行を追加しました:

output = Flatten()(output) 
output = (Dense(1, activation='linear'))(output) 

ので、今timedistributed層49に平坦化最終的な高密度層への入力(バイアス入力のように見える)が単一の出力になります。

コードは正常に動作し、適切な結果が得られます(モデルが学習します)。私の唯一の疑問は、上記のように私の結果を得るために、TimeDistributedレイヤーを単純な密なレイヤーに平坦化することが数学的に正しいかどうかです。

0

はあなたの問題の状況についての詳細を提供することができ、次のエラーを取得していますか?データをテストするか、少なくともコードを追加してください。なぜこのアーキテクチャを最初に選択していますか?よりシンプルなアーキテクチャ(LSTMだけ)がこのトリックを行うでしょうか?何を後退させていますか?線形活性化関数を持つ複数のTimeDistributed Denseレイヤーを積み重ねることは、おそらくモデルにあまり付加していません。

+0

はい、おそらく正しいでしょう。私はちょうどLSTMを使用することができますが、それは私に満足のいく結果を与えます。 lstmの入力は48タイムステップのシーケンスで、次のタイムステップ(49番目)を予測したい。各タイムステップには、AUX入力を介して供給される追加データ(48,7)(7個の機能)が付属しています。私は補助出力とlstmの出力を連結しようとしています。 – mojo1643

関連する問題