前言
1x1卷积核在近几年应用广泛。比如残差网络Resnet,Googlenet的Inception块,都有1x1卷积核的身影,下面笔者讲述下自己对1x1卷积核的理解
1x1卷积核简介
大家可能常见的都是3x3, 5x5等卷积核
而且在数字图像处理应用上,经常会有一些设计好的卷积核来去进行边缘检测
而1x1卷积核并没有这种作用
它的长宽度均为1,这也使他作用范围是在通道维数上面
实际上,它的作用跟全连接层类似,传统的全连接层需要展平才能进行权重训练。而1x1卷积核实际上是以一种高维的方式,将各个通道以一定的权重进行叠加,通道维数是1x1卷积核的特征维,最后输出。
主要应用
降维
近几年各大论文使用全连接层在逐渐减少,原因主要也是训练时间长,容易产生过拟合,论文常常将1x1卷积块与其他卷积块,批量归一化块等结合成一个独立的模块。通过控制1x1卷积核的输出数来控制输出特征,以保证在不使用太多全连接层,池化层下达到降维的目的,同时这也能让网络更深,这也可能导致梯度爆炸等问题,解决方法可以参考我之前写的关于Resnet博文
我一开始也不是很明白为什么1x1卷积核能进行降维,接下来我们可以看一幅图片,该图片来自动手学深度学习
左边是输入通道为3,中间则是一个输出通道为2的卷积核,注意这里很容易搞混,大家可能看到这个卷积核以为是3通道的,它其实是每个通道的3个1x1卷积核与输入中的三个通道分别卷积,最后得到结果进行相加,从而形成单独的一个输出通道,每个输出通道为3x3
所以总的输出通道为2
这就起到了降维的效果。
这是一个Resnet中的一个残差块,我们一开始输入通道是256维,先经过64个1x1卷积核降维至64,然后再经过64个3x3卷积块进行卷积,最后要与输入的256维相加,所以我们需要与256个1x1卷积块进行卷积,将维数恢复至256
非线性变换
在NiN网络中,作者连续用了两个1x1卷积核的方式串联一个模块
而实际上,在每一次1x1卷积后,都要进行一次激活函数,常用的就是relu
至于为什么要连续用两个1x1卷积块我暂时还不是很明白,但看了他人的文章我猜测是以下几点
第一个1x1卷积层是对输入进行降维,后续的relu是对其做一个非线性变换
第二个1x1卷积层能适当增加一定参数空间,它将第一个1x1卷积后得到的特征图作为输入,并且对各个通道进行非线性叠加
这一定程度上避免了全连接层单一的权重调整
猜想
我在论坛上看到有人在讨论1x1卷积核的个数是否是一种超参数
有人也进行对比,确实是增加1x1卷积核层数会一定程度上提高准确率
这也会增加模型复杂度
毕竟深度神经网络我们人类是难以解释它为什么这样去调整参数
所以我觉得这个1x1卷积核还有很多未发现的作用值得我们去探索