1、CNN概念

1、卷积神经网络(CNN)常用于图像、语音识别领域

2、ReLU激活函数

卷积神经网络均方误差绘制_全连接


ReLU激活函数定义:

卷积神经网络均方误差绘制_全连接_02


使用ReLU激活函数的优势:

(1)速度快 和sigmoid函数需要计算指数和倒数相比,relu函数其实就是一个max(0,x),计算代价小很多。
(2)减轻梯度消失问题 回忆一下计算梯度的公式。

卷积神经网络均方误差绘制_深度学习_03


卷积神经网络均方误差绘制_pytorch_04


这个值最大是0.25,当这个值很小的时候,梯度会逐渐变小


梯度计算公式:


卷积神经网络均方误差绘制_卷积神经网络均方误差绘制_05


卷积神经网络均方误差绘制_全连接_06

(3)稀疏性 通过对大脑的研究发现,大脑在工作的时候只有大约5%的神经元是激活的,而采用sigmoid激活函数的人工神经网络,其激活率大约是50%。有论文声称人工神经网络在15%-30%的激活率时是比较理想的。因为relu函数在输入小于0时是完全不激活的,因此可以获得一个更低的激活率。

2、ReLU激活函数的优缺点
参考文档:各种激活函数的优缺点

优点:
1、使用ReLU的SGD算法的收敛速度比 sigmoid 和 tanh 快。
2、在x>0区域上,不会出现梯度饱和、梯度消失的问题。
3.、计算复杂度低,不需要进行指数运算,只要一个阈值就可以得到激活值。
缺点:
1、ReLU的输出不是0均值的。
2.、Dead ReLU Problem(神经元坏死现象):ReLU在负数区域被kill的现象叫做dead relu。ReLU在训练的时很“脆弱”。在x<0时,梯度为0。这个神经元及之后的神经元梯度永远为0,不再对任何数据有所响应,导致相应参数永远不会被更新。
产生这种现象的两个原因:参数初始化问题;learning rate太高导致在训练过程中参数更新太大。
解决方法:采用Xavier初始化方法,以及避免将learning rate设置太大或使用adagrad等自动调节learning rate的算法。
(2)也可以使用GeLU函数

3、CNN相对于FC的优势

全连接神经网络之所以不太适合图像识别任务,主要有以下几个方面的问题:
参数数量太多 考虑一个输入10001000像素的图片(一百万像素,现在已经不能算大图了),输入层有10001000=100万节点。假设第一个隐藏层有100个节点(这个数量并不多),那么仅这一层就有(1000*1000+1)*100=1亿参数,这实在是太多了!我们看到图像只扩大一点,参数数量就会多很多,因此它的扩展性很差。
没有利用像素之间的位置信息 对于图像识别任务来说,每个像素和其周围像素的联系是比较紧密的,和离得很远的像素的联系可能就很小了。如果一个神经元和上一层所有神经元相连,那么就相当于对于一个像素来说,把图像的所有像素都等同看待,这不符合前面的假设。当我们完成每个连接权重的学习之后,最终可能会发现,有大量的权重,它们的值都是很小的(也就是这些连接其实无关紧要)。努力学习大量并不重要的权重,这样的学习必将是非常低效的。
网络层数限制 我们知道网络层数越多其表达能力越强,但是通过梯度下降方法训练深度全连接神经网络很困难,因为全连接神经网络的梯度很难传递超过3层。因此,我们不可能得到一个很深的全连接神经网络,也就限制了它的能力。

CNN解决上述问题的思想:

局部连接 这个是最容易想到的,每个神经元不再和上一层的所有神经元相连,而只和一小部分神经元相连。这样就减少了很多参数。
权值共享 一组连接可以共享同一个权重,而不是每个连接有一个不同的权重,这样又减少了很多参数。
下采样 可以使用Pooling来减少每层的样本数,进一步减少参数数量,同时还可以提升模型的鲁棒性。

问题:Pooling ->下面解释

4、CNN架构

卷积神经网络均方误差绘制_全连接_07


如图1所示,一个卷积神经网络由若干卷积层、Pooling层、全连接层组成。你可以构建各种不同的卷积神经网络,它的常用架构模式为:

INPUT -> [[CONV]*N -> POOL?]*M -> [FC]*K

也就是,一个输入层、N个卷积层,M个Pooling层然后经过K个全连接层,最终进行输出

对于此图展示的情况:
INPUT -> CONV -> POOL -> CONV -> POOL -> FC -> FC
即为:
INPUT -> [[CONV]*1 -> POOL]*2 -> [FC]*2
也就是:N=1, M=2, K=2。

为什么N=1??

5、CNN的三维层架构

