4

我正在尝试为 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]

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

我还尝试input_shape在 LSTM 层中指定 。

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,但有人能指出我缺少什么吗?提前致谢

4

2 回答 2

4

问题是维度问题。你的特征是形状[..., 1, 512]; 因此,MaxPooling1D pooling_size2 大于 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"))
于 2019-04-18T16:35:23.273 回答
3

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

更改以下行:

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

于 2019-04-18T16:38:59.993 回答