TF2 Keras (1): 用序列(Sequence )创建模型

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了TF2 Keras (1): 用序列(Sequence )创建模型相关的知识,希望对你有一定的参考价值。

参考技术A

本文是对 官方文档 的学习笔记。

Keras 支持2种定义Model 的方式 Sequence 和 Functional API 这篇文章主要讨论Sequence 模式。 Sequence 的优点是简单,用一个简单的数组就可以定义一个Model。虽然方便, 但是 Sequence 也有其缺点

对于已经build 好的model ,可以通过 add, pop函数对layer 进行添加、删除。

add

pop

summary()可以打印整个Model 的结构, 进行调试

每一层的输出都可以单独提取出来。

2种常见的迁移学习的方式

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

【中文标题】运行 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 指南

【讨论】:

以上是关于TF2 Keras (1): 用序列(Sequence )创建模型的主要内容,如果未能解决你的问题,请参考以下文章

使用 [:, :, 0] 的 TF2 / Keras 切片张量

tf2.0 Keras:使用 RNN 的自定义张量流代码时无法保存权重

TensorFlow 和 Keras 入门:过去 (TF1) 现在 (TF2)

使用 dropout (TF2.0) 时,可变批量大小不适用于 tf.keras.layers.RNN?

在 TF2/Keras 中正确实现 Autoencoder MSE 损失函数

将 tensorflow 1 contrib 转换为 tensorflow 2 Keras 版本