如何使用 Tensorflow2.0 alpha 堆叠卷积层和 LSTM?
How to stack Convolutional Layer and LSTM using Tensorflow2.0 alpha?
我正在尝试为 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, that suggested so that I reshaped the layer between the convolutional layer and lstm layer. But that still did not work and I got a different error instead. This post seems similar but it does not use Tensorflow 2.0 and not answer so far. I also found this post that has the same intention of stacking a convolutional and lstm layers. But it uses Conv2D
instead of Conv1D
. 还建议使用重塑卷积层的输出和一个名为 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,但有人能指出我遗漏了什么吗?提前致谢
问题是维度问题。你的特征是 [..., 1, 512]
的形状;因此,MaxPooling1D
pooling_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"))
padding="same" 应该可以解决您的问题。
更改以下行:
model.add(tf.keras.layers.MaxPooling1D(2, padding="same"))
我正在尝试为 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, that suggested so that I reshaped the layer between the convolutional layer and lstm layer. But that still did not work and I got a different error instead. This post seems similar but it does not use Tensorflow 2.0 and not answer so far. I also found this post that has the same intention of stacking a convolutional and lstm layers. But it uses Conv2D
instead of Conv1D
. 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,但有人能指出我遗漏了什么吗?提前致谢
问题是维度问题。你的特征是 [..., 1, 512]
的形状;因此,MaxPooling1D
pooling_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"))
padding="same" 应该可以解决您的问题。
更改以下行:
model.add(tf.keras.layers.MaxPooling1D(2, padding="same"))