cnn学习之训练和测试数据集处理

最近,在看alexnet,vgg,googlenet的论文时,对于论文中training和testing的时候对于image的处理,做一下总结。(其中有些困惑,可能理解不到位,还望指出)


training

我们知道对于cnn而言,输入的数据大小是必须相同的,而对于imagenet中的数据集而言,大小不一,因此一般先rescale成一个固定大小比如256*256,然后再从这256*256的图片中crop成一个固定大小比如224*224,因此最原始的图片-》rescale-》crop最后变成了统一大小的输入,


但是在rescale的时候,alexnet采用全都rescale成256*256大小,而在vgg中,采用了三种模式,一种是全都rescale成一个大小,一种是rescale成几个固定大小,还有一种是rescale成一个范围[Smin,Smax]的不同大小,实验表明最后一种效果更好,因为,rescale成不同大小后,再crop的时候,能够取得不同粒度不同角度下的这张图片,更加准确。



testing

在testing的时候

alexnet的处理和training一样;


googlenet:

googlenet的处理如下面这段话,意思就是对于一张原始图片采用scale,take,crop,flip等使得变成4*3*6*2=150种crop,对这150个crops分别放入training好的模型中跑,得到的结果取平均值,做为对最初这张原始图片的预测的最终结果。直观上讲,就是你从不同的角度来评判一件事物,最后综合一下,得到一个较为靠谱的结论。

cnn学习之训练和测试数据集处理_第1张图片


vgg:

对于vgg而言,他则是在test的时候先rescale成一个固定大小,或者几个固定大小,然后不进行crop,直接用整张图进行测试,如下面这段话所示,


因为testing的sizetraining的size(比如224*224)不同,因为testing没有经过crop,导致最后一层conv和fc无法匹配原先的参数个数(因为最后一层conv的神经元个数和输入的size有关),因此将fc改成fcn的形式,做一次1*1的卷积,然后经过三个fcn之后得到class(最后分类的类别数)个map,最后对map取平均值,得到class个值,作为softmax的输入,进行最后的预测。

为什么可以取平均值作为输入呢,直观上讲,就是每一个map上的每一个元素,可以看成是testing输入size下,对于crop成training size(224*224)的每一种crop的预测值,也就是说,每一个map上的每一个元素,可以看成每一个crop对于这map所对应的类的可能的预测。最后对这个map取一个平均值。

其实还有一个疑惑点,就是我们知道对于一个cnn模型,输入的size是固定的,而training和testing的size不固定这是怎么整的?本人强行理解就是,将training学得的参数,对于另一个cnn进行初始化设置参数,这个cnn除了最后的fcn,输入,其他架构和training的一模一样。因为参数的数量只和层数,每层的flter的size,channel有关,和输入的size无关,所以可以设置。

当然,在vgg中,作者也采用了googlenet的形式,只不过用了150的crops,然后将这种形式的结果和前文vgg采用的结果取个平均,实验表明,两种方式结合更好。



你可能感兴趣的:(machine,learning,dl,cnn)