我试图在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
任何关于我可能出错的地方的指针都非常感谢。谢谢!
答案 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。