簡體   English   中英

seq-to-seq LSTM 的不相關結果

[英]Irrelevant results of seq-to-seq LSTM

我正在嘗試根據輸入數字預測整數序列。

輸入由 10 個整數的值組成:

 array([[2021001001], [2021001002],..., ,[2021335249]],dtype=int64)

output如下,一個包含7個整數的數組。

 array([[23, 26, 17, ..., 21, 16, 4], [13, 24, 2, ..., 27, 10, 28], ..., [ 5, 16, 28, ..., 12, 27, 26]], dtype=int64)

這意味着序列號(輸入)[2021001001] 將返回以下序列(輸出)[23, 26, 17, ..., 21, 16, 4]。

我嘗試在這些輸入和輸出上訓練 LSTM,以根據序列號預測接下來的序列是什么。 我正在使用大約 +60K 的歷史數據來做到這一點。 到目前為止,這是我所做的:

 model = tf.keras.Sequential() model.add(layers.LSTM(256, activation='relu', input_shape=(10, 1), recurrent_dropout=0.2)) model.add(layers.Dense(7)) model.compile(optimizer=tf.keras.optimizers.Adam(0.00001), loss=tf.keras.losses.MeanSquaredError(), metrics=['accuracy']) model.fit(inputs, output, epochs=10, verbose=1, validation_split=0.2, batch_size=256)

在擬合后測試 model 時,我們得到如下奇怪的結果:

 predictNextNumber = model.predict(tests_[0], verbose=1) print(predictNextNumber) 1/1 [==============================] - 0s 253ms/step [[[14.475913][14.757163][14.874351][14.702476][14.639976][14.624351][14.655601]]] While the expected output should be an array of integers [24, 12, 3, 5, 11, 8, 4].

我很難弄清楚問題是什么。 Keras 起初對形狀抱怨了很多,但在處理時我一直收到不好的結果。 任何幫助,將不勝感激。

你的問題的描述有點模糊。 獲取一些實際數據會很有用,我們可以自己嘗試一下。 目前還不清楚這些數據代表什么,所以我們無法告訴你你正在做的事情是否有成功的機會。 目前尚不清楚是否 x 和預測 y。

但是,很可能輸入和輸出對於您的網絡來說太大了。 網絡(通常)使用 [-1, 1] 中的數字效果更好,所以你應該做的是使用類似StandardScaler的東西。 您不必為此安裝 sklearn。 您可以計算數據的平均值和標准差,並根據

x_scaled = (x - m) / d

x = x_scaled * d + m 

對於給定的逆運算, m是數據x的平均值, d是標准差。

由於您的輸入和輸出似乎來自不同的分布,因此您必須這樣做兩次。

假設您使用 sklearn 的StandardScaler ,您將執行以下操作:

x_scaler = StandardScaler().fit(x_train)
y_scaler = StandardScaler().fit(y_train)
scalers = dict(x=x_scaler, y=y_scaler)

# Use scaler.transform(x) 
train_data = get_dataset(scalers, mode="train")
valid_data = get_dataset(scalers, mode="dev")
test_data = get_dataset(scalers, mode="test")

model.fit(train_data, validation_data=valid_data)

# Look at some test data by using `scaler.inverse_tranfform(data)

df = pd.DataFrame([], columns=["target", "prediction"])
for x, y in test_data:
    y_pred = model(x)
    y_pred = y_scaler.inverse_transform(y_pred)
    data = np.concatenate([y, y_pred], axis=-1)
    df = pd.concat([df, pd.DataFrame(data, columns=["target", "prediction"])])

df.target = df.target.astype(int)
df.prediction = df.prediction.round(2)
print(df)

輸入的數字很大,所以添加一個歸一化層:

normalization_layer = tf.keras.layers.Normalization()
normalization_layer.adapt(inputs)

model = tf.keras.Sequential()
model.add(Input(shape=(10, 1)))
model.add(normalization_layer)
model.add(layers.LSTM(256, activation='relu', recurrent_dropout=0.2))
...

您可能需要訓練更多的時期。

優化器的learning_rate好像有點低,可以先試試默認值。

由於您要預測連續值,因此您的指標不應該是accuracy ,而是msemae或類似的。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM