【问题标题】:how to pool different shaped convolutional layer outputs to a fixed shape to pass for Fully connected layer如何将不同形状的卷积层输出池化为固定形状以传递给全连接层
【发布时间】:2018-11-21 09:35:24
【问题描述】:

我有不同大小的输入图像,我将它们通过 CNN 中的 Conv 层传递,之后我应该将 Conv 输出连接到全连接层以进行分类。

由于必须对过程进行矢量化,因此输出必须具有相同的形状,以便可以将一批图像用于前向传递。因此,在全连接层的输入处,所有图像都具有相同形状的问题。

但是由于我的输入图像具有不同的形状,我的最终 Conv 层会给出不同形状的输出,我如何将来自 Last Conv 层的不同形状的输出合并/重塑为固定形状,以便它们可以连接到直接的 FCN 层?

另外,我考虑过在处理之前将图像重新整形为固定大小,但由于我的输入图像变化很大,因此存在性能[准确性]问题[所以,试试这个]。

【问题讨论】:

    标签: python tensorflow machine-learning computer-vision convolutional-neural-network


    【解决方案1】:

    如果您的输入在示例中是一致的(即如果inputs = image1, image2,那么您所有的image1s 大小相同,所有image2s 大小相同,但image1.shape 不一定相同作为image2,您可以在传递到密集层之前将最终的conv输出展平并连接结果。

    conv1_out = conv_network1(image1)
    conv2_out = conv_network2(image2)              # could be same network
    flat1 = tf.layers.flatten(conv1_out)
    flat2 = tf.layers.flatten(conv2_out)
    dense_in = tf.concat((flat1, flat2), axis=1)
    dense_out = tf.layers.dense(dense_in, units)
    

    或者,如果您的图像在批次间大小不同,如果您有大量空间特征,则空间池是另一种流行的选择。

    flat1 = tf.reduce_mean(conv1_out, axis=(1, 2))
    flat2 = tf.reduce_mean(conv2_out, axis=(1, 2))
    

    您也可以使用最大池化,但行为略有不同。

    【讨论】:

    • 感谢您的回复,我的整个数据集中有不同形状的图像,没有任何两个图像可能具有相同的形状(高度 * 宽度),因此在批次之间或批次内保持一致也不是可能。
    • 在这种情况下,空间池化或调整大小(插值或填充/裁剪)是您唯一的选择。您至少需要在批次中保持大小一致。虽然您可以假设批量大小为 1 来解决此问题,但我建议您不要这样做。如果可能/合理,将输入的大小调整为统一的形状可能是最好的。如果您正在进行空间池化,空间信息的差异可能不会对此产生太大影响(因为无论如何您在池化时都会将其全部扔掉)。
    猜你喜欢
    • 2017-10-06
    • 1970-01-01
    • 1970-01-01
    • 2021-04-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-31
    相关资源
    最近更新 更多