如何在Keras python中使用ConvLSTM2D和Conv2D

时间:2018-06-20 22:45:34

标签: python keras lstm keras-layer

我试图在Keras中使用以下模型,其中ConvLSTM2D输出后跟Conv2D,以生成类似分段的输出。输入和输出应该是每个(2*WINDOW_H+1, 2*WINDOW_W+1)大小的时间序列

model = Sequential()
model.add(ConvLSTM2D(3, kernel_size=3, padding = "same", batch_input_shape=(1, None, 2*WINDOW_H+1, 2*WINDOW_W+1, 1), return_sequences=True, stateful=True))
model.add(Conv2D(1, kernel_size=3, padding = "same"))
model.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy'])
model.summary()

但是,这会产生以下错误(添加Conv2D时):

Input 0 is incompatible with layer conv2d_1: expected ndim=4, found ndim=5

任何关于我可能出错的地方的指针都非常感谢。谢谢!

3 个答案:

答案 0 :(得分:1)

我认为您需要做一个时间分布的Conv2D图层,以便尺寸匹配。也许像这样:

model = Sequential()
model.add(ConvLSTM2D(3, kernel_size=3, padding = "same", batch_input_shape=(1, None, 2*WINDOW_H+1, 2*WINDOW_W+1, 1), return_sequences=True, stateful=True))
model.add(TimeDistributed((Conv2D(1, kernel_size=3, padding = "same")))
model.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy'])
model.summary()

答案 1 :(得分:0)

模型中的问题是您尝试将序列用于常规卷积层。 您唯一需要做的就是删除return_sequences=True中的ConvLSTM2D

所以这行:

model.add(ConvLSTM2D(3, kernel_size=3, padding = "same", batch_input_shape=(1, None, 2*WINDOW_H+1, 2*WINDOW_W+1, 1), return_sequences=True, stateful=True))

应该是这样的:

model.add(ConvLSTM2D(3, kernel_size=3, padding = "same", batch_input_shape=(1, None, 2*WINDOW_H+1, 2*WINDOW_W+1, 1), stateful=True))

答案 2 :(得分:0)

ConvLSTM2D之前的Conv2D层中,您使用return_sequence为False。运行该程序后,可以获得结果ndim = 4。