最终,我试图获得图像序列的二进制分割掩码。
我有n个图像序列,每个序列都有 500 个灰度图像,大小为 256 像素 x 400 像素。这些序列中的每一个都与单个分割掩码或形状为 256 像素 x 400 像素的图像相匹配。这给出了:
input shape : (n, 500, 256, 400, 1)
output shape: (n, 1, 256, 400, 1)
可以理解,正如这篇博文中所解释的,有必要将我的输入数组重塑为序列片段(时间步长),因为 LSTM 更喜欢小于 sequence_length = 400 的序列(我的 GPU 无论如何都无法处理大于 100 的任何东西)。因此,考虑到这一点,我选择了 50 或 50 个时间步长的序列“片段”长度。没有重叠,这会带来单个输入样本的形状:
from: (500, 256, 400, 1)
to : ( 10, 50, 256, 400, 1)
在我看来,使用数据生成器一次通过 ConvLSTM2D 提供一个样本是有意义的,这样可以:
input shape : (10, 50, 256, 400, 1)
output shape: ( 1, 1, 256, 400, 1)
我认为这意味着网络会将 500 张图像与单个输出图像相关联,即。记住 10 个片段序列的状态,每个片段序列有 50 张图像,以便产生单个图像输出,并且仅当网络已经看到所有 500 张图像时才计算损失函数。当我这样做时,它对我来说并不完全有意义,现在我已经证明它更没有意义,因为我收到了以下错误:
ValueError: Input arrays should have the same number of samples as target arrays. Found 10 input samples and 1 target samples.
因此,我对 Keras 的 LSTMS 以及如何让这个 ConvLSTM2D 以我想要的方式管理这些图像序列的理解有点卡住了。我如何能够将多个图像(相当长的序列)转换为一个图像模型来工作。我可以简单地为每个序列片段复制输出图像,以便进行尺寸匹配,但这不是我要解决的问题,因为分割图像是整个序列的摘要,而不是序列片段的摘要。