我注意到,机器学习中许多关于卷积神经网络(CNN)的初学者示例都使用了MNIST数据集。这些图像的尺寸均为28×28,因此我们事先就知道输入的形状。如果输入图像尺寸可变,例如有些图像是56×56,有些是28×28,应该如何处理呢?
如果可能的话,我希望得到一个不依赖于特定语言和框架的答案,或者最好是用TensorFlow的术语来解释。
回答:
在某些情况下,适当调整图像尺寸(例如保持纵横比)就足够了。但是,这可能会引入失真,如果这种失真是有害的,另一种解决方案是使用空间金字塔池化(SPP)。不同图像尺寸的问题在于它会产生不同尺寸的层,例如,取某个网络的第n
层的特征,你可能会得到一个尺寸为128*fw*fh
的特征图,其中fw
和fh
根据输入示例的尺寸而变化。SPP通过将这种可变尺寸的特征图转化为固定长度的特征向量来缓解这个问题。它在不同尺度上操作,通过将图像分成大小相等的块,并对这些块进行最大池化。我认为这篇论文对其解释得非常好。一个示例应用可以在这里看到这里。
简单来说,假设你有一个尺寸为k*fw*fh
的特征图。你可以将其视为k
个形式为
X YZ T
的图,其中每个块的尺寸为fw/2*fh/2
。现在,对每个块分别进行最大池化,你将得到一个尺寸为4
的向量,因此,你可以大致将k*fw*fh
的图描述为一个尺寸为k*4
的固定尺寸特征向量。
现在,将这个固定尺寸的向量称为w
并将其放在一边,这次,将k*fw*fh
的特征图视为k
个形式为
A B C D E F G H I J K L M N O P
的特征平面,再次对每个块分别进行最大池化。这样,你获得了一个更细粒度的表示,作为一个长度为v=k*16
的向量。
现在,将两个向量u=[v;w]
连接起来,你就得到了一个固定尺寸的表示。这正是2尺度SPP所做的(当然,你可以更改分割的数量/尺寸)。
希望这对你有帮助。