【问题标题】:How to build a one-to-many RNN in Tensorflow如何在 Tensorflow 中构建一对多 RNN
【发布时间】:2020-10-09 08:12:24
【问题描述】:

我是 RNN 的新手,我想使用 Tensorflow 构建一个一对多的 RNN。我模型中的“一个”输入是 3 个坐标的向量(类似于 [x0, y0, z0]),而我希望实现的“多”输出是 50 个数字的序列,每个时间步长 1 个。

例如,我在 3d 空间中给出这个单点,例如 P = [1, 2, 3],我希望预测 50 个数字的序列,表示该点连续 50 个时间步长的温度。

我对一些示例代码进行了很多搜索,但我在网络上找不到好的一对多 RNN。感谢您对此提供的帮助。

【问题讨论】:

  • 你可以使用Model结构来运行多个输出

标签: python tensorflow keras one-to-many recurrent-neural-network


【解决方案1】:

如果我正确理解您的问题,您想要一个 RNN,其中输入 3 个特征 ([x0, y0, z0]) 并输出一个由 50 个数字组成的向量,代表 50 个时间步长的温度?

在这种情况下,您需要为要预测的每个时间步输入坐标,因为 RNN 的整个想法是,他们可以通过查看此类序列的示例来学习预测时间序列。您的数据需要采用以下结构:

您的坐标数据需要采用一种格式,其中包含您希望预测的每个时间步长的 x、y、z 数据。如果我们假设您有 10000 个数据点,那么您的输入数据需要具有以下形状:

[10000, 50, 3]

这里10000是数据点的数量,50是每个xyz坐标的时间步长,3是每个坐标给定的时间步长。

然后您的温度数据需要具有以下形状:

[10000, 50]

这里 10000 是 50 个时间步长的每个温度集合,50 是每个时间步长中的温度读数。

如果您只想使用 1 个坐标集来预测 50 个时间步长,您可以重新调整数据以在每个时间步长中具有相同的 50 个坐标。

假设你有这个数据集,你可以像这样构造一个简单的 RNN:

# ----- Define dummy data -----
coordinates = np.random.random([10000, 50, 3]).astype(np.float32)
temps = np.random.rand(10000,50)

# ----- Define RNN model -----
rnn_model = tf.keras.Sequential()
rnn_model.add(tf.keras.layers.SimpleRNN(128))
rnn_model.add(tf.keras.layers.Dense(50))

# ----- Compile model -----
rnn_model.compile(loss='mean_squared_error', optimizer=tf.keras.optimizers.Adam(1e-4))

# ----- Train model -----
history = rnn_model.fit(x=coordinates, y=temps, batch_size=32,epochs=50)

您当然需要根据任务更改网络结构,并且您还可以尝试其他循环层,例如 LSTM 层,但这应该让您了解基本知识。

【讨论】:

  • 感谢您的帮助。我只是无法理解一件事,为什么输入形状必须是[10000,50,3]?为什么不是 [10000,3]?我的意思是我有一个 [#number of points,3] 矩阵,其中第一列代表 x 轴,第二列代表 y 轴,第三列代表 z 轴。每行代表一个点。
  • 那是因为 RNN 层期望您尝试预测的每个时间步长都有一组数据点。原因是 RNN 试图了解坐标的变化将如何随着时间的推移影响温度。但是,如果您更改数据以便在每个时间步上具有相同的坐标读数,您可能仍然能够了解坐标与温度之间随时间的关系。但通常 RNN 的想法是为它提供每个时间步长的数据。如果您只有一组 xyz 坐标,您也许可以使用常规神经网络来完成任务
  • 好的,谢谢。你能告诉我如何将我的 [10000,3] 示例重塑为 [10000,50,3]?
  • 我应该把它们叠起来吗?
  • 我认为你应该了解 Numpy,它是 Python 中矩阵运算的库。如果你想进入 RNN 或 Python 中任何形式的神经网络,你需要了解它是如何工作的。 Numpy 在这里有一个很棒的初学者教程:numpy.org/doc/stable/user/quickstart.html