【CS231N笔记】P9:卷积神经网络的工程实践技巧

子豪兄YYDS
https://www.bilibili.com/video/BV1K7411W7So?p=9

一、卷积核的代替

在使用卷积神经网络时,卷积核大小的选择一般也会带来不一样的影响,但是卷积核大小之间实际上是可以相互转换的。
在这里插入图片描述
从这张图来看,原始的图是绿色的部分,这部分经过边缘的补充,卷积后得到了中间的红色的特征图,特征图经过第二次卷积得到了第三张图中的一个值,相当于经过两次的3×3卷积,得到了最后一张图中中间红色的值,这时这个红色格子在原始图的感受野就是5×5的大小,而这时中间的第一次卷积就仅仅相当于一个中间过程,在这种观点下,从第一张图到第三张图的过程可以看作是一个5×5卷积,也就是说两次的3×3卷积可以和一次5×5卷积转换。
在这里插入图片描述
实际上,将5×5卷积转换为两次3×3卷积,不仅可以减少未知参数的数目,而且由于增加了一层,还带来了非线性的增多,也就是又可以增加一个非线性的激活函数的嵌套。

假设有c个7×7的c通道卷积核,那么参数量就是7×7×c×c=49c2,利用前面的小卷积核替换大卷积核的方法,用三层3×3的c通道卷积核去替代,那么参数量就变成了3×3×c×c×3=27c2,明显看出参数减少了,所以在后面的参数更新时计算量也会变少。
再看计算次数,对于原始的c个7×7的c通道卷积核,假设最终得到的特征图的大小为H×W,那么乘法的计算量为(H×W×C)×(7×7×C)=49HWC2,而更换为三层3×3卷积之后,乘法的运算量变为3×(H×W×C)×(3×3×C)=27HWC2,所以计算量实际也变小了。

同样大的感受野,但是通过小卷积核替换大卷积核的方法,我们实现了更小的参数量和更小的计算量,同时更多的层数也带来了更多的非线性变换,从而大大提高了模型的表示能力。

在这里插入图片描述
降低参数量还可以使用前面提到过的1×1卷积。此外,卷积核拆的大小不一定是正方形,也可以拆成长方形。
在这里插入图片描述

二、卷积的高效计算

这一部分主要是想实现将卷积运算转换为矩阵乘法,对于矩阵,已经有很多现成的算法用于矩阵运算的加速,但是对于卷积运算缺没有,也就是说,只要我们能实现卷积到矩阵的转换,就可以提高卷积的运算效率。

卷积转换为矩阵运算的一种算法是im2col算法,简称我太帅了。这个算法本质上是把原本的卷积运算展开。
在这里插入图片描述
中间粉色的部分是一个特征图,将特征图的一个感受野拉长成一个列向量,这样重复,最后特征图会变成许多个列向量,这些列向量必然会存在大量重复的元素,因为感受野本身就是有重复元素的,这样拉长之后列向量没做处理,必然还是重复的。之后将卷积核拉成行向量并排列,凑成矩阵乘法的形式之后就相当于完成了卷积运算到矩阵乘法的转换。从结果来看,一行的每个元素都是卷积核矩阵同一行的运算结果,所以结果矩阵的一行表示的就是一个卷积核在特征图上运算后得到的结果拉平成的行向量。可以看出,这个过程实际上就是把卷积核的运算过程换了一个矩阵乘法的写法,原特征图中每个感受野在卷积运算中都需要和卷积核运算,而这个运算就是一个相乘求和,那么完全可以写成两个向量相乘的形式,那么将所有运算都换成向量运算,再拼成一个矩阵运算,就得到了卷积运算的矩阵乘法形式。
在这里插入图片描述
上面的图展示了一个具体的转化过程,可以看见其实转换的过程并不难,就是单纯的将感受野拉平成列向量。

对于多通道的图像,在转换时同样是拉平,只不过是分开操作,也就是说对原图像的每个通道都拉成列向量,同时将卷积核的每个通道也拉长成列向量,最后对每个通道进行计算,求和就是最后的结果。对于下面这张图,三通道的卷积运算最后转换为矩阵运算,首先卷积核和原图都根据通道拆分为三个矩阵。
在这里插入图片描述
之后每个通道都做一次矩阵乘法,最终得到的三个矩阵乘法的结果相加,得到的就是卷积运算的结果。
在这里插入图片描述

如果不采用转换为矩阵的方法,那么按照正常的卷积运算,三通道的卷积核和原图运算,应该是每个通道做一次卷积运算,得到的三个结果叠加,得到一个特征图。再看转换后的运算,其实是一样的,每个通道换成了一个矩阵乘法,结果相加得到的一个矩阵是特征图的拉平后的向量。

所以同样的道理,我们可以得到多个多通道卷积核的运算过程:
在这里插入图片描述
下面总结一下上面的三种情况:转换都是都是每个通道上进行一次矩阵乘法,卷积核矩阵中每一行代表一个卷积核,卷积核矩阵的数目代表通道数,也就是矩阵乘法的次数,这些变化都不会影响原图矩阵,运算后的结果如果称为特征图矩阵,那么特征图矩阵的结果是由每次矩阵乘法的结果对应位置相加得到的,特征图矩阵的每一行都代表一个特征图拉平后的行向量,行数与通道数相等。

另一种算法是FFT,FFT中文翻译为快速傅立叶变换,FFT利用到了卷积理论,即两个函数的卷积等于两个函数傅立叶变换之后逐元素乘积。换到卷积神经网络里面,就是说让原始图像和卷积核都进行一次傅立叶变换,之后再逐元素乘积,得到的结果就是卷积的结果。这里的傅立叶变换我们采用快速傅立叶变换。

采用FFT本质上是用信号的思路去理解卷积。在这里需要先科普一下滤波器的知识,两个时域信号做卷积,那么两个信号的对应的频谱函数要相乘,如果其中一个信号缺少某些频率的分量,那么相乘之后得到的结果对应位置是0,相当于过滤掉了,因此称为滤波器。举个例子一个低音歌唱家和高音歌唱家做卷积,低音歌唱家缺少高维而高音歌唱家缺少低维,所以运算时,从高音歌唱家的角度看高音可以通过自己,所以高音歌唱家相当于一个高通滤波器,同理低音歌唱家相当于一个低通滤波器。
对于图像来说,可以看作是一个二维的信号,颜色就可以看作频率,颜色和明暗变化越明显的地方频率越高。
卷积核本质上就是一个二维信号滤波器,利用不同的卷积核处理,就相当于对原图像使用不同的滤波器,低通滤波器会让图像变得模糊,高通滤波器让高频的部分保留,而图片中高频的部分对应的是边界,所以图像会变得锐利,也就是边缘提取。
卷积的本质就是提取图像不同频率的特征。

这种方式对小的卷积核加速效果不大,并且在卷积步长大于1的时候回丢弃部分结果,从而使得计算效率很低。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Ayakanoinu

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值