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]]] 

我怎麼能格式化這個所以,當我在一個序列插頭是一個完全不同的刻度值,網絡仍然會輸出它的預測值?我試着對訓練數據進行規範化處理,但結果仍然完全無法使用。

我在這裏做了什麼錯?

+0

我還發現這個關於使用LSTM對單變量數據進行自迴歸的討論很有用:https://machinelearningmastery.com/suitability-long-short-term-memory-networks - 時間序列預測/ - 不能說它完全回答了我的問題,但它提供了一些有關LSTM如何不能達到時間序列預測預期的見解。 – Phil

+0

你高估了深度學習的力量。你只給它乘以100作爲輸入,並期望它也推廣到10的倍數。因爲10不是特殊數字,所以這種轉換學習也應該適用於任何數字的整數倍數。但是,您的模型應該如何知道這是它應該完成的任務?你的訓練數據決不會告訴你。任務也可以是在當前時間步驟簡單地將100添加到輸入。爲了能夠推廣,您需要提供包含泛化示例的模型訓練數據。 –

回答

0

如何在發送到您的LSTM之前轉換您的輸入數據,使用類似sklearn.preprocessing.StandardScaler?經過預測,你可以打電話給scaler.inverse_transform(預測)

相關問題