【问题标题】:How to add Conv2D layers with LSTM in Keras?如何在 Keras 中使用 LSTM 添加 Conv2D 层?
【发布时间】:2019-05-24 13:33:08
【问题描述】:

我正在尝试识别图像序列。我有 2 张图片,我需要识别第三张。都是彩色图片。

我遇到以下错误:

ValueError:检查输入时出错:预期 time_distributed_1_input 有 5 个维度,但是得到了数组 形状 (32, 128, 128, 6)

这是我的图层:

batch_size = 32
height = 128
width = 128
model = Sequential()
model.add(TimeDistributed(Conv2D(32, (3, 3), activation = 'relu'), input_shape=(batch_size, height, width, 2 * 3)))
model.add(TimeDistributed(MaxPooling2D(2, 2)))
model.add(TimeDistributed(BatchNormalization()))
model.add(TimeDistributed(Conv2D(32, (3, 3), activation='relu', padding='same')))
model.add(Dropout(0.3))
model.add(Flatten())
model.add(LSTM(256, return_sequences=True, dropout=0.5))
model.add(Conv2D(3, (3, 3), activation='relu', padding='same'))
model.compile(optimizer='adam')
model.summary()

我的输入图像形状是: (128, 128, 2*3) [因为我正在连接 2 个输入图像]

我的输出图像形状是: (128, 128, 3)

【问题讨论】:

    标签: python keras conv-neural-network lstm


    【解决方案1】:

    您在Flatten() 之后应用了conv 层。这会导致错误,因为在展平后流经网络的数据不再是 2D 对象。

    我建议您将卷积和循环阶段分开。首先,您将卷积应用于图像,训练模型以提取其相关特征。稍后,您将这些特征推送到 LSTM 层中,这样您还可以捕获隐藏在它们序列中的信息。

    希望这会有所帮助,否则请告诉我。

    --

    编辑

    根据您得到的错误,您似乎也没有提供确切的输入形状。 Keras 说:“我需要 5 个维度,但你给了我 4 个”。 TimeDistributed() 层需要一个形状,例如:(sample, time, width, length, channel)。显然,您的输入缺少time

    我建议你在运行之前打印你的model.summary(),并检查名为time_distributed_1_input的层。那是你的编译器不满意的那个。

    【讨论】:

    • 能否提供一个上面代码的例子。
    • 我不知道你的数据集,或者你对神经网络架构的偏好。您应该选择一些层序列,例如:[ conv & maxpool; LSTM; Dense + dropout ]。那只是一个提示。我指出你不能在Flatten() 之后放置Conv2D() 层。这肯定会返回错误。
    • input_images = np.zeros((batch_size, config.width, config.height, 3 * 2)) output_images = np.zeros((batch_size, config.width, config.height, 3)) 这是我的输入尺寸。
    • 您的input_images 有四个维度。当您使用TimeDistributed 层时,您还必须包含第五个维度:“时间”。实际上,您的错误消息说:“我希望您的时间分布对象有 5 个维度,但我只有 4 个”。你可以阅读更多关于herehere的信息。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-06-07
    • 2019-09-05
    • 2018-05-08
    • 2019-08-21
    • 2019-11-06
    • 2019-05-22
    • 2017-07-31
    相关资源
    最近更新 更多