运行 model.fit() 时的 tf.keras (RNN) 层问题

Posted

技术标签:

【中文标题】运行 model.fit() 时的 tf.keras (RNN) 层问题【英文标题】:tf.keras (RNN) Layer issues when running model.fit() 【发布时间】:2020-06-12 19:48:18 【问题描述】:

我正在构建一个 RNN,以使用 TensorFlow、Pandas 和 Keras 分析动作捕捉 (MoCap) 数据。

关于我的数据:

数据通过pandas.read_csv获取,形状为 (832, 165) 每一行表示移动序列中的一整帧数据(832 帧) 每列表示一个关节的旋转数据(总共 165 个关节)

我正在尝试一次输入一行数据。输出应该是运动序列中的下一帧。在运行model.fit 时,我不断遇到不同类型的错误。

我附上了一系列照片,展示了使模型发挥作用的不同尝试。如果有人可以就它为什么不工作以及如何解决提供一些指导,我将不胜感激。

附带说明,我的代码的每个版本都不同。只要它最终可以工作,我就可以使用 any,所以在提供反馈时,您是否可以确定您正在谈论的是我的代码的哪个版本?

使用tf.data.Dataset 作为输入

Version 1 Code / Output

Version 2 Code / Output

版本 3:[Code][Output]

使用 pandas 数组作为输入和目标

Version 4 Code / Output

Version 5 Code / Output

【问题讨论】:

【参考方案1】:

使用 代码 4 作为故障排除的基础,我注意到您将不兼容的形状传递给图层。

model.add(keras.layers.InputLayer(input_shape = (N_TIMESTEPS, N_FEATURES))) 这一行希望您的数据具有相同的形状。 虽然您的数据有 (832, 165),即第一个索引上的 N_SAMPLESN_FEATURES,但缺少 N_TIMESTEPS

首先,您应该创建一个修改后的数据集,该数据集将生成(N_SAMPLES, N_TIMESTEPS, N_FEATURES) 的形状。

这是一个生成虚拟数据集的示例:

data = tf.random.normal((N_SAMPLES, N_TIMESTEPS, N_FEATURES))
target = tf.random.normal((N_SAMPLES, N_TIMESTEPS, N_FEATURES))

数据中的 N_TIMESTEPS 在 LSTM 中很重要,因为它决定了每次更新要考虑多少 TIME_STEPS。

这是用于在 Google Colab 中模拟成功执行的完整代码。

%tensorflow_version 2.x  # To ensure latest Tensorflow version in Google Colab

import tensorflow as tf
import tensorflow.keras as keras

print(tf.__version__) # Tensorflow 2.2.0-rc3

BATCH_SIZE = 1
N_TIMESTEPS = 10
#Data is obtained through pandas.read_csv and has a shape of (832, 165)
#Each row denotes a whole frame of data in a movement sequence (832 frames)
#Each column denotes the rotational data for a joint (165 joints total)
# N_SAMPLES = data.values.shape[0]
# N_FEATURES = data.values.shape[1]
N_SAMPLES  = 832
N_FEATURES = 165

def get_compiled_model():
  model = keras.Sequential()
  model.add(keras.layers.InputLayer(input_shape = (N_TIMESTEPS, N_FEATURES)))
  model.add(keras.layers.LSTM(35, activation = 'relu', return_sequences = True))
  model.add(keras.layers.LSTM(35, activation = 'relu', return_sequences = True))
  model.add(keras.layers.Dense(165, activation = 'tanh'))

  model.compile(optimizer = 'adam',
                loss = 'mse',
                metrics = ['accuracy'])

  return model

model = get_compiled_model()
model.summary()

data = tf.random.normal((N_SAMPLES, N_TIMESTEPS, N_FEATURES))
target = tf.random.normal((N_SAMPLES, N_TIMESTEPS, N_FEATURES))

model.fit(data, target, epochs = 15, batch_size = BATCH_SIZE, shuffle = False)

希望对你有所帮助。

您可以在link 中阅读更多关于 使用 RNN 的 Tensorflow Keras 指南

【讨论】:

以上是关于运行 model.fit() 时的 tf.keras (RNN) 层问题的主要内容,如果未能解决你的问题,请参考以下文章

Python Tensorflow - 多次运行 model.fit 而不重新实例化模型

如何修改 model.fit 设置?

keras训练完模型,为啥对训练集进行evaluate和训练时的loss完全不一样?白训练了吗?

Model.fit()是否将整个训练数据集上传到GPU?

model.fit(X,y) 和 model.fit(train_X, train_y) 有啥区别

model.predict() 和 model.fit() 做啥?