如何使用 Tensorflow2.0 alpha 堆叠卷积层和 LSTM?

Posted

技术标签:

【中文标题】如何使用 Tensorflow2.0 alpha 堆叠卷积层和 LSTM?【英文标题】:How to stack Convolutional Layer and LSTM using Tensorflow2.0 alpha? 【发布时间】:2019-09-08 19:11:15 【问题描述】:

我正在尝试为 NLP 任务实现一个神经网络,其中包含一个卷积层,后跟一个 LSTM 层。我目前正在尝试使用新的 Tensorflow 2.0 来做到这一点。但是,在构建模型时,我遇到了一个我无法理解的错误。

# Input shape of training and validation set
(1000, 1, 512), (500, 1, 512)

模型

model = keras.Sequential()
model.add(keras.layers.InputLayer(input_shape=(None, 512)))
model.add(keras.layers.Conv1D(128, 1, activation="relu"))
model.add(keras.layers.MaxPooling1D((2)))
model.add(keras.layers.LSTM(64, activation="tanh"))
model.add(keras.layers.Dense(6))
model.add(keras.layers.Activation("softmax"))

错误

InvalidArgumentError: Tried to stack elements of an empty list with non-fully-defined element_shape: [?,64]
 [[node unified_lstm_16/TensorArrayV2Stack/TensorListStack]] [Op:__inference_keras_scratch_graph_26641]

起初,我尝试检查在使用LSTM 层实现Conv1D 层时是否存在任何问题。我找到了this post,这表明我重新塑造了卷积层和lstm层之间的层。但这仍然不起作用,我得到了一个不同的错误。 This post 看起来很相似,但它没有使用 Tensorflow 2.0 并且到目前为止没有回答。我还发现这篇文章具有堆叠卷积层和 lstm 层的相同意图。但它使用Conv2D 而不是Conv1D。 This post 还建议使用名为Reshape 的内置层对卷积层的输出进行重构。然而,我仍然遇到同样的错误。

我还尝试在 LSTM 层中指定input_shape

model = keras.Sequential()
model.add(keras.layers.InputLayer(input_shape=(None, 512)))
model.add(keras.layers.Conv1D(128, 1, activation="relu"))
model.add(keras.layers.MaxPooling1D((2)))
model.add(keras.layers.LSTM(64, activation="tanh", input_shape=(None, 64)))
model.add(keras.layers.Dense(6))
model.add(keras.layers.Activation("softmax"))

我最后还是遇到了同样的错误。

我不确定我是否了解如何堆叠一维卷积层和 lstm 层。我知道 TF2.0 仍然是 Alpha,但有人能指出我缺少什么吗?提前致谢

【问题讨论】:

如果您在第一种情况下打印model.summary,您会在输入形状中得到 [None, None, 512] 吗? 可能是维度问题。正如@Sharky 建议的那样,您可以将model.summary 添加到您的问题中。 【参考方案1】:

问题是维度问题。你的特征是形状[..., 1, 512];因此,MaxPooling1Dpooling_size 2 大于 1 会导致问题。

添加padding="same" 即可解决问题。

model = tf.keras.Sequential()
model.add(tf.keras.layers.InputLayer(input_shape=(None, 512)))
model.add(tf.keras.layers.Conv1D(128, 1, activation="relu"))
model.add(tf.keras.layers.MaxPooling1D(2, padding="same"))

model.add(tf.keras.layers.LSTM(64, activation="tanh"))
model.add(tf.keras.layers.Flatten())
model.add(tf.keras.layers.Dense(6))
model.add(tf.keras.layers.Activation("softmax"))

【讨论】:

是的!这样就解决了,非常感谢!填充解决它的任何原因? 很高兴看到它有帮助:)。查看我的更新答案【参考方案2】:

padding="same" 应该可以解决您的问题。

更改以下行:

model.add(tf.keras.layers.MaxPooling1D(2, padding="same"))

【讨论】:

你的答案和我的有什么区别?

以上是关于如何使用 Tensorflow2.0 alpha 堆叠卷积层和 LSTM?的主要内容,如果未能解决你的问题,请参考以下文章

如何在tensorflow2.0的keras模型中使用tf.train.ExponentialMovingAverage

使用Tensorflow2.0执行视觉显著性检测(Visual Saliency Detection)

人工智能深度学习:如何使用TensorFlow2.0实现文本分类?

人工智能深度学习:如何使用TensorFlow2.0实现文本分类?

在基础 Tensorflow 2.0 中运行简单回归

谷歌重磅发布TensorFlow 2.0正式版,高度集成Keras,大量性能改进