首页 > 解决方案 > 如何将不同形状的卷积层输出池化为固定形状以传递给全连接层

问题描述

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

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

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

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

标签: pythontensorflowmachine-learningcomputer-visionconvolutional-neural-network

解决方案


如果您的输入在示例中是一致的(即 if 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))

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


推荐阅读