2017-05-15 38 views
1

申し訳ありません。RNNを初めて使用しています。私はTimeDistributed層でthis postを読んだ。私はKerasに自分のデータを整形しているKerasのLSTMのTimeDistributedレイヤーとリターンシーケンスなど

[samples, time_steps, features]をrequried:[140*50*19]、私は140個のデータ点を持っている意味し、各50時間ステップ、及び19点の特徴を有します。私の出力は[140*50*1]の形をしています。私は最後のデータポイントの精度についてもっと気にしています。これは回帰の問題です。

私の現在のコードは次のとおりです。

x = Input((None, X_train.shape[-1]) , name='input') 
lstm_kwargs = { 'dropout_W': 0.25, 'return_sequences': True, 'consume_less': 'gpu'} 
lstm1 = LSTM(64, name='lstm1', **lstm_kwargs)(x) 
output = Dense(1, activation='relu', name='output')(lstm1) 
model = Model(input=x, output=output) 
sgd = SGD(lr=0.00006, momentum=0.8, decay=0, nesterov=False) 
optimizer = sgd 
model.compile(optimizer=optimizer, loss='mean_squared_error') 

私の質問は以下のとおりです。

  1. 私の場合は、多対多であるので、私はreturn_sequences=Trueを使用する必要がありますか?最後のタイムステップの予測だけが必要な場合は、多対一になるでしょう。だから私の出力は[140*1*1]return_sequences=Falseになる必要がありますか?
  2. 多対多を使用すると、最後のタイムポイントの精度を向上させる方法はありますか?他のポイントの精度よりも気になります。
  3. 私はパフォーマンスがTimeDistributed層を使用しないよりも悪いように思わ

    output = TimeDistributed(Dense(1, activation='relu'), name='output')(lstm1) 
    

    としてTimeDistributed層を使用しようとしました。なぜこれはそうですか?

  4. 私はoptimizer=RMSprop(lr=0.001)を使用しようとしました。私はRMSpropがNNを安定させるはずだと思った。しかし、私は決してRMSpropを使って良い結果を得ることができませんでした。
  5. SGDの場合、良いlrと勢いを選択するにはどうすればよいですか?私はさまざまな組み合わせを手動でテストしています。ケラスにクロスバリデーションの方法はありますか?
+0

なぜ、[140、50、19]の代わりに '[140 * 50 * 19]'と書いていますか?形状は実際に '[133000]'ですか? – sietschie

+0

ありがとう、私は[140、50、19] – Echo

答えて

1

ので:

  1. はい - return_sequences=Falseを出力するシーケンス予測の最後の要素だけをネットワークになります。
  2. Lambdaレイヤーを使用して出力スライスを定義できます。 Hereこれを行う方法の例が見つかります。出力をスライスすると、最後のタイムステップの値を入力する追加出力を提供することができます。
  3. 計算の観点から、これらの2つのアプローチは同等です。多分、問題は重みサンプリングによって導入されたランダム性にあります。
  4. 実際には、RNNの最初の選択としてRMSPropを使用することが経験則であり、一般的な証明された法律ではありません。さらに、パラメータを変更しないことが強く推奨されています。これは問題を引き起こすかもしれません。もう一つのことは、LSTMが安定するのに多くの時間が必要だということです。たぶん、あなたはそれをより多くのエポックのために残す必要があります。最後のことは、おそらくデータが別のアクティベーション機能を好むかもしれないということです。
  5. keras.sklearnWrapperを使用できます。
関連する問題