我正试图根据输入数字预测一系列整数。
输入由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)
这意味着序列号(输入([20210001]将返回以下序列(输出([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一开始对形状抱怨很多,但当它被处理时,我一直收到糟糕的结果。如有任何帮助,我们将不胜感激。
对问题的描述有点模糊。获取一些实际数据会很有用。我们可以自己尝试。目前还不清楚这些数据代表了什么,所以我们无法告诉你你所做的事情是否有成功的机会。目前还不清楚x和y是否预测
然而,对于您的网络来说,输入和输出很可能太大。网络(通常(在使用[-1,1]中的数字时工作得更好,所以你可能应该使用StandardScaler之类的东西。你不必为此安装sklearn。你可以计算数据的平均值和标准差,并根据对所有数据进行缩放
x_scaled = (x - m) / d
和
x = x_scaled * d + m
对于逆运算,给定m
是均值,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)
输入数字非常大,因此添加一个规范化层:
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
或类似值。