0
我一直在嘗試實現一個基本的多層LSTM迴歸網絡來找出加密電子貨幣價格之間的相關性。Keras爲什麼不能概括我的數據?
在遇到無法使用的訓練結果後,我決定嘗試使用一些沙盒代碼,以確保在重試完整數據集之前我已經明白了。
問題是我不能讓凱拉斯推廣我的數據。
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看起來是這樣的:
[[[ 0]
[100]
[200]]
[[300]
[400]
[500]]]
和y:
[[[300]
[400]
[500]]
[[600]
[700]
[800]]]
這個效果很好,當我預測使用非常相似的數據集,但不會推廣的時候我嘗試使用縮放值類似的順序
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對單變量數據進行自迴歸的討論很有用:https://machinelearningmastery.com/suitability-long-short-term-memory-networks - 時間序列預測/ - 不能說它完全回答了我的問題,但它提供了一些有關LSTM如何不能達到時間序列預測預期的見解。 – Phil
你高估了深度學習的力量。你只給它乘以100作爲輸入,並期望它也推廣到10的倍數。因爲10不是特殊數字,所以這種轉換學習也應該適用於任何數字的整數倍數。但是,您的模型應該如何知道這是它應該完成的任務?你的訓練數據決不會告訴你。任務也可以是在當前時間步驟簡單地將100添加到輸入。爲了能夠推廣,您需要提供包含泛化示例的模型訓練數據。 –