Keras 中的图像序列处理 ConvLSTM 与 LSTM 架构
Image sequence processing ConvLSTM vs LSTM architecture in Keras
我需要训练基于序列的 10x10 图像分割。以下是我想使用的 lstm 和 convlstm 模型:
def lstmModel():
# Model definition
model = Sequential()
model.add(LSTM(50, batch_input_shape=(1, None, inp.shape[1]*inp.shape[2]), return_sequences=True, stateful=True))
model.add(Dense(out.shape[1]*out.shape[2], activation='softmax'))
model.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy'])
model.summary()
return model
def convlstmModel():
# Model definition
model = Sequential()
model.add(ConvLSTM2D(12, kernel_size=5, padding = "same", batch_input_shape=(1, None, inp.shape[1], inp.shape[2], 1), return_sequences=True, stateful=True))
model.add(Conv2D(20, 3, padding='same', activation='softmax'))
model.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy'])
model.summary()
return model
我训练了 10 个随机 10x10 图像序列的模型。 LSTM 模型似乎对我来说工作正常,但 ConvLSTM 模型显示 Conv2D 层的维度不匹配:
ValueError: Input 0 is incompatible with layer conv2d_1: expected ndim=4, found ndim=5
非常感谢任何帮助。谢谢!
错误消息暗示您的输入数据将以 5 个维度而不是 4 个维度进入 conv2d 层。模型应该接收形状类似于
的输入
(samples, time, rows, cols, channels)
鉴于您使用的是最后一个通道后端 (tensorflow)。然后,(time,rows,cols,channels)
的每一个切片都通过conv2d层一个接一个地发送。但是,错误消息暗示传递的维度是 5 而不是预期的 4。请验证输入数据的形状,必要时可以修改答案。
LSTM
层适用于 "time sequences"。
Conv
层适用于 "still images"。
一个需要像 (batch, steps, features)
这样的形状
另一个要求:(batch, witdh, height, features)
现在,ConvLSTM2D
将两者混合并需要 (batch, steps, width, height, features)
离开 ConvLSTM2D
时,您有一个 Conv2D
不支持的额外 steps
维度。
如果要保留此维度,请使用带有 TimeDistributed
包装器的卷积:
model.add(TimeDistributed(Conv2D(...))
请注意,与只有 3 个维度的其他模型相比,您仍将拥有所有 5 个维度。
您应该使用某种整形或其他操作使其适合您的训练数据。
由于您的问题没有说明任何问题,我们目前只能回答这些问题。
我需要训练基于序列的 10x10 图像分割。以下是我想使用的 lstm 和 convlstm 模型:
def lstmModel():
# Model definition
model = Sequential()
model.add(LSTM(50, batch_input_shape=(1, None, inp.shape[1]*inp.shape[2]), return_sequences=True, stateful=True))
model.add(Dense(out.shape[1]*out.shape[2], activation='softmax'))
model.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy'])
model.summary()
return model
def convlstmModel():
# Model definition
model = Sequential()
model.add(ConvLSTM2D(12, kernel_size=5, padding = "same", batch_input_shape=(1, None, inp.shape[1], inp.shape[2], 1), return_sequences=True, stateful=True))
model.add(Conv2D(20, 3, padding='same', activation='softmax'))
model.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy'])
model.summary()
return model
我训练了 10 个随机 10x10 图像序列的模型。 LSTM 模型似乎对我来说工作正常,但 ConvLSTM 模型显示 Conv2D 层的维度不匹配:
ValueError: Input 0 is incompatible with layer conv2d_1: expected ndim=4, found ndim=5
非常感谢任何帮助。谢谢!
错误消息暗示您的输入数据将以 5 个维度而不是 4 个维度进入 conv2d 层。模型应该接收形状类似于
的输入(samples, time, rows, cols, channels)
鉴于您使用的是最后一个通道后端 (tensorflow)。然后,(time,rows,cols,channels)
的每一个切片都通过conv2d层一个接一个地发送。但是,错误消息暗示传递的维度是 5 而不是预期的 4。请验证输入数据的形状,必要时可以修改答案。
LSTM
层适用于 "time sequences"。
Conv
层适用于 "still images"。
一个需要像 (batch, steps, features)
这样的形状
另一个要求:(batch, witdh, height, features)
现在,ConvLSTM2D
将两者混合并需要 (batch, steps, width, height, features)
离开 ConvLSTM2D
时,您有一个 Conv2D
不支持的额外 steps
维度。
如果要保留此维度,请使用带有 TimeDistributed
包装器的卷积:
model.add(TimeDistributed(Conv2D(...))
请注意,与只有 3 个维度的其他模型相比,您仍将拥有所有 5 个维度。
您应该使用某种整形或其他操作使其适合您的训练数据。
由于您的问题没有说明任何问题,我们目前只能回答这些问题。