目录
1 提出
如果向之前李沐的逻辑回归 来说,里面的图片都是像素块比较少的图片(28*28),所以输入的数据也是可以令人接受的,但是如果一个图片有1000*1000的像素点,再加上彩色rgb3通道,如果还像之前那样来操作,内存肯定是不够用的。,所以提出了卷积来解决这种问题。
2 边缘检测
数字图像处理相关知识
左边为一个简单的图像的矩阵表示,中间那个3*3矩阵为过滤器(也可叫做核 kernel),右边那个为经过过滤器处理(卷积运算convolution)后的输出,这个过程就叫做卷积运算(nn.conv2d)。
具体操作是将图像用过滤器扫描遍历,每次扫描的时候就用核和图中一部分相乘再求和来计算出一个对应的值(如图上绿色部分书写)放入右边输出的矩阵中。
例子:
最右边图中对应的条状白色就是检测出来的垂直线。因为这个例子中的图片比较小,所以显得边缘线比较粗。
关于这个例子中过滤器的理解:原图中是10到0的变化,而过滤器也是类似于这样的变化1到0到-1(变小),最后输出的边缘线对应也就为正(30)。
这个例子中就可以看出绿色的30就代表对应部分是从明变暗,紫色的-30就代表从暗到明。而因为图片比较小,所以会出现10之类的中间过渡部分。
还有其他类型的过滤器,他们会具有比较好的鲁棒性。
但是这些过滤器也不一定是最合适的,我们可以自己根据应用场景来自己得出合适的过滤器。
我们可以把这个过滤器设置成参数w,通过神经网络利用方向传播算法得出合适的w。
3 Padding
因为使用过滤器卷积图像后,会损失掉图像的一些边缘信息(输出都比原图小一点),如果经过多层的卷积,那么就会损失掉更多的数据。所以为了解决这个问题,我们引入的padding,即在卷积之前事先对图像周围进行填充(习惯上可以用0去填充),使得卷积后的图像和原图一样大。
如图中所示,就填充了两行两列。这里对应参数p为1(理解为在外面添加的层数)
但是不一定只填充两行两列,至于填充多少列,通常有两个选择叫做Valid卷积和Same卷积。valid卷积指的是对图像不填充,而Same卷积表示你的卷积前后的图像像素大小不变。
一般来说过滤器的行列数是一个奇数,这样才能对称的填充,同时也会拥有一个像素的中心点。
4 卷积步长
之前的卷积是将过滤器挨个像素点进行遍历,而设置的卷积步长就表示按照一定间隔来进行遍历,比如下面这个例子中步长就为2。
我们对一个n*n图像用f*f过滤器进行卷积,padding填充为p,步长为s,最后输出的图像大小为(向下取整)
注:
在一些信号处理中的卷积运算会将过滤器进行镜像翻转之后进行的运算才叫做卷积运算,如下图所示。而我们机器学习中是不需要进行这一步操作的。
5 三维卷积
例如RGB图像就是三维的。
图中3层矩阵就对应有3层过滤器。
如果你只想检测红色通道的边缘,你可以只对红色层对应的过滤器赋予对应的值,而其他的层不做处理,如下图
如果我们需要同时对图像的水平和垂直边缘进行检测,我们可以使用两个过滤器分别对图像的水平和垂直边缘进行提取,然后将两个提取出来的输出组合成一个2层的图像,如下图。也可以使用多个过滤器提取多个特征再组合到一起。
注:文献中会使用channel和depth来对图像的层数来进行描述。
6 卷积网络引出
我们分别用两个过滤器对图像进行卷积运算得到两个4*4的输出图像,然后分别对两个输出加上偏置,然后再用激活函数进行处理。(其中这里加入的b1是对输出的4*4图像的每一个格子中的数据都加上同一个b1)。
因此,卷积神经网络和普通的神经网络单层前向传播的过程类似,也是一个先由输入和权重及偏置做线性运算,然后得到的结果输入一个激活函数中
卷积运算对应着上式中的乘积运算,滤波器组数值对应着权重 ,所选的激活函数为ReLU
这里给出单层卷积网络符号表示:
:过滤器尺寸
:padding
:stride,步长
:过滤器数量
:输入尺寸
:输出尺寸
:滤波器尺寸
:权重维度
:偏置维度
:输出维度
输出图片高度等于:
输出图片的宽度:
卷积神经网络优势:
计算一下上图中参数的数目:每个滤波器组有3x3x3=27个参数,还有1个偏移量b,则每个滤波器组有27+1=28个参数,两个滤波器组总共包含28x2=56个参数。
选定滤波器组后,参数数目与输入图片尺寸无关,只和过滤器的维度大小和个数有关。所以,就不存在由于图片尺寸过大,造成参数过多的情况。例如一张1000x1000x3的图片,标准神经网络输入层的维度将达到3百万,而在CNN中,参数数目只由滤波器组决定,数目相对来说要少得多,参数少既可以加快速度也可以缓解过拟合现象。
简单卷积神经网络实例
全部过程:
先使用过滤器大小为3,步长为1,pad为0,10个过滤器来进行第一次卷积,得到一个37*37*10的输出
然后再通过两次卷积
最后将7*7*40的特征排列成一个一维的向量,然后将这个向量作为输入进行一次逻辑回归,也就是进行分类,最终输出y。
这里只是用了卷积层,也就是Conv层,并没有使用Pooling和全连接,接下来讲解Pooling和全连接的使用。
7 池化层(Pooling)
除了卷积层,卷积神经网络还会使用Pooling层来缩减模型的大小,提高计算速度,同时提高提取特征时的鲁棒性。
池化可以理解成特征提取,这里我们使用Max Pooling举例,这也是比较常用的例子。
这里使用的就是max pooling,使用的是步长为2过滤器大小为2来对其进行池化(常用值)。
我们可以发现pool和卷积的操作步骤非常相似,pool更多的是提取特征来进行压缩。
这是一个步长为1的池化例子:
这是平均池化例子(字面意思就是取平均值)
8 卷积神经网络示例
人们在计算神经网络的层数的时候,通常知识统计具有权重和参数的层,而Pooling层是没有参数的,所以这里我们把Conv1和Pooling1作为一个卷积层。 但也有人把Pooling层算作一层都是可以的。
图中经过两次卷积、池化后,最后就把输出排成向量,利用向量作为输入进行softmax回归(全连接层)。
这里的表格可能有点问题?
可以发现第一层和池化层是没有参数的(parameters),卷积层的参数相对于全连接层是比较少的。
9 1*1卷积核的作用
1*1卷积和可以对输入图像的通道数也就是厚度进行改变,类似于全连接层的作用。
这里使用了两个1*1*3的卷积核,最后输出的通道数就等于卷积核的个数,所以控制卷积核的个数的大小就可以控制输出的通道大小,从而进行降维或者升维。
为什么要进行1*1卷积操作? 比如在Googlenet的inception块中,这里输入为192*28*28,我们如果觉得输入的维度太高,就可以通过1*1卷积核进行降维,降到合适的维度后再进行运算。中间两个白色卷积就是为了给3*3和5*5卷积层提供合适的输入维度而存在的;右边那个1*1卷积是为了对这里的1*1卷积的输出进行维度限定。