ValueError: 层 lstm_5 的输入 0 与层不兼容:预期 ndim=3,发现 ndim=2。收到完整形状:(无,43264)

时间:2021-06-22 11:20:23

标签: python tensorflow keras deep-learning

大家好,我正在尝试使用原始图像作为输入使用 AlexNet + LSTM 制作模型

但是我遇到了这样的错误:

ValueError: Input 0 of layer lstm_5 is incompatible with the layer: expected ndim=3, found ndim=2. Full shape received: (None, 43264)

我的模型代码:

model = tf.keras.models.Sequential([
    # 1st conv
  tf.keras.layers.Conv2D(96, (11,11),strides=(4,4), activation='relu', input_shape=(227, 227, 3)),
  tf.keras.layers.BatchNormalization(),
  tf.keras.layers.MaxPooling2D(2, strides=(2,2)),
    # 2nd conv
  tf.keras.layers.Conv2D(256, (11,11),strides=(1,1), activation='relu',padding="same"),
  tf.keras.layers.BatchNormalization(),
     # 3rd conv
  tf.keras.layers.Conv2D(384, (3,3),strides=(1,1), activation='relu',padding="same"),
  tf.keras.layers.BatchNormalization(),
    # 4th conv
  tf.keras.layers.Conv2D(384, (3,3),strides=(1,1), activation='relu',padding="same"),
  tf.keras.layers.BatchNormalization(),
    # 5th Conv
  tf.keras.layers.Conv2D(256, (3, 3), strides=(1, 1), activation='relu',padding="same"),
  tf.keras.layers.BatchNormalization(),
  tf.keras.layers.MaxPooling2D(2, strides=(2, 2)),
  # To Flatten layer
  tf.keras.layers.Flatten(),
  # LSTM Layer
  tf.keras.layers.LSTM(3),
  # To FC layer 1
  tf.keras.layers.Dense(4096, activation='relu'),
    # add dropout 0.5 ==> tf.keras.layers.Dropout(0.5),
  #To FC layer 2
  tf.keras.layers.Dense(4096, activation='relu'),
    # add dropout 0.5 ==> tf.keras.layers.Dropout(0.5),
  tf.keras.layers.Dense(output_class_units, activation='softmax')
])

但是当我只使用 AlexNet 时,它工作正常,所以我认为问题出在 LSTM 层上,但我仍然不知道如何修复它

对这个有点陌生所以希望有人能帮我解决这个问题

非常感谢!

1 个答案:

答案 0 :(得分:0)

让我们理解错误:

<块引用>

ValueError: 层 lstm_5 的输入 0 与层不兼容: 预期 ndim=3,发现 ndim=2。收到完整形状:(无,43264)

LSTM 需要一个 3D 层:第一个暗淡是 batch_size,第二个暗淡是时间,第三个暗淡您的数据。

tf.keras.layers.Flatten() 的输出是一个 2D 层,其中第一个维度是 batch_size,第二个维度是您的数据。我们这里没有时间维度。

要实现您想要的效果,您应该将您的图层包裹在 TimeDistributed 图层周围。我们有一个例子 here