python - 如何将不同形状的卷积层输出池化为固定形状以传递给全连接层
问题描述
我有不同大小的输入图像,我将它们传递给 CNN 中的 Conv 层,之后我应该将 Conv 输出连接到全连接层以进行分类。
由于必须对过程进行矢量化,因此输出必须具有相同的形状,以便可以将一批图像用于前向传递。因此,在全连接层的输入处,所有图像都具有相同形状的问题。
但是由于我的输入图像具有不同的形状,我的最终 Conv 层给出了不同形状的输出,我如何将来自 Last Conv 层的不同形状的输出合并/重塑为固定形状,以便它们可以连接到直接的 FCN 层?
此外,我考虑过在处理之前将图像重新整形为固定大小,但由于我的输入图像变化很大,因此存在性能[准确性]问题[所以,试试这个]。
解决方案
如果您的输入在示例中是一致的(即 if inputs = image1, image2
,那么您的所有image1
s 大小相同,所有image2
s 大小相同,但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))
您也可以使用最大池化,尽管行为略有不同。
推荐阅读
- vb.net - vb.net 线程和加载面板
- python - 如何返回一个单词的字母,而不是只返回一个字母?Python
- android - 我的 android 应用程序如何找到从 PC 下载的文件?
- r - 如何解决包含 ifelse 语句的用户自定义函数中“}”中意外的“}”?
- javascript - 使用 if 和 setAttribute 禁用按钮
- javascript - 带有动态数据 vuejs 和 chart.js 的图像
- python - 如何将按钮放在图像顶部?(tkinter)
- json - Powershell - 更新 .JSON
- python - 无法使用自定义序列化程序反序列化自引用外键
- db2 - 如何进行行级锁定以确保 db2 过程中的 select 和 update 语句线程安全?