![](/img/trans.png)
[英]Poor performance of seq-to-seq LSTM on simple sin wave with low frequency
[英]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
,而是mse
或mae
或類似的。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.