卷积神经网络~Convolutional neural networks
需要对卷积层进行训练,因为卷积层更能保留输入的空间结构。
关键术语
卷积核(滤波器~filter):是一固定权重的神经元,以矩阵的形式体现。通常用来提取局部的特征。
卷积:是图像的矩阵与卷积核点积的过程,该计算过程又称滤波。
卷积层:有多个卷积核(滤波器)叠加所形成的。
卷积层只是局部的特征
感受野(receptive field):是卷积核(矩阵)的"行×列",通俗讲是输入区域,即所能看到到的视野。描述的是输出的特征到原始图像之间的一个映射关系。
Like this~
深度(depth):卷积核的数量就是所谓的深度。
步长(stride):图像从边缘滑动到另一个边缘的所需的步数。
通道:是将图像分解成一或多个的颜色成分。基本上是指RGB模式,即三通道。[红(Red),绿(Green),蓝(blue)]
参数(parameter):参数 = 卷积核个数 × (卷积核宽度×卷积核高×深度+1)
其中,1表示的是偏置量。
池化层(pooling layers):每隔几个卷积层就会有池化层夹在中间。作用是让所生成法的表示更小更容易控制。但不改变深度~
最大池化法:仅仅选出一个卷积核所在区域的最大值,并将之放到池化层中。例如:(假定卷积核为2×2且步长为2)▼
卷积核会滑过整个输入的部分
通常会选取合适的步长来使得不重叠~
全连接层(fully connected layers):
如:对一个图像判断是不是属于猫类~
经过训练的神经网络进行如下工作~
各卷积层对猫局部特征进行提取,然后经过池化层降低采样,在第一层的全连接层已经具有了部分特征,然后在该层对提取到的局部特征进行一定的操作讲这些部分特征进行一定的组合并输出到第二个全连接层上。
(红色表示激活的神经元)
由上图知此时完成了猫头的组合~
(红色表示激活的神经元)
往后走一层到达第二层全连接层,在该层上这张猫图片的其他部件的特这也类似头部分操作被提取及组合出来了。当找到这些特征,相应的神经元被激活,而没有被激活的神经元表示这一种猫的特征不太明显,或者就直接没有找到。再将这些找到且明显的特征进行组合并输出到输出层,经过激活函数进行分类,确定在各类中的分数来得出这是属于猫~~
全连接层的图片来源(_kimcho),感谢博客分享
卷积的工作方式
由输入32×32变换到输出28×28的的原因:
一般都会选取合适的移动像素来确保对称的输出~
无填充计算公式:|Outer|=(|Input|-|Filter|)/stride + 1
知输入矩阵的模为32的话,卷积核为5的情况下,输出矩阵的模为32-5+1=28.
用0来填充的计算~
填充计算公式:(设填充数为n)
|Outer|=(|Input|-|Filter|+2n)/stride + 1
当然有其他的填充方法,如复制等~
填充的意义是如果想要保留全尺寸输出或某一特定的尺寸输出,则进行一定的填充(如上例子说明)。另一个方面是确保不会迅速的缩小而造成的关键信息的丢失!
单个卷积层中,通过不断滑动卷积核来遍历图像空间的所有位置,卷积核一般是从左上角的边角处开始遍历所有的像素点(一般是一个像素一个像素地向右移动,到达边界后在往下一个进行重复移动,当然可以两像素的移动,这取决于步长)。其在每一个位置都要进行点积运算,而每一次运算都会在激活映射中产生一个值,继续滑动卷积核直到填满了输出映射。
是经过池化后的结果与卷积核的点乘积的结果。这一映射过程的最终结果就是对应的是每个对最终结果影响较大的特征与卷积核的点乘积。
而将这些每一步的激活映射结果全部加起来,得到的就是一个CAM(Class Activation Map)结果~
图片来源于metalbubble的GitHub,感谢(●ˇ∀ˇ●)
卷积网络是由一系列卷积层所组成的,它们依次堆叠,之中穿插着激活函数来对其进行逐一处理。每一个层的输出又作为下一个卷积层的输入
激活函数:
卷积网络在图像处理中的例子:
卷积的计算过程
例题及图片及计算过程均引用大神博客 v_JULY_v,计算过程写的太好了,感谢!!!
例题:
input是 7×7×3,周边少的用0进行填充。
有俩卷积核 Filter w0 和 Filter w1,每个Filter有一组权值W(3×3×3)。
偏置量 Bias b0 和 Bias b1 分别有一个值(1×1×1)。
计算思想:
一个卷积核滑动到一个位置就计算这3个通道的卷积(通过点乘),然后进行求和,并加上偏置量 bias,可得到这一个卷积核在该位置的最终结果。有俩卷积核,每个卷积核的输出是一个通道的结果。故总输出为(3×3×2)。
仅仅写第一个的计算过程,之后类推~~
# 第一个通道和对应权重的结果:
0*1 + 0*1 + 0*(-1) + 0*(-1) + 0*0 + 1*1 + 0*(-1) + 0*(-1) + 1*0 = 1
# 第二个通道和对应权重的结果:
0*(-1) + 0*0 + 0*(-1) + 0*0 + 1*0 + 1*(-1) + 0*1 + 0*(-1) + 2*0 = -1
# 第三个通道和对应权重的结果:
0*0 + 0*1 + 0*0 + 0*1 + 2*0 + 0*1 + 0*0 + 0*(-1) + 0*0 = 0
# 偏置 b1 = 1
# 输出结果:
1 + (-1) + (0) + 1 = 1