用于多对一图像模型的 ConvLSTM 的整形数据

数据挖掘 喀拉斯 lstm rnn 卷积神经网络
2022-02-28 00:58:43

最终,我试图获得图像序列的二进制分割掩码。

我有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 以我想要的方式管理这些图像序列的理解有点卡住了。我如何能够将多个图像(相当长的序列)转换为一个图像模型来工作。我可以简单地为每个序列片段复制输出图像,以便进行尺寸匹配,但这不是我要解决的问题,因为分割图像是整个序列的摘要,而不是序列片段的摘要。

1个回答

问题在于我使用的每个 ConvLSTM 层,keep_dims = True这意味着输入中的维数反映在输出中。要获得多对一模型,我只需要设置keep_dims = False. 然后我能够使用密集层和卷积来操纵输出的大小。通过这种方式,我可以将视频序列作为输入,将单个 2D 图像作为输出,并且能够获得以下关系:

输入形状:(10, 50, 256, 400, 1) 输出形状:(10, 256, 400, 1)

我能够为视频序列中的每个片段进行 2D 分割。

这并不完全是我所需要的,但比为视频序列中的每一帧获得分割结果要好得多。