what
- 先上图
- 首先摆在你面前的是一个6*6有32个信道的张量,我们先看普通的3*3*32的的卷积操作。
普通卷积操作是:每个信道(即每一层矩阵)的元素对位相乘作和(即将3*3的矩阵拿到6*6矩阵的左上角做对位相乘作和操作)得到一个实数,因为有32个信道(即32层厚度),我们会得到32个实数,再把这32个实数求和,我们得到了一步卷积之后的最左上角的一个实数(最终卷积得到的矩阵是4*4,设padding=0,step=1)。而后依次挪动卷积核就可以得到完整的4*4的矩阵了,这是一个卷积核得到的结果,所以所有的卷积核都操作完之后得到的是4*4*filters的张量。
1X1卷积操作是:每个信道(即每一层矩阵)的元素对位相乘不作和(因为1*1的矩阵乘完不用作和就是一个实数)(即将1*1的矩阵拿到6*6矩阵的左上角做对位相乘不作和操作)得到一个实数,因为有32个信道(即32层厚度),我们会得到32个实数,再把这32个实数求和,而后使用非线性激活函数对该实数进行激活,我们得到了一步卷积之后的最左上角的一个实数(最终卷积得到的矩阵是6*6,设padding=0,step=1)。而后依次挪动卷积核就可以得到完整的6*6的矩阵了,这是一个卷积核得到的结果,所以所有的卷积核都操作完之后得到的是6*6*filters的张量。 - 为了让大家能看清楚普通卷积和1X1卷积的区别,我把二者相同操作的部分直接复制粘贴了,可以总结出它们不同的地方就是后者相乘不作和以及得到实数后使用非线性激活函数进行激活。
- 有些人把1X1卷积看做的全连接层,将1X1矩阵每一层的实数(上图中共32层,即32个通道)看做是一个权值,所以就相当于取6*6*32张量中的一个1*1*32的张量共32个元素与32个权值相乘作和得到一个神经元的输出,有几个卷积核,就有几个神经元。之所以能看做全连接层,其实是仰仗了其相乘不作和的一个特点,使得其看上去就像是全连接层,其实并没有什么高深的。有意思的区别是其第二个特征,即得到实数后使用非线性激活函数进行激活,这是它很有意思的一个地方,它人为的对卷积进行的改动,即加入了非线性特征,与其说是1X1卷积的特点,倒不如说是人们给1X1卷积人为增加的一个步骤,至于为什么要加入非线性特征而普通卷积没有这个步骤呢? 对于这个问题刚开始我没找到合理的答案。但后来我从反方面想了一下,倘若不加入非线性特征的话,那1X1卷积就变成了纯粹的对于张量的线性组合操作了,就相当于全连接层后面不接激活函数了,这才是没有意义的操作,这是反神经网络的手法!所以加入非线性特征是十分必要的,否则你这个1X1卷积还不如普通卷积了呢!普通卷积好歹能提取特征,还能减少参数进行训练,你这1X1卷积不加入非线性特征的话纯粹成了线性组合,没有任何意义。所以,必须加入非线性特征才能使得1X1卷积发挥全连接层的作用。
why
- 为什么要专门加入1X1卷积呢?网上的理由或者说加入它的好处大致都差不多,不过我想分两类来说,一类是1X1卷积全连接层带来的好处,另一类是卷积本身带来的好处。
1.1增加非线性特征(1X1卷积特有的全连接层带来的好处)
2.1减少参数,即降维(1X1的话,得益于减少了通道数,这是卷积操作本身带来的好处)
这个的话,我还是举个例子吧:
普通卷积:
参数量为:5*5*192*32=153,600
引入1×1卷积的卷积操作
参数量为:1*1*192*16+5*5*16*32=15,872,有种偷梁换柱的意味。
2.2跨通道信息交互(channal 的变换,这也是卷积操作本身带来的好处,与1X1的卷积核无关)