基本的な多層LSTM回帰ネットワークを実装して、暗号違反価格間の相関を見出そうとしていました。Kerasがデータを一般化しないのはなぜですか?
使用できなくトレーニング結果に実行した後、私は右の私の完全なデータセットに再び試みる前にアイデアを持っていることを確認するために、いくつかのサンドボックスコードをいじっすることに決めました。
問題は、データを一般化するためにKerasを取得できません。
[[[ 0]
[100]
[200]]
[[300]
[400]
[500]]]
とy:
[[[300]
[400]
[500]]
[[600]
[700]
[800]]]
、これは私が非常に類似したデータセットを使用して予測する際にうまく動作しますが、時に一般化しない
ts = 3
in_dim = 1
data = [i*100 for i in range(10)]
# tried this, didn't accomplish anything
# data = [(d - np.mean(data))/np.std(data) for d in data]
x = data[:len(data) - 4]
y = data[3:len(data) - 1]
assert(len(x) == len(y))
x = [[_x] for _x in x]
y = [[_y] for _y in y]
x = [x[idx:idx + ts] for idx in range(0, len(x), ts)]
y = [y[idx:idx + ts] for idx in range(0, len(y), ts)]
x = np.asarray(x)
y = np.asarray(y)
xは次のようになります私はスケール値と類似した配列をしてみてください
model = Sequential()
model.add(BatchNormalization(
axis = 1,
input_shape = (ts, in_dim)))
model.add(LSTM(
100,
input_shape = (ts, in_dim),
return_sequences = True))
model.add(TimeDistributed(Dense(in_dim)))
model.add(Activation('linear'))
model.compile(loss = 'mse', optimizer = 'rmsprop')
model.fit(x, y, epochs = 2000, verbose = 0)
p = np.asarray([[[10],[20],[30]]])
prediction = model.predict(p)
print(prediction)
枚の
プリント
[[[ 165.78544617]
[ 209.34489441]
[ 216.02174377]]]
私は完全に異なるスケールである値を順番に接続すると、ネットワークがまだ出力が予測するように、どのように私はこれをフォーマットすることができます
[[[ 40.0000]
[ 50.0000]
[ 60.0000]]]
をしたいです値?トレーニングデータを正規化しようとしましたが、結果はまだ完全に使用できません。
私はここで何が間違っていますか?ごLSTMに送信する前に入力データを変換する方法
また、単変量データの自己回帰のためのLSTMの使用に関するこのディスカッションも役に立ちました:https://machinelearningmastery.com/suitability-long-shortterm-memory-networks時系列の予測は - 私の質問に完全に答えているとは言えませんが、LSTMが時系列予測の期待に応えられないことがあることについてのいくつかの洞察を提供しています。 – Phil
あなたは深い学習の力を過大評価しています。入力として100を掛けるだけで、10の倍数にも一般化することが期待されます。 10は特別な番号ではないため、この転送の学習は一般的に任意の数の倍数にも適用する必要があります。しかし、あなたのモデルは、これがやるべき仕事であることをどのように知るべきですか?あなたの訓練データはそれを決して示しません。タスクは、現在のタイムステップで入力に単純に100を追加することもできます。一般化できるようにするには、一般化の例を含むモデルトレーニングデータを与える必要があります。 –