参考资料:
CNN中常用的四种卷积详解
1、什么是卷积
卷积是在特征图上进行滑动的矩阵,它的参数是可学习的,然后计算矩阵跟被滑动到的区域内的像素点进行内积计算,再求和。这种 *** 作可以使得卷积学习到局部特征,并且每个被滑动到的区域之间都共享了权重。共享权重 *** 作使得卷积相比全连接网络节省了大量的参数。
2、为什么要引入卷积
① 卷积可以通过共享权重来减少大量的参数量。例如使用全连接层会导致参数量太多,假如输入的尺寸大小为 100010003,即 3 百万个像素点,假如全连接层有 1000 个节点,则总共有 30 亿 1000 个参数。但是换成使用卷积核组数为 100 的 55 的卷积,则仅需 553100 + 100,即 7600 个参数
② 中存在重复的特征,卷积可以通过共享权重的方式更高效率地将这些特征学习出来
③ 固有的空间特征,如果使用全连接层或 RNN 来学习,则会破坏的空间特征,而卷积则可以不破坏的空间特征
3、卷积的计算过程
① 对于有多组的卷积组,每次使用一组卷积组去计算
② 每组卷积组内有输入通道数个卷积核,每个卷积核是参数可学习的二维矩阵
③使用一组内的卷积核同时在输入的每个通道上,分别按指定步长从左到右,从上到下在通道上进行滑动,然后计算二维矩阵跟被滑动到的区域的值进行内积计算,然后再求和。然后将所有通道上求得的值再求和,再加上偏置项。如此即可得到一个二维的输出矩阵,作为输出的一个通道。
④ 逐次使用每组卷积组,按 ③ 中的过程去进行计算,即可得到一个三维的输出矩阵,通道数等于卷积组数。
4、卷积的优点
① 通过共享权重来减少参数量
② 可以学习局部特征,更符合应用于
③ 具有平移不变性,因为卷积通过共享权重和滑动处理,所以即使特征不在同一个位置,也可以被卷积核学习到
5、卷积的缺点
① 学习到的特征受到感受野的影响太大,需要人工设置卷积核的大小
② 对序列输入的提取效果不够好
6、卷积的变种
① 空洞卷积(扩张卷积、膨胀卷积):指的是在正常的卷积核的点之间插入空洞 ,以此在不增加计算量来增大卷积核的感受野。
优点:
a、在不丢失分辨率的情况下增大感受野,对于检测大物体效果更好
b、调整扩张率(卷积点之间的空洞个数)获得多尺度信息
缺点:
a、对于检测小物体效果不好
② 转置卷积(反卷积、逆卷积):转置卷积是相对于卷积的相反 *** 作,例如 33 卷积得到的结果是 1 个值,而转置 *** 作则是将 1 个值变成 33 的大小。不过转置卷积并不能够恢复被卷积前的值,因为卷积是不可逆 *** 作,只能够恢复尺寸。
优点:
a、可以将小尺寸的特征变成大尺寸的特征,实现类似上采样的效果,可以应用于 CNN 可视化、FCN 全卷积网络、GAN 等
缺点:
只能恢复尺寸,不能恢复数值
空间可分离卷积:将一个卷积核分离成两个更小的卷积核,节省参数量
深度可分离卷积:将在每个通道上使用卷积,再将所有的通道卷积结果相加,再使用每组卷积去重复上述过程的步骤拆分成两个步骤。
(1)只改变特征图的大小,但是不改变特征图的通道数。在每个通道上使用卷积,但是不将所有的通道卷积结果相加,而是保持原样。例如输入的是 256 通道,则卷积后的通道数仍然还是跟输入通道数 256 相等。而原本的卷积输出通道数跟组数相等。
(2)只改变特征图的通道数,但不改变特征图的大小。在 (1)的基础上再使用 输出通道数11通道数 进行卷积
深度可分离卷积本质上是卷积核组之间共享了第一阶段卷积核的参数
7、卷积后的特征尺寸计算公式
假设 n 为输入的特征尺寸, f 为卷积核的大小,p 为 padding 的大小,s 为卷积核移动的步长
8、11、33、55、77 的卷积核大小的作用和优缺点,以及相互之间的比较
作用:
① 11 的作用可以用来进行通道数变换,以及在部分情况下替代全连接的作用
② 33 的作用是使用小核来替代大核,从而实现减少参数量的作用
③ 55 的作用是通过使用较大的卷积核,来达到使卷积核有更大的感受野的作用。也可以被用在图像金字塔中。
④ 77 的作用也是通过使用较大的卷积核,来达到使卷积核有更大的感受野的作用。也可以被用在图像金字塔中。
优点:
① 11 跟其他的卷积核可以实现深度可分离卷积来进一步减少参数量
② 55 跟 77 有更大的感受野
9、卷积核的参数量计算
假设卷积核的大小为 k,输入通道数为 in_n,输出通道数为 out_n,则卷积核的参数量为:
out_nin_nkk + out_n
实例:
k = 3
in_n = 4
out_n = 5
conv2d = nnConv2d(in_n, out_n, k)
print(conv2dweightshape)
print(conv2dbiasshape)
输出:
torchSize([5, 4, 3, 3])
torchSize([5])
故参数总量为:5433 + 5
10、pytorch 中的 Conv2d 函数的作用和参数详解
参考资料:
PyTorch学习笔记(9)——nnConv2d和其中的padding策略
class torchnnConv2d(in_channels, out_channels, kernel_size, stride=1, padding=0, dilation=1, groups=1, bias=True)
函数作用 :对由多个平面组成的输入进行二维卷积。
输入:维度 [B, C_in, H, W]
输出:维度 [B, C_out, H_out, W_out]
参数详解
in_channels(int):输入通道数
out_channels(int):输出通道数
kernel_size([int, tuple(int, int)]):卷积核大小,当输入为 3 时,则卷积核的大小为 [3, 3],当输入为 (3, 4) 时,则卷积核的大小为 [3, 4] ,即第一个数值代表卷积核的高,第二个数值代表卷积核的宽。
如果考虑 dilation 参数,则实际的卷积核感受野大小为:(dilation - 1) (kernel_size - 1) + kernel_size,即当 dilation=2 时,33 的卷积核的实际感受野为 55
stride([int, tuple], 可选)=1: 卷积核的移动步长
padding([int, tuple(int, int)], 可选)=0: 填充的长度,当输入为 0 时,则不进行填充。当输入为 1 时,则输入的每一条边都填充 1 层 0 值,即上下左右各填充 1 层 0 值。如果输入为 (1, 2) 时,则表示上下各填充 1 层 0 值,而左右则各填充 2 层 0 值。但是不能输入 (1, 2, 3, 4) 四个元素的 tuple
dilation(int)=1:卷积核元素之间的间距。当输入为 2 时,卷积核元素之间的空洞个数为 1。
groups=1:
bias=True:
例子:
在七月初七情人节,牛郎织女相见的一天,我终于学习了CNN(来自CS231n),感觉感触良多,所以赶快记下来,别忘了,最后祝大家情人节快乐5555555正题开始!
CNN一共有卷积层(CONV)、ReLU层(ReLU)、池化层(Pooling)、全连接层(FC(Full Connection))下面是各个层的详细解释。
卷积,尤其是图像的卷积,需要一个滤波器,用滤波器对整个图像进行遍历,我们假设有一个32323的原始图像A,滤波器的尺寸为553,用w表示,滤波器中的数据就是CNN的参数的一部分,那么在使用滤波器w对A进行滤波的话,可以用下面的式子表示:
其中x为原始图像的553的一部分,b是偏置项置为1。在对A进行滤波之后,产生的是一个28281的数据。那么假设我们存在6个滤波器,这六个滤波器之间彼此是独立的,也就是他们内部的数据是不同的且没有相关性的。可以理解为一个滤波器查找整幅图像的垂直边缘,一个查找水平边缘,一个查找红色,一个查找黑色这样。那么我就可以产生6个28281的数据,将它们组合到一起就可以产生28286的数据,这就是卷积层主要做的工作。
CNN可以看作一系列的卷积层和ReLU层对原始数据结构进行处理的神经网络,处理的过程可以用下面这幅图表示
特别要注意的是滤波器的深度一定要与上一层传来的数据的深度相同,就像上图的第二个卷积层在处理传来的28286的数据时要使用556的滤波器
滤波器在图像上不断移动对图像滤波,自然存在步长的问题,在上面我们举的例子都是步长为1的情况,如果步长为3的话,32323的图像经过553的滤波器卷积得到的大小是(32-5)/3+1=10, 注:步长不能为2因为(32-5)/2+1=145是小数。
所以当图像大小是N,滤波器尺寸为F时,步长S,那么卷积后大小为(N-F)/S+1
我们从上面的图中可以看到图像的长和宽在逐渐的减小,在经过超过5层之后极可能只剩下11的空间尺度,这样是十分不好的,而且也不利于我们接下来的计算,所以我们想让卷积层处理完之后图像在空间尺度上大小不变,所以我们引入了pad the border的 *** 作。pad其实就是在图像周围补0,扩大图像的尺寸,使得卷积后图像大小不变。在CNN中,主要存在4个超参数,滤波器个数K,滤波器大小F,pad大小P和步长S,其中P是整数,当P=1时,对原始数据的 *** 作如图所示:
那么在pad *** 作后卷积后的图像大小为:(N-F+2P)/S+1
而要想让卷积层处理后图像空间尺度不变,P的值可以设为P=(F-1)/2
卷积层输入W 1 H 1 D 1 大小的数据,输出W 2 H 2 D 2 的数据,此时的卷积层共有4个超参数:
K:滤波器个数
P:pad属性值
S:滤波器每次移动的步长
F:滤波器尺寸
此时输出的大小可以用输入和超参计算得到:
W 2 =(W 1 -F+2P)/S+1
H 2 =(H 1 -F+2P)/S+1
D 2 =D 1
11的滤波器也是有意义的,它在深度方向做卷积,例如1164的滤波器对565664的数据卷积得到5656的数据
F通常是奇数,这样可以综合考虑上下左右四个方向的数据。
卷积层从神经元的角度看待可以有两个性质: 参数共享和局域连接 。对待一个滤波器,例如553的一个滤波器,对32323的数据卷积得到2828的数据,可以看作存在2828个神经元,每个对原图像553的区域进行计算,这2828个神经元由于使用同一个滤波器,所以参数相同,我们称这一特性为 参数共享 。
针对不同的滤波器,我们可以看到他们会看到同一区域的图像,相当于在深度方向存在多个神经元,他们看着相同区域叫做 局域连接
参数共享减少了参数的数量,防止了过拟合
局域连接为查找不同特征更丰富的表现图像提供了可能。
卷积就像是对原图像的另一种表达。
激活函数,对于每一个维度经过ReLU函数输出即可。不改变数据的空间尺度。
通过pad *** 作,输出图像在控件上并没有变化,但是深度发生了变化,越来越庞大的数据给计算带来了困难,也出现了冗余的特征,所以需要进行池化 *** 作,池化不改变深度,只改变长宽,主要有最大值和均值两种方法,一般的池化滤波器大小F为2步长为2,对于最大值池化可以用下面的图像清晰的表示:
卷积层输入W 1 H 1 D 1 大小的数据,输出W 2 H 2 D 2 的数据,此时的卷积层共有2个超参数:
S:滤波器每次移动的步长
F:滤波器尺寸
此时输出的大小可以用输入和超参计算得到:
W 2 =(W 1 -F)/S+1
H 2 =(H 1 -F)/S+1
D 2 =D 1
将最后一层(CONV、ReLU或Pool)处理后的数据输入全连接层,对于W 2 H 2 D 2 数据,我们将其展成11W 2 H 2 D 2 大小的数据,输入层共有W 2 H 2 D 2 个神经元,最后根据问题确定输出层的规模,输出层可以用softmax表示。也就是说,全连接层就是一个常见的BP神经网络。而这个网络也是参数最多的部分,是接下来想要去掉的部分。完整的神经网络可以用下面的图表示:
[(CONV-ReLU)N-POOL]M-(FC-RELU)K,SoftMax
1更小的滤波器与更深的网络
2只有CONV层而去掉池化与全链接
最早的CNN,用于识别邮编,结构为:
CONV-POOL-CONV-POOL-CONV-FC
滤波器大小55,步长为1,池化层22,步长为2
2012年由于GPU技术所限,原始AlexNet为两个GPU分开计算,这里介绍合起来的结构。
输入图像为2272273
1首次使用ReLU
2使用Norm layers,现在已经抛弃,因为效果不大
3数据经过预处理(例如大小变化,颜色变化等)
4失活比率05
5batch size 128
6SGD Momentum 参数09(SGD和Momentum见我的其他文章)
7学习速率 001,准确率不在提升时减少10倍,1-2次后达到收敛
8L2权重减少00005
9错误率154%
改进自AlexNet,主要改变:
1CONV1的滤波器从1111步长S=4改为77步长为2
2CONV3,4,5滤波器数量有384,384,256改为512,1024,512(滤波器数量为2的n次幂有利于计算机计算可以提高效率)
错误率:148%后继续改进至112%
当前最好的最易用的CNN网络,所有卷积层滤波器的大小均为33,步长为1,pad=1,池化层为22的最大值池化,S=2。
主要参数来自全连接层,这也是想要去掉FC的原因。
具有高度的统一性和线性的组合,易于理解,十分方便有VGG-16,VGG-19等多种结构。
错误率73%
完全移除FC层,参数只有500万,使用Inception模块(不太理解,有时间继续看)
准确率667%
准确率36%
拥有极深的网络结构,且越深准确率越高。是传统CNN不具备的特点,传统CNN并非越深越准确。需要训练时间较长但是快于VGG
1每个卷积层使用Batch Normalization
2Xavier/2初始化
3SGD+Momentum(09)
4Learning rate:01,准确率不变减小10倍(因为Batch Normalization所以比AlexNet大)
5mini-batch size 256
6Weight decay of 000001
7不适用失活(因为Batch Normalization)
具体的梯度过程学完ResNet再说吧。
在设计卷积神经网络的时候,需要考虑网络的大小,即参数量和计算量,参数量指的是卷积核中的参数的数量,计算量指的是卷积神经网络执行数值运算的次数。由于参数共享,参数量只与feature map的数量有关,而与feature map的大小无关,计算量与二者都有关。常用的卷积 *** 作的参数量为:
类似地,计算量为
深度可分离卷积主要是一对一的卷积,因而计算量为
之后再通过 卷积进行特征融合
上图计算过程为,首先我们可以将右边进行卷积的可以称为过滤器也可以叫做核,覆盖到左边第一个区域,然后分别按照对应位置相乘再相加,31+11+21+00+00+00+1(-1)+8(-1)+2(-1)=-5;
按照上述的计算方法逐步按右移一个步长(步长可以设定为1,2,等),然后按往下移,逐渐计算相应的值,得出最终的值。
如上图显示,对于第一个图像矩阵对应的图,一边是白色,一边是黑色,那么中间就会存在一个垂直的边缘,我们可以选择一个垂直边缘检测过滤器,如乘法右边的矩阵,那么两者做卷积后得出的图会显示如等号右边的结果矩阵对应的灰度图中间会有一个白色的中间带,也就是检测出来的边缘,那为什么感觉中间边缘带会比较宽呢?而不是很细的一个局域呢?原因是我们输入的图像只有66,过于小了,如果我们选择输出更大的尺寸的图,那么结果来说就是相对的一个细的边缘检测带,也就将我们的垂直边缘特征提取出来了。
上述都是人工选择过滤器的参数,随着神经网络的发展我们可以利用反向传播算法来学习过滤器的参数
我们可以将卷积的顾虑器的数值变成一个参数,通过反向传播算法去学习,这样学到的过滤器或者说卷积核就能够识别到很多的特征,而不是依靠手工选择过滤器。
- padding *** 作,卷积经常会出现两个问题:
1每经过一次卷积图像都会缩小,如果卷积层很多的话,后面的图像就缩的很小了;
2边缘像素利用次数只有一次,很明显少于位于中间的像素,因此会损失边缘图像信息。
为了解决上述的问题,我们可以在图像边缘填充像素,也就是 padding *** 作了。
如果我们设置在图像边缘填充的像素数为p,那么经过卷积后的图像是:(n+2p-f+1)x(n+2p-f+1)
如何去选择p呢
通常有两种选择:
-Valid:也就是说不填充 *** 作(no padding),因此如果我们有nxn的图像,fxf的过滤器,那么我们进行卷积nxn fxf=(n-f+1)x(n-f+1)的输出图像;
-Same:也就是填充后是输出图像的大小的与输入相同,同样就有(n+2p)x(n+2p) fxf=nxn,那么可以算,n+2p-f+1=n,得到p=(f-1)/2。
通常对于过滤器的选择有一个默认的准则就是选择过滤器的尺寸是奇数的过滤器。
- 卷积步长设置(Strided COnvolution)
卷积步长也就是我们进行卷积 *** 作时,过滤器每次移动的步长,上面我们介绍的卷积 *** 作步长默认都是1,也就是说每次移动过滤器时我们是向右移动一格,或者向下移动一格。
但是我们可以对卷积进行步长的设置,也就是我们能够对卷积移动的格数进行设置。同样假如我们的图像是nxn,过滤器是fxf,padding设置是p,步长strided设置为s,那么我们进行卷积 *** 作后输出的图像为((n+2p-f)/s+1)x((n+2p-f)/s+1),那么这样就会出现一个问题,如果计算结果不是整数怎么办?
一般是选择向下取整,也就是说明,只有当我们的过滤器完全在图像上能够覆盖时才对它进行计算,这是一个惯例。
实际上上述所述的 *** 作在严格数学角度来说不是卷积的定义,卷积的定义上我们计算的时候在移动步长之前也就是对应元素相乘之前是需要对卷积核或者说我们的过滤器进行镜像 *** 作的,经过镜像 *** 作后再把对应元素进行相乘这才是严格意义上的卷积 *** 作,在数学角度上来说这个 *** 作不算严格的卷积 *** 作应该是属于互相关 *** 作,但是在深度学习领域中,大家按照惯例都省略了反转 *** 作,也把这个 *** 作叫做卷积 *** 作
我们知道彩色图像有RGB三个通道,因此对于输入来说是一个三维的输入,那么对三维输入的图像如何进行卷积 *** 作呢?
例子,如上图我们输入图像假设为6×6×3,3代表有RGB三个通道channel,或者可以叫depth深度,过滤器的选择为3×3×3,其中需要规定的是,顾虑器的channel必须与输入图像的channel相同,长宽没有限制,那么计算过程是,我们将过滤器的立体覆盖在输入,这样对应的27个数对应相乘后相加得到一个数,对应到我们的输出,因此这样的方式进行卷积后我们得出的输出层为4×4×1。如果我们有多个过滤器,比如我们分别用两个过滤器一个提取垂直特征,一个提取水平特征,那么输出图4×4×2 。也就是代表我们输出的深度或者说通道与过滤器的个数是相等的。
第l层的卷积标记如下:
加入我们的过滤器是3×3×3规格的,如果我们设定10个过滤器,那么需要学习的参数总数为每个过滤器为27个参数然后加上一个偏差bias那么每个过滤器的参数为28个,所以十个过滤器的参数为280个。从这里也就可以看出,不管我们输入的大小是多大,我们都只需要计算这些参数,因此参数共享也就很容易理解了。
为了缩减模型的大小,提高计算速度,同时提高所提取特征的鲁棒性,我们经常会使用池化层。池化层的计算方式与卷积类似,只是我们需要对每一个通道都进行池化 *** 作。
池化的方式一般有两种:Max Pooling和Average Pooling。
上面为Max Pooling,那么计算方法与卷积类似,首先设定超参数比如过滤器的大小与步长,然后覆盖到对应格子上面,用最大值取代其值作为输出的结果,例如上图为过滤器选择2×2,步长选择为2,因此输出就是2×2的维度,每个输出格子都是过滤器对应维度上输入的最大值。如果为平均池化,那么就是选择其间的平均值作为输出的值。
因此从上面的过程我们看到,通过池化 *** 作能够缩小模型,同时能让特征值更加明显,也就提高了提取特征的鲁棒性。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)