大家好,我正在尝试使用原始图像作为输入使用 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 层上,但我仍然不知道如何修复它
对这个有点陌生所以希望有人能帮我解决这个问题
非常感谢!
答案 0 :(得分:0)
让我们理解错误:
<块引用>ValueError: 层 lstm_5 的输入 0 与层不兼容: 预期 ndim=3,发现 ndim=2。收到完整形状:(无,43264)
LSTM 需要一个 3D 层:第一个暗淡是 batch_size,第二个暗淡是时间,第三个暗淡您的数据。
tf.keras.layers.Flatten() 的输出是一个 2D 层,其中第一个维度是 batch_size,第二个维度是您的数据。我们这里没有时间维度。
要实现您想要的效果,您应该将您的图层包裹在 TimeDistributed 图层周围。我们有一个例子 here