使用 RNN (Keras) 学习一个简单的序列

数据挖掘 Python 神经网络 喀拉斯 时间序列 rnn
2021-09-17 17:11:17

我正在尝试使用 RNN 学习一个非常简单的序列(在 Keras 中实现)

输入序列是随机生成的介于 0 到 100 之间的整数:

x=np.random.randint(0,100, 大小=2000)

而时间 t 的预期输出值是第 (t-2) 个输入项,即:

y t =x t-2

这样一个示例数据集如下所示:

+------+------+
| X | 是 |
+------+------+
| 0 | 不适用 |
| 24 | 不适用 |
| 33 | 0 |
| 6 | 24 |
| 78 | 33 |
| 11 | 6 |
| . | . |
| . | . |
+------+------+

注意:我在训练之前删除了 NA 行。

我正在尝试训练一个简单的 RNN 来学习这个序列,如下所示:

xtrain=np.reshape(df['X'], (df.shape[0], 1, 1))
#to match dimension of input shape for SimpleRNN layer.  

model=Sequential()
model.SimpleRNN(2, input_shape=(None,1)))
model.add(Dense(1))
model.compile(optimizer='adam', loss='mse')
model.fit(x=xtrain, y=df['Y'], epochs=200, batch_size=5)

然而,我发现这个实现会导致一个局部最小值,它预测所有测试观察的常数值(~50)。

谁能帮我用正确的方法在 Keras 中实现一个基本的 RNN 来学习这个序列?

1个回答

使用原始整数作为输入和目标将使这成为一项非常困难的任务。更好的方法是为每个数字提出一个向量。您可以简单地将每个数字直接编码为向量,使用“onehot”表示,或使用嵌入层。conx您可以在此处查看基于 Keras 构建的嵌入示例:

http://conx.readthedocs.io/en/latest/Predicting%20and%20Generating%20Texts.html?highlight=embeddinglayer

和没有使用 onehot 表示的嵌入示例:

http://conx.readthedocs.io/en/latest/AliceInWonderland.html