从图1我们可以发现卷积神经网络的层结构和全连接神经网络的层结构有很大不同。全连接神经网络每层的神经元是按照一维排列的,也就是排成一条线的样子;而卷积神经网络每层的神经元是按照三维排列的,也就是排成一个长方体的样子,有宽度、高度和深度。
对于图1展示的神经网络,我们看到输入层的宽度和高度对应于输入图像的宽度和高度,而它的深度为1。接着,第一个卷积层对这幅图像进行了卷积操作(后面我们会讲如何计算卷积),得到了三个Feature Map。这里的"3"可能是让很多初学者迷惑的地方,实际上,就是这个卷积层包含三个Filter,也就是三套参数,每个Filter都可以把原始输入图像卷积得到一个Feature Map,三个Filter就可以得到三个Feature Map。至于一个卷积层可以有多少个Filter,那是可以自由设定的。也就是说,卷积层的Filter个数也是一个超参数。我们可以把Feature Map可以看做是通过卷积变换提取到的图像特征,三个Filter就对原始图像提取出三组不同的特征,也就是得到了三个Feature Map,也称做三个通道(channel)。

解释:
(1)初始的输入是一张图片,其三维分别是图片的二维*1
(2)进行卷积,得到了三个Feature Map,卷积层设定的Filter数量为3,每个Filter将原始图像卷积之后得到一个Feature Map
(3)三个Filter就对原始图像提取出三组不同的特征,统称为三个通道

继续观察图1,在第一个卷积层之后,Pooling层对三个Feature Map做了下采样(后面我们会讲如何计算下采样),得到了三个更小的Feature Map。接着,是第二个卷积层,它有5个Filter。每个Fitler都把前面下采样之后的3个Feature Map卷积在一起,得到一个新的Feature Map。这样,5个Filter就得到了5个Feature Map。接着,是第二个Pooling,继续对5个Feature Map进行下采样,得到了5个更小的Feature Map。

解释:Polling就是对Feature Map进行采样的,将会在每个Feature Map中选取一部分进行取样
(2)进入第二个卷积层后,设定的Filter个数为5,每个Filter会将所有的Feature Map卷积在一起,得到一个新的Feature Map

图1所示网络的最后两层是全连接层。第一个全连接层的每个神经元,和上一层5个Feature Map中的每个神经元相连,第二个全连接层(也就是输出层)的每个神经元,则和第一个全连接层的每个神经元相连,这样得到了整个网络的输出。

解释:通过两次的卷积取样之后,通过FC将结果进行分析输出

6、如何计算卷积

假设有一个55的图像,使用一个33的filter进行卷积,想得到一个3*3的Feature Map,如下所示:

卷积神经网络均方误差绘制_卷积神经网络均方误差绘制_08


卷积神经网络均方误差绘制_深度学习_09

相当于自上而下,自左而右取一个3*3的样本,然后与权重矩阵相乘,得到某一个点的值

图像展示:

卷积神经网络均方误差绘制_卷积神经网络均方误差绘制_10


此时,设置的步幅为1,即每次向右/向下移动一个格子

步幅为2时,每次向右/向下移动两个格子

卷积神经网络均方误差绘制_卷积神经网络均方误差绘制_11


卷积神经网络均方误差绘制_全连接_12

卷积神经网络均方误差绘制_卷积_13

我们注意到,当步幅设置为2的时候,Feature Map就变成2*2了。这说明图像大小、步幅和卷积后的Feature Map大小是有关系的。事实上,它们满足下面的关系:
※Feature Map计算公式

卷积神经网络均方误差绘制_pytorch_14

卷积神经网络均方误差绘制_全连接_15


卷积神经网络均方误差绘制_pytorch_16

深度大于1的卷积层计算方法:

首先,我们知道:如果卷积前的图像深度为D,那么相应的filter的深度也必须为D。
计算公式:

卷积神经网络均方误差绘制_卷积_17


卷积神经网络均方误差绘制_pytorch_18


我们前面还曾提到,每个卷积层可以有多个filter。每个filter和原始图像进行卷积后,都可以得到一个Feature Map。因此,卷积后Feature Map的深度(个数)和卷积层的filter个数是相同的。

动画演示

下面的动画显示了包含两个filter的卷积层的计算。我们可以看到773输入,经过两个333filter的卷积(步幅为2),得到了332的输出。另外我们也会看到下图的Zero padding是1,也就是在输入元素的周围补了一圈0。Zero padding对于图像边缘部分的特征提取是很有帮助的。

卷积神经网络均方误差绘制_深度学习_19


以上就是卷积层的计算方法。这里面体现了局部连接和权值共享:每层神经元只和上一层部分神经元相连(卷积计算规则),且filter的权值对于上一层所有神经元都是一样的。对于包含两个3

