点击上方“AI算法修炼营”,选择加星标或“置顶”
标题以下,全是干货
背景介绍
在常见的卷积神经网络中,采样几乎无处不在,以前是max_pooling,现在是strided卷积。
以vgg网络为例,里面使用到了相当多的max_pooling
输入侧在左面(下面是有padding的,上面是无padding的),可以看到网络中用到了很多2x2的pooling
同样,在做语义分割或者目标检测的时候,我们用到了相当多的上采样,或者转置卷积
典型的fcn结构,注意红色区分的decovolution
以前,我们在分类网络的最后几层使用fc,后来fc被证明参数量太大泛化性能不好,被global average pooling替代掉了,最早出现在network in network中,
GAP直接把每个通道对应空间特征聚合成一个标量
从此,分类网络的范式变为(Relu已经被隐式带在了onv和deconv里面),
Input-->Conv-->DownSample_x_2-->Conv-->DownSample_x_2-->Conv-->DownSample_x_2-->GAP-->Conv1x1-->Softmax-->Output
而分割网络的范式变为(最近的一些文章也在考虑用upsample+conv_1x1代替deconv),
Input-->Conv-->DownSample_x_2-->Conv-->DownSample_x_2-->Conv-->DownSample_x_2-->Deconv_x_2-->Deconv_x_2-->Deconv_x_2-->Softmax-->Output
这里暂时不考虑任何shortcut。
可是,我们不得不去想,下采样,上采样真的是必须的吗?可不可能去掉呢?
空洞卷积和大卷积核的尝试
一个很自然的想法,下采样只是为了减小计算量和增大感受野,如果没有下采样,要成倍增大感受野,只有两个选择,空洞卷积和大卷积核。所以,第一步,在cifar10的分类上,我尝试去掉了下采样,将卷积改为空洞卷积,并且膨胀率分别递增,模型结构如下所示,
这个网络的卷积结构,注意最后用一个空间范围的全局平均直接拉平为特征向量,最后再跟一个10维的全连接层
这是一个典型的四层的VGG结构,每层卷积的dilation_rate分别为1,2,4,8。在训练了80个epoch后,测试集准确率曲线如下所示 ,
四层VGG网络,卷积的dilation_rate分别是1,2,4,8,可训练参数量25474
最终的准确率达到了76%,相同参数的vgg结构的卷积网络能够达到的准确率基本就在这附近。 从另一种思路出发,为了扩大卷积的感受野,也可以直接增加卷积的kernel_size,与上面对比,保持dilationrate为1不变,同时逐层增大卷积的kernel_size,分别为3,5,7,9,训练80个epoch后得到如下准确率曲线,
四层VGG网络,卷积的kernel_size分别是3,5,7,9,可训练参数量为172930
和之前改变dilation_rate的方式比较,收敛过程很一致,略微震荡一点,但是最终的结果很一致,都在76%上下,这说明影响最终精度的因素只有感受野和每层的通道数。 为了说明下采样在性能方面没有提升,用有下采样的网络对对比。即在不修改其他任何参数的情况下,对原本使用dilation的卷积层使用下采样,stride都设置为2,同样训练80个epoch,收敛结果如下,
四层VGG网络,每层使用stride为2的卷积进行下采样,可训练参数量25474
最终收敛到了73%上下,比上面两个实验低了大约3个点,这说明下采样的信息损失确实不利于CNN的学习。 把三种参数的结果放在一起对比,更能够说明问题,
四层VGG网络的对比结果,除了卷积层参数不同,其他参数均相同
为了严谨性&#x