2017-09-29 62 views
0

私は時系列回帰問題のための双方向LSTMSを持つCNN-RNNモデルアーキテクチャを持っています。私の損失は50エポックに収束しません。各エポックは20kサンプルあります。損失は​​、0.001 - 0.01の間でバウンスし続けます。多変量LSTM予測損失と評価

batch_size=1 
epochs = 50 
model.compile(loss='mean_squared_error', optimizer='adam') 
trainingHistory=model.fit(trainX,trainY,epochs=epochs,batch_size=batch_size,shuffle=False) 
  1. 私は、 損失は約0.5を滞在するために、誤ってペアにXとYのデータとモデルを訓練しようとしたことは、私のXとY ができる非線形な関係を持っている合理的な結論であります私のモデルで 以上のエポックを学ぶことができますか?
  2. 私のモデルの予測はパターンをキャプチャしますが、オフセットを使用して、予測の精度を手動でチェックするための動的時間ワーピング距離を使用します。

モデル:

model = Sequential() 
model.add(LSTM(units=128, dropout=0.05, recurrent_dropout=0.35, return_sequences=True, batch_input_shape=(batch_size,featureSteps,input_dim))) 
model.add(LSTM(units=32, dropout=0.05, recurrent_dropout=0.35, return_sequences=False)) 
model.add(Dense(units=2, activation='softmax')) 
model.compile(loss='categorical_crossentropy', optimizer=opt, metrics=['accuracy']) 

答えて

3

あなたがテストした場合:

  • 間違ったデータ:〜0.5
  • 正しいデータ損失:その後〜0.01

損失モデル実際に何かを学ぶことができます。

いくつかの可能性があります。

  1. あなたの出力データは、お使いのモデルが(勾配更新ステップが大きすぎる現在の学習率の限界に達し、最後の層の活性化
  2. の範囲に収まりませんこれ以上モデルを改善することはできません)。
  3. あなたのモデルは、タスクにとって十分ではありません。
  4. あなたのデータは、ランダムな要因ある程度の

ケース1があります。

は、あなたのYがあなたの最後の活性化関数の範囲内であることを確認してください。 tanh(LSTMのデフォルト)

  • 、すべてのYデータが0と1との間に、softmax 0と1
  • 間、sigmoidについて間-1と+ 1
  • なければならないが、最後の次元が1でないことを確認します。そうでない場合、結果は常に1になります。 reluについては
  • あなたが制限された活性化の代わりに、無限大に行くものを持っている場合は、linearについては0と無限大
  • の間で、任意の値

収束が良くなります。最初のケースで
は、普段私たちがデフォルトで0.0001で10、で割り、下の学習率で(研修後)モデルを再コンパイルすることができます

ケース2:

データの場合あなたのモデルが停滞した後、学習率を下げてみてください。アダムのデフォルトの学習率が0.0001ある

、私たちは多くの場合、10で割り:

from keras.optimizers import Adam 

#after training enough with the default value: 
model.compile(loss='mse', optimizer=Adam(lr=0.00001) 
trainingHistory2 = model.fit(.........) 

#you can even do this again if you notice that the loss decreased and stopped again: 
model.compile(loss='mse',optimizer=Adam(lr=0.000001) 

を問題は学習率だった場合、これはあなたのモデルは、それがすでにやったよりも多くを学ぶようになります(があるかもしれません最初はオプティマイザが調整されるまでは難しいものもあります)。

ケース3:

あなたは何の成功を持っていない場合は、多分それはモデルの性能を高めるために時間です。 レイヤーにユニットを追加したり、レイヤーを追加したり、モデルを変更したりすることもできます。

ケース4:

ありますが、これについてできることは何も...おそらくません

しかし、あなたはケース3のようにモデルを増加した場合、オーバーフィッティングに注意してください(比較するために、いくつかのテストデータを保持テスト損失対トレーニング損失)。

モデルがあまりにもよくないと、データの重要な洞察を学ぶのではなく、単にデータを覚えるだけです。

+0

あなたはこのトレーニングの歴史についてのコメントでした:{ 'ACC':[0.54、 0.62、 0.70、 0.77、 0.81、 0.84、 0.85、 0.86、 0.88、 0.89]、 「損失を「:[0.69、0.64 、 0.56、 0.47、 0.40、 0.35、 0.32、 0.29、 0.27、 0.24]、 'val_acc':[0.52、0.52 、 0.51、 0.50、 0.51、 0.50、 0.52、 0.53、 0.51、 0.49]、 'val_loss':[0.69、 0.75、 0.81、 150、 1.03、 1.09、 1.04 、 1.16, 1.13, 1.35] – jakeN

+0

オーバーフィッティングのように聞こえます。テストデータが悪化している間にトレーニングデータが改善されたとき。これは、モデルがトレーニングデータを覚えていることを意味しています。 (パラメータが多すぎるか、レイヤーが多すぎるか、またはユニットが多すぎるかもしれません)。人々はしばしばオーバーフィットを減らすために "ドロップアウト"レイヤーを使用します。より小さなモデルを試すこともできます。 (これはあなたの検証データとあなたの訓練データが正しいと仮定して、偏りなしで選択されます) –

+0

質問に私のモデルを追加しました。見てください。私はXとYに学習可能な関係が存在することを証明しようとしているだけで、正確に一致したデータでわずかに精度が向上しています(53%@ 53%)。私の損失曲線が人気のあるL字形のものに見えないので、私が確信していない理由があります。 – jakeN

関連する問題