本文仅个人理(nao)解(bu),如有错误,欢迎指正!
论文地址:https://arxiv.org/pdf/1906.06423v3.pdf,该文章被NeurIPS 2019收录。
该文章探究了在深度学习的图像分类任务中,训练及测试图像分辨率对模型的影响。作者给出了自己的结论:a lower train resolution improves the classification at test time!
为了使模型获得较好的性能,训练数据和测试数据在分布上应该是一致的。然而,针对训练数据和测试数据的一些操作,如数据集的制作、训练前的预处理、数据增强等,是不一致的。例如,针对训练集中的图像,研究者可能会先从中随机裁剪一块矩形图像区域,并通过进一步的裁剪、放缩使其符合模型的输入要求。而对于测试集中的图像,往往只是简单的中心裁剪(CenterCrop)。作者认为这会导致训练数据和测试数据在缩放尺度上的不同,从而导致两者数据分布不一,最终影响模型性能。
对于以上的问题,以往研究提出了一些基于更改分辨率的解决思路。例如:
不同于以上工作,作者提出自己的解决方法:应该对训练和测试数据加以联合优化,缩小训练集的分辨率,或者增大测试集的分辨率,从而使它们的数据分布相符合。而对于该联合优化所带来的分布上的变化,辅以网络结构上的微调,可以带来更好的模型性能。
此处探讨前文所述的区别对待训练集和测试集的处理策略,以及具体预处理或增强方式(RandomResizedCrop、CenterCrop)的影响。
RoC是输入图像的一部分,一般为一块矩形图像,一般在数据增强、预处理等过程中从输入图像中取得。注意:RoC图像不一定
然而,前文提到,针对训练集和测试集,有不同的数据增强或预处理策略,因此训练集和测试集的RoC基本不同。例如,对于测试集图像使用中心裁剪,对训练集使用随机裁剪缩放(RandomResizedCrop)后,这两部分的RoC所占原输入图像比例的概率分布情况:
可见训练集数据与测试集数据分布完全不同。
针对训练集的预处理或增强方式:对于原图进行Pytorch自带RandomResizedCrop后,再通过指定的缩放因子s缩放到指定大小Ktrain × Ktrain。
针对测试集的预处理或增强方式:将原图按缩放因子s缩放后再CenterCrop,得到指定大小Ktest × Ktest
测试集中的目标大小,为训练集中的80%。
训练集输入图像分辨率固定为224×224,不同分辨率的测试集图像输入网络后,网络中激活层和池化层的结构也将不同,网络输出结果也会不同,下图展示了不同分辨率的图像输入下,average pooling层输出结果的分布函数:
当测试集图像分辨率从224降为64时,ReLU激活层尺寸(activation map)从7×7变为2×2,这意味着其输出值为0的可能性变高了,输出值在分布上也变得更为稀疏,从而直接影响到池化层的输出。相反,提升测试集图像的分辨率,则输出的分布会相对集中。
同样是保持Ktrain=224,探究不同Ktest对精度的影响,可见当Ktest=288时精度最高。前文作者证明了在默认的预处理或增强下,测试集中的目标大小为训练集的80%,因此将Ktest扩大到原来的1.25倍后(224×1.25=280),训练集和测试集的目标大小将大致相同,这将减少CNN对尺寸不变性的学习(作者前文提到过,CNN对于尺寸的变化是不敏感的,换言之,CNN难以学习到尺寸不变性),从而实现性能的提升。
正如前文所述,对输入图像分辨率的更改的确起到作用,但由于其扭曲了数据的分布,网络可能无法通过数据的“本来面貌”去学习,对此,作者提出以下补偿策略:
右图展示的是对最后一层的批归一化层微调后的结果,可见fine-tune对性能有一定的正向影响。同样,fine-tune令达到最佳性能所需要的测试集分辨率更高了,当训练集分辨率为224时,使用fine-tune使达到最佳精度的测试集分辨率从288增加到384。
至于该实验在ImageNet上达到的各种SOTA性能的阐释,详见论文,这里就不赘述了。