keras 包含BiLSTM层时Tensorflow模型的形状秩问题

l7mqbcuq  于 2022-11-13  发布在  其他
关注(0)|答案(1)|浏览(148)

我在使用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
gmxoilav

gmxoilav1#

我发现了问题,所以我在回答我自己的问题。
Keras中有一个设置,指定了处理(并假设仅影响)图像数据的方式。

*通道最后。图像数据以三维数组表示,其中最后一个通道表示颜色通道,例如[行][列][通道]。
*通道优先。图像数据以三维数组表示,其中第一个通道表示颜色通道,例如[通道][行][列]。

Keras为不同的后端保留了不同的设置,这是supossedly为Tensorflow设置为Channels Last,但在我的环境中,它看起来像是设置为Channels First。
值得庆幸的是,这可以手动设置,我设法修复它:

tensorflow.keras.backend.set_image_data_format("channels_last")

在上面的示例(直接来自Keras文档)中,它看起来如下所示:

max_features = 20000  # Only consider the top 20k words
maxlen = 200  # Only consider the first 200 words of each movie review

tensorflow.keras.backend.set_image_data_format("channels_last") # <-- THIS FIXES IT

# 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()

我很惊讶这个设置会使LSTM无法示例化,并且不确定这是否应该被认为是一个bug。
More info on this topic

相关问题