我在使用tensorflow 2.3开发NN模型时遇到了问题,当我将BiLSTM层包含到模型中时,问题就出现了。我尝试过一个自定义模型,但这是Keras文档页面中的一个,同样失败。
- 这不可能是输入形状的问题,因为这是在编译时发生的,并且输入数据还没有提供给模型。
- 在另一台机器上试过了,它与相同版本的TensorFlow配合得很好。
我使用的代码是:
from tensorflow import keras
from tensorflow.keras import layers
max_features = 20000 # Only consider the top 20k words
maxlen = 200 # Only consider the first 200 words of each movie review
# Input for variable-length sequences of integers
inputs = keras.Input(shape=(None,), dtype="int32")
# Embed each integer in a 128-dimensional vector
x = layers.Embedding(max_features, 128)(inputs)
# Add 2 bidirectional LSTMs
x = layers.Bidirectional(layers.LSTM(64, return_sequences=True))(x)
x = layers.Bidirectional(layers.LSTM(64))(x)
# Add a classifier
outputs = layers.Dense(1, activation="sigmoid")(x)
model = keras.Model(inputs, outputs)
model.summary()
输出错误为:
InvalidArgumentError: Shape must be at least rank 3 but is rank 2 for '{{node BiasAdd}} = BiasAdd[T=DT_FLOAT, data_format="NCHW"](add, bias)' with input shapes: [?,256], [256].
During handling of the above exception, another exception occurred:
ValueError Traceback (most recent call last)
<ipython-input-7-dd69b7331e68> in <module>
7 x = layers.Embedding(max_features, 128)(inputs)
8 # Add 2 bidirectional LSTMs
----> 9 x = layers.Bidirectional(layers.LSTM(64, return_sequences=True))(x)
10 x = layers.Bidirectional(layers.LSTM(64))(x)
11 # Add a classifier
1条答案
按热度按时间gmxoilav1#
我发现了问题,所以我在回答我自己的问题。
Keras中有一个设置,指定了处理(并假设仅影响)图像数据的方式。
*通道最后。图像数据以三维数组表示,其中最后一个通道表示颜色通道,例如[行][列][通道]。
*通道优先。图像数据以三维数组表示,其中第一个通道表示颜色通道,例如[通道][行][列]。
Keras为不同的后端保留了不同的设置,这是supossedly为Tensorflow设置为Channels Last,但在我的环境中,它看起来像是设置为Channels First。
值得庆幸的是,这可以手动设置,我设法修复它:
在上面的示例(直接来自Keras文档)中,它看起来如下所示:
我很惊讶这个设置会使LSTM无法示例化,并且不确定这是否应该被认为是一个bug。
More info on this topic