具有多个图像输入的 Keras + Tensorflow CNN

数据挖掘 喀拉斯 张量流 美国有线电视新闻网
2022-02-18 04:15:04

我有一个 CNN,需要接收 68 张全部为 59x59 像素的图像。CNN 应该在输出层输出 136 个值

我的训练数据具有形状(-1、68、59、59、1)。

我目前的方法是使用连接来加入多个网络,如下所示:

input_layer = [None] * 68
x = [None] * 68
for i in range(68):
    input_layer[i] = tf.keras.layers.Input(shape=training_data.shape[1:][1:])
    x[i] = Conv2D(64, (5,5))(input_layer[i])
    x[i] = LeakyReLU(alpha=0.3)(x[i])
    x[i] = MaxPooling2D(pool_size=(2,2))(x[i])
    x[i] = Model(inputs=input_layer[i], outputs=x[i])

combined = concatenate(x)

但是,这总是会给出错误:

ValueError: A `Concatenate` layer should be called on a list of at least 2 inputs

这种方法是一种合适的方法还是我这样做完全错误?

1个回答

是的,这是错误的,每个(68, 59, 59)输入都应该通过一个模型而不是它们的数组。

  1. 您可以将 68 个图像中的每一个都视为一个通道,为此,您需要将数据轴从to压缩以获得 59x59 的图像,其中 68 个通道对应于,并conv2D中设置,让图层知道通道在第一个维度(默认情况下,它希望它们位于最后一个维度中)。这类似于具有对应于 的 3 个通道的 RGB 图像其余的都是一样的。(-1, 68, 59, 59, 1)(-1, 68, 59, 59)Input((68, 59, 59))data_format='channels_first'Input((59, 59, 3))

  2. 如果 68 张图像是电影中的连续帧,您也可以使用conv3D跨相邻帧提取运动模式;这是由 3D 内核而不是 2D 内核完成的。它需要 (-1, 68, 59, 59, 1)对应的数据形状Input((68, 59, 59, 1))此外,我们应该使用默认值data_format='channels_last',因为现在只有一个通道作为最后一个维度。通常,时间轴放在第三位,即(-1, 59, 59, 68, 1)可以通过移动轴来完成。