3

3的fitler的卷积层来说,其参数数量仅有(3

3

3+1)*2=56个,且参数数量与上一层神经元个数无关。与全连接神经网络相比,其参数数量大大减少了。

总结:
Zero Pooling就是在原始数据外围加0,=1就是加一圈0
作用是什么?

计算方法就是:
将对应位置元素相乘然后相加,然后再将三层得到的三个数相加,得到一个最终值

7、Pooling层输出值的计算

Pooling层主要的作用是下采样,通过去掉Feature Map中不重要的样本,进一步减少参数数量。Pooling的方法很多,最常用的是Max Pooling。Max Pooling实际上就是在n*n的样本中取最大值,作为采样后的样本值。

卷积神经网络均方误差绘制_深度学习_20


除了Max Pooing之外,常用的还有Mean Pooling——取各样本的平均值。


对于深度为D的Feature Map,各层独立做Pooling,因此Pooling后的深度仍然为D。

解释:就是看看将原矩阵分成几块,2*2就是分成4块,每块取最大值组成一个新矩阵

8、卷积神经网络的训练

和全连接神经网络相比,卷积神经网络的训练要复杂一些。但训练的原理是一样的:利用链式求导计算损失函数对每个权重的偏导数(梯度),然后根据梯度下降公式更新权重。训练算法依然是反向传播算法。
反向传播算法分为三个步骤:

卷积神经网络均方误差绘制_pytorch_21


卷积神经网络均方误差绘制_深度学习_22

卷积层的训练


具体数学推导太复杂,直接放弃

总结

1、卷积层任务:因为图片等信息的过度冗余,卷积层主要就是压缩提纯
实现方式:通过卷积核的方式,将几个点映射到Feature Map中的一个点上,实现数据压缩(也可以叫作特征提取)
注:一个卷积层不一定只有一个卷积核,可以有多层,即有多个卷积核生成多个Feature Map,即将图像变厚

2、池化层作用(Pooling):

一张图就可以解释:

卷积神经网络均方误差绘制_卷积_23


3、CNN网络最后一般会经过Softmax层:

卷积神经网络均方误差绘制_卷积_24


即将全连接层的结果归一化转化为概率进行计算

Softmax损失函数:

卷积神经网络均方误差绘制_深度学习_25

4、卷积层的反向传播计算偏导数相当于将结果外围加一圈0,然后与旋转180°的权值矩阵进行互相关计算:

卷积神经网络均方误差绘制_pytorch_26


5、卷积神经网络中padding(在数据外围+0)的作用:

padding的用途:
(1)保持边界信息,如果没有加padding的话,输入图片最边缘的像素点信息只会被卷积核操作一次,但是图像中间的像素点会被扫描到很多遍,那么就会在一定程度上降低边界信息的参考程度,但是在加入padding之后,在实际处理过程中就会从新的边界进行操作,就从一定程度上解决了这个问题。
(2)可以利用padding对输入尺寸有差异图片进行补齐,使得输入图片尺寸一致。
(3)在卷积神经网络的卷积层加入Padding,可以使得卷积层的输入维度和输出维度一致。
(4)卷积神经网络的池化层加入Padding,一般都是保持边界信息和(1)所述一样。

6、最后全连接层的意义

接全连接层的意义是:将神经网络输出的丰富信息加到标准分类器中

7、卷积核大小选择讲究
参考:卷积核大小如何确定卷积神经网络中感受野的概念卷积核尺寸如何选取呢? (1)感受野:

在卷积神经网络中,感受野(Receptive Field)的定义是卷积神经网络每一层输出的特征图(feature map)上的像素点在输入图片上映射的区域大小。再通俗点的解释是,特征图上的一个点对应输入图上的区域

卷积神经网络均方误差绘制_深度学习_27

卷积核大小选择:

在达到相同感受野的情况下,卷积核越小,所需要的参数和计算量越小。具体来说。卷积核大小必须大于1才有提升感受野的作用,1排除了。而大小为偶数的卷积核即使对称地加padding也不能保证输入feature map尺寸和输出feature map尺寸不变(画个图算一下就可以发现),2排除了。所以一般都用3作为卷积核大小。

(2)padding作用及选择
参考链接:关于padding层的理解

1.卷积后的矩阵越变越小(如果卷积层100层,每一层都缩小最终得到的将是很小的图片)
2.输入矩阵(左)边缘像素(绿阴影)只被计算过一次,而中间像素(红阴影)被卷积计算多次,意味着丢失图像角落信息。

so,一般padding要设置尽量是的输入输出矩阵大小不变