keras 序列间LSTM的不相关结果

hujrc8aj  于 2022-11-13  发布在  其他
关注(0)|答案(2)|浏览(161)

我试图根据输入的数字来预测一个整数序列。
输入由10个整数的值组成:

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

输出如下,一个包含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)

在拟合后测试模型时,我们会得到如下奇怪的结果:

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一开始抱怨了很多关于形状的问题,但是当我处理的时候,我一直收到不好的结果。任何帮助都会很感激。

6ojccjat

6ojccjat1#

你对问题的描述有点模糊。获得一些实际的数据会很有用。我们可以自己尝试一下。也不清楚这些数据代表什么,所以我们不能告诉你你所做的是否有成功的机会。不清楚x和y是否预测。
然而,很可能是输入和输出对于网络来说太大了。网络(通常)使用[-1,1]格式的数字更好,所以你可能应该使用类似StandardScaler的函数。你不必为此安装sklearn。你只需要计算数据的平均值和标准差,然后根据

x_scaled = (x - m) / d

x = x_scaled * d + m

对于逆运算,给定m是数据x的平均值,d是数据x的标准差。
由于输入和输出似乎来自不同的分布,因此必须执行两次此操作。
假设您使用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)
cdmah0mi

cdmah0mi2#

输入的数字非常大,因此添加一个规范化层:

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或类似值。

相关问题