五、优化方法总结
1、基本的梯度下降方法
梯度下降算法简介:
通俗易懂讲解梯度下降法!
梯度下降学习入门视频推荐:
【梯度下降】人工智能的灵魂,你悟出她的真谛了吗?
【干货】深度学习必备:深入浅出的学习(梯度下降算法)_哔哩哔哩_bilibili
深度学习网络训练过程可以分成两大部分:前向计算过程与反向传播过程。前向计算过程,是指通过我们预先设定好的卷积层、池化层等等,按照规定的网络结构一层层前向计算,得到预测的结果。反向传播过程,是为了将设定的网络中的众多参数一步步调整,使得预测结果能更加贴近真实值。
那么,在反向传播过程中,很重要的一点就是:参数如何更新?或者问的更具体点:参数应该朝着什么方向更新?
显然,参数应该是朝着目标损失函数下降最快的方向更新,更确切的说,要朝着梯度方向更新! 假设网络参数是 θ \thetaθ,学习率是 η \etaη,网络表示的函数是 J ( θ ) J(\theta)J(θ),函数此时对θ \thetaθ的梯度为:▽ θ J ( θ ) \bigtriangledown_{\theta }J(\theta)▽θJ(θ),于是参数 θ \thetaθ 的更新公式可表示为:
在深度学习中,有三种最基本的梯度下降算法:SGD、BGD、MBGD,他们各有优劣。根据不同的数据量和参数量,可以选择一种具体的实现形式,在训练神经网络是优化算法大体可以分为两类:1)调整学习率,使得优化更稳定;2)梯度估计修正,优化训练速度。
(1)随机梯度下降法 SGD
随机梯度下降法 (Stochastic Gradient Descent,SGD),每次迭代(更新参数)只使用单个训练样本( x ( i ) , y ( i ) ) (x^{(i)}, y^{(i)})(x(i),y(i)),其中x是输入数据,y是标签。因此,参数更新表达式如下:
优点: SGD 一次迭代只需对一个样本进行计算,因此运行速度很快,还可用于在线学习。
缺点:(1)由于单个样本的随机性,实际过程中,目标损失函数值会剧烈波动,一方面,SGD 的波动使它能够跳到新的可能更好的局部最小值。另一方面,使得训练永远不会收敛,而是会一直在最小值附近波动。(2)一次迭代只计算一张图片,没有发挥GPU并行运算的优势,使得整体计算的效率不高。
(2)批量梯度下降法 BGD
批量梯度下降法 (Batch Gradient Descent,BGD),每次迭代更新中使用所有的训练样本,参数更新表达式如下:
优缺点分析:BGD能保证收敛到凸误差表面的全局最小值和非凸表面的局部最小值。但每迭代一次,需要用到训练集中的所有数据,如果数据量很大,那么迭代速度就会非常慢。
小批量梯度下降法 MBGD
小批(3)量梯度下降法 (Mini-Batch Gradient Descent,MBGD),折中了 BGD 和 SGD 的方法,每次迭代使用 batch_size 个训练样本进行计算,参数更新表达式如下:
优缺点分析:因为每次迭代使用多个样本,所以 MBGD 比 SGD 收敛更稳定,也能避免 BGD 在数据集过大时迭代速度慢的问题。因此,MBGD是深度学习网络训练中经常使用的梯度下降方法。
深度学习中,一般的mini-batch大小为64~256,考虑到电脑存储设置和使用的方式,如果mini-batch是2的次方,代码会运行地更快一些。
上图是BGD和MBGD训练时,损失代价函数的变化图。可见BGD能使代价函数逐渐减小,最终保证收敛到凸误差表面的全局最小值;MBGD的损失代价函数值比较振荡,但最终也能优化到损失最小值。
(4) Adagrad
(5)Adadelta
(6)RMSprop 优化器
RMSProp算法的全称叫 Root Mean Square Prop(均方根传递),是 Hinton 在 Coursera 课程中提出的一种优化算法,在上面的 Momentum 优化算法中,虽然初步解决了优化中摆动幅度大的问题。
为了进一步优化损失函数在更新中存在摆动幅度过大的问题,并且进一步加快函数的收敛速度,RMSProp算法对权重 W 和偏置 b 的梯度使用了微分平方加权平均数。优化后的效果如下:蓝色的为Momentum优化算法所走的路线,绿色的为RMSProp优化算法所走的路线。
假设在第 t 轮迭代过程中,各个公式如下所示:
在上面的公式中 Sdw 和 Sdb 分别是损失函数在前 t−1轮迭代过程中累积的梯度平方动量, β 是梯度累积的一个指数。所不同的是,RMSProp 算法对梯度计算了微分平方加权平均数。这种做法有利于消除了摆动幅度大的方向,用来修正摆动幅度,使得各个维度的摆动幅度都较小。另一方面也使得网络函数收敛更快。
2、Momentum 动量梯度下降
Momentum 主要引入了基于梯度的移动指数加权平均的思想,即当前的参数更新方向不仅与当前的梯度有关,也受历史的加权平均梯度影响。对于梯度指向相同方向的维度,动量会积累并增加,而对于梯度改变方向的维度,动量会减少更新。这也就使得收敛速度加快,同时又不至于摆动幅度太大。
动量梯度下降法作用是加快学习速度,还有一定摆脱局部最优的能力。如下图红色线所示:
动量梯度下降(Momentum)的参数更新表达式如下所示:
其中,λ 表示动量参数momentum;当λ = 0 时,即是普通的SGD梯度下降。0 < λ < 1 ,表示带了动量的SGD梯度下降参数更新方式,λ 通常取0.9。
普通SGD的缺点:SGD很难在沟壑(即曲面在一个维度上比在另一个维度上弯曲得更陡的区域)中迭代,这在局部最优解中很常见。在这些场景中,SGD在沟壑的斜坡上振荡,同时沿着底部向局部最优方向缓慢前进。为了缓解这一问题,引入了动量momentum。
本质上,当使用动量时,如同我们将球推下山坡。球在滚下坡时积累动量,在途中变得越来越快。同样的事情发生在参数更新上:对于梯度指向相同方向的维度,动量会积累并增加,而对于梯度改变方向的维度,动量会减少更新。结果,我们获得了更快的收敛和减少的振荡。
3、Adam 优化器
Adam 是另一种参数自适应学习率的方法,相当于 RMSprop + Momentum,利用梯度的一阶矩估计和二阶矩估计动态调整每个参数的学习率。公式如下:
一阶矩和二阶矩 m t 、 v t m_t、v_tmt、vt 类似于动量,将其初始化为:m 0 = 0 , v 0 = 0 m_{0}=0, v_{0}=0m0=0,v0=0
m t 、 v t m_t、v_tmt、vt分别是梯度的一阶矩(均值)和二阶矩(非中心方差)的估计值:
由于移动指数平均在迭代开始的初期会导致和开始的值有较大的差异,所以我们需要对上面求得的几个值做偏差修正。通过计算偏差校正的一阶和二阶矩估计来抵消这些偏差:
然后使用这些来更新参数,就像在 RMSprop 中看到的那样, Adam 的参数更新公式:
在Adam算法中,参数 β1 所对应的就是Momentum算法中的 β 值,一般取0.9,参数 β2 所对应的就是RMSProp算法中的 β 值,一般我们取0.999,而 ϵ 是一个平滑项,我们一般取值为 1 0 − 8 10^{−8}10−8,而学习率则需要我们在训练的时候进行微调。
优化算法小结
深度学习最全优化方法比较(SGD,Adagrad,Adadelta,Adam,Adamax,Nadam) - 知乎
Pytorch中优化器与学习率衰减方法总结
pytorch中优化器与学习率衰减方法总结_ys1305的博客
4、损失函数
入门学习视频:
【线性回归、代价函数、损失函数】动画理解,爱上数学
1.损失函数定义
在机器学习任务中,大部分监督学习算法都会有一个目标函数 (Objective Function),算法对该目标函数进行优化,称为优化算法的过程。 例如在分类或者回归任务中,使用损失函数( Loss Function )作为其目标函数对算法模型进行优化 。
在BP神经网络中,一般推导中,使用均方误差作为损失函数,而在实际中,常用交叉熵作为损失函数。如下图所示,我们可以清晰地观察到不同的损失函数在梯度下降过程中的收敛速度和性能都是不同的。
均方误差作为损失函数收敛速度慢,可能会陷入局部最优解;
而交叉熵作为损失函数的收敛速度比均方误差快,且较为容易找到函数最优解.
因此了解损失函数的类型并掌握损失函数的使用技巧,有助于加深对深度学习的认知.
对于分类和回归模型使用的损失函数不同,下面将分别进行介绍。
2 回归损失函数
(1) 均方误差损失函数
均方误差(Mean Squared Error Loss, MSE)损失函数定义如下:
代码示例
def mean_squared_error(y_true, y_pred): return np.mean(np.square(y_pred - y_true), axis=-1)
(2) 平均绝对误差损失函数
平均绝对误差(Mean Absolute Error Loss, MAE)损失函数定义如下:
代码示例
def mean_absolute_error(y_true, y_pred): return np.mean(np.abs(y_pred - y_true), axis=-1)
(3) 均方误差对数损失函数
均方误差对数(Mean Squared Log Error Loss, MSLE)损失函数定义如下:
代码示例
def mean_squared_logarithmic_error(y_true, y_pred): first_log = np.log(np.clip(y_pred, 10e-6, None) + 1.) second_log = np.log(np.clip(y_true, 10e-6, None) + 1.) return np.mean(np.square(first_log - second_log), axis=-1)
(4) 平均绝对百分比误差损失函数
平均绝对百分比(Mean Absolute Percentage Error Loss, MAPE)误差损失函数定义如下:
代码示例
def mean_absolute_percentage_error(y_true, y_pred): diff = np.abs((y_pred - y_true) / np.clip(np.abs(y_true), 10e-6, None)) return 100 * np.mean(diff, axis=-1)
(5) 小结
均方误差损失函数是使用最广泛的,并且在大部分情况下,均方误差有着不错的性能,因此被用作损失函数的基本衡量指标。MAE 则会比较有效地惩罚异常值,如果数据异常值较多,需要考虑使用平均绝对误差损失作为损失函数。一般情况下,为了不让数据出现太多异常值,可以对数据进行预处理操作。
均方误差对数损失与均方误差的计算过程类似,多了对每个输出数据进行对数计算,目的是缩小函数输出的范围值。平均绝对百分比误差损失则计算预测值与真实值的相对误差。均方误差对数损失与平均绝对百分 比误差损失实际上是用来处理大范围数据( [ − 10 5 , 10 5 ]的,但是在神经网络中,我们常把输入数据归一化到一个合理范围 ( [ − 1 , 1 ]),然后再使用均方误差或者平均绝对误差损失来计算损失。
3 分类损失函数
(1) Logistic损失函数
Logistic损失函数定义如下:
(2) 负对数似然损失函数
负对数似然损失函数(Negative Log Likelihood Loss)定义如下:
(3) 交叉熵损失函数
Logistic损失函数和负对数似然损失函数只能处理二分类问题,对于两个分类扩展到M个分类,使用交叉熵损失函数(Cross Entropy Loss),其定义如下:
代码示例
def cross_entropy(y_true, y_pred): return -np.mean(y_true * np.log(y_pred + 10e-6))
(4) Hinge损失函数
运用 Hinge 损失的典型分类器是 SVM 算法,因为 Hinge 损失可以用来解决间隔最大化问题。当分类模型需要硬分类结果的,例如分类结果是 0 或 1 、 -1或 1 的二分类数据, Hinge 损失是最方便的选择 。Hinge 损失函数定义如下:
代码示例
def hinge(y_true, y_pred): return np.mean(np.maximum(1. - y_true * y_pred, 0.), axis=-1)
(5) 指数损失函数
使用指数(Exponential)损失函数的典型分类器是 AdaBoost 算法,指数损失函数的定义如下:
代码示例
def exponential(y_true, y_pred): return np.sum(np.exp(-y_true * y_pred))
4.神经网络中常用的损失函数
神经网络中的损失函数可以自定义,前提是需要考虑数据本身和用于求解的优化方案。换句话说,自定义损失函数需要考虑输入的数据形式和对损失函数求导的算法。自定义损失函数其实是有些难度的,在实际工程项目上,结合激活函数来选择损失函数是常见的做法,常用组合有以下 3 种 。
(1) ReLU + MSE
均方误差损失函数无法处理梯度消失问题,而使用 Leak ReLU 激活函数能够减少计算时梯度消失的问题,因此在神经网络中如果需要使用均方误差损失函数,一般采用 Leak ReLU 等可以减少梯度消失的激活函数。另外,由于均方误差具有普遍性,一般作为衡量损失值的标准,因此使用均方误差作为损失函数表现既不会太好也不至于太差。
(2) Sigmoid + Logistic
Sigmoid 函数会引起梯度消失问题:根据链式求导法,Sigmoid 函数求导后由多个[0, 1]范围的数进行连乘,如其导数形式为 ,当其中一个数很小时,连成后会无限趋近于零直至最后消失。而类 Logistic 损失函数求导时,加上对数后连乘操作转化为求和操作,在一定程度上避免了梯度消失,所以我们经常可以看到 Sigmoid 激活函数+交叉摘损失函数 的组合。
(3) Softmax + Logisitc
在数学上,Softmax 激活函数会返回输出类的互斥概率分布,也就是能把离散的输出转换为一个同分布互斥的概率,如(0.2, 0.8)。另外,Logisitc 损失函数是基于概率的最大似然估计函数而来的,因此输出概率化能够更加方便优化算法进行求导和计算,所以我们经常可以看到输出层使xu用 Softmax 激活函数+交叉熵损失函数 的组合。
损失函数学习参考:
深度学习-常用损失函数详细介绍_算法之美-CSDN博客_深度学习的损失函数
5.激活函数、损失函数、优化函数的区别
1.激活函数:将神经网络上一层的输入,经过神经网络层的非线性变换转换后,通过激活函数,得到输出。常见的激活函数包括:sigmoid, tanh, relu等。
[深度学习]神经网络的激活函数_北望花村-CSDN博客
2.损失函数:度量神经网络的输出的预测值,与实际值之间的差距的一种方式。常见的损失函数包括:最小二乘损失函数、交叉熵损失函数、回归中使用的smooth L1损失函数等。
3.优化函数:也就是如何把损失值从神经网络的最外层传递到最前面。如最基础的梯度下降算法,随机梯度下降算法,批量梯度下降算法,带动量的梯度下降算法,Adagrad,Adadelta,Adam等。
[深度学习]梯度下降算法、优化方法(SGD,Adagrad,Adam...)_北望花村-CSDN博客
六、CNN卷积神经网络
资料推荐:大话卷积神经网络CNN(干货满满)-CSDN博客
小白推荐文章:如何通俗易懂地解释卷积? - 知乎
卷积神经网络(Convolutional Neural Networks, CNN)是一类包含卷积计算且具有深度结构的前馈神经网络(Feedforward Neural Networks),是深度学习(deep learning)的代表算法之一 。目前 CNN 已经得到了广泛的应用,比如:人脸识别、自动驾驶、美图秀秀、安防等很多领域。
卷积神经网络 – CNN 最擅长的就是图片的处理。它受到人类视觉神经系统的启发。
CNN 特点:
能够有效的将大数据量的图片降维成小数据量。
能够有效的保留图片特征,符合图片处理的原则。
CNN两大核心:
卷积层最主要的两个特征就是局部连接和权值共享,有些地方又叫做稀疏连接和参数共享。
通过卷积操作实现局部连接,这个局部区域的大小就是滤波器filter,避免了全连接中参数过多造成无法计算的情况,
再通过参数共享来缩减实际参数的数量,为实现多层网络提供了可能。
1.局部连接:
一般认为图像的空间联系是局部的像素联系比较密切,而距离较远的像素相关性较弱,因此,每个神经元没必要对全局图像进行感知,只要对局部进行感知,然后在更高层将局部的信息综合起来得到全局信息。利用卷积层实现:(特征映射,每个特征映射是一个神经元阵列):从上一层通过局部卷积滤波器提取局部特征。卷积层紧跟着一个用来求局部平均与二次提取的计算层,这种二次特征提取结构减少了特征分辨率。
即网络部分连通,每个神经元只与上一层的部分神经元相连,只感知局部,而不是整幅图像。(滑窗实现)
2.参数共享:
在局部连接中,每个神经元的参数都是一样的,即:同一个卷积核在图像中都是共享的。(理解:卷积操作实际是在提取一个个局部信息,而局部信息的一些统计特性和其他部分是一样的,也就意味着这部分学到的特征也可以用到另一部分上。所以对图像上的所有位置,都能使用同样的学习特征。)卷积核共享有个问题:提取特征不充分,可以通过增加多个卷积核来弥补,可以学习多种特征。
对于一个100x100像素的图像,如果我们用一个神经元来对图像进行操作,这个神经元大小就是100x100=10000,单如果我们使用10x10的卷积核,我们虽然需要计算多次,但我们需要的参数只有10x10=100个,加上一个偏向b,一共只需要101个参数。我们取得图像大小还是100x100。
如果我们取得图像比较大,它的参数将会更加多。我们通过10*10的卷积核对图像进行特征提取,这样我们就得到一个Feature Map。
一个卷积核只能提取一个特征,所以我们需要多几个卷积核,假设我们有6个卷积核,我们就会得到6个Feature Map,将这6个Feature Map组成一起就是一个神经元。这6个Feature Map我们需要101*6=606个参数。这个值和10000比还是比较小的。
CNN网络介绍
以下主要介绍:卷积层、池化层、激活函数、全连接层概念及原理
1. 卷积层
卷积是一种有效提取图片特征的方法 。 一般用一个正方形卷积核,遍历图片上的每一个像素点。图片与卷积核重合区域内相对应的每一个像素值,乘卷积核内相对应点的权重,然后求和, 再加上偏置后,最后得到输出图片中的一个像素值。
图片分灰度图和彩色图,卷积核可以是单个也可以是多个,因此卷积操作分以下三种情况:
1.1 单通道输入,单卷积核
这里单通道指的是输入为灰度图,单卷积核值卷积核个数是1个。
上面是 5x5x1 的灰度图片,1 表示单通道,5x5 表示分辨率,共有 5 行5列个灰度值。若用一个 3x3x1 的卷积核对此 5x5x1 的灰度图片进行卷积,偏置项b=1,则求卷积的计算是:(-1)x1+0x0+1x2+(-1)x5+0x4+1x2+(-1)x3+0x4+1x5+1=1(注意不要忘记加偏置 1)。
1.2 多通道输入,单卷积核
多数情况下,输入的图片是 RGB 三个颜色组成的彩色图,输入的图片包含了红、绿、蓝三层数据,卷积核的深度(通道数)应该等于输入图片的通道数,所以使用 3x3x3的卷积核,最后一个 3 表示匹配输入图像的 3 个通道,这样这个卷积核有三通道,每个通道都会随机生成 9 个待优化的参数,一共有 27 个待优化参数 w 和一个偏置 b。
注:这里还是单个卷积核的情况,但是一个卷积核可以有多个通道。默认情况下,卷积核的通道数等于输入图片的通道数。
1.3 多通道输入,多卷积核
多通道输入、多卷积核是深度神经网络中间最常见的形式。指的是多通道输入,且用多个卷积核的情况。那么卷积过程其实也很简单,以3通道输入,2个卷积核为例:
(1)先取出一个卷积核与3通道的输入进行卷积,这个过程就和多通道输入,单卷积核一样,得到一个1通道的输出output1。同样再取出第二个卷积核进行同样的操作,得到第二个输出output2
(2)将相同size的output1与output2进行堆叠,就得到2通道的输出output。
为了更直观地理解,下面给出图示:
图中输入X:[1,h,w,3]指的是:输入1张高h宽w的3通道图片。
卷积核W:[k,k,3,2]指的是:卷积核尺寸为3*3,通道数为3,个数为2。
总结:
(1)卷积操作后,输出的通道数=卷积核的个数
(2)卷积核的个数和卷积核的通道数是不同的概念。每层卷积核的个数在设计网络时会给出,但是卷积核的通道数不一定会给出。默认情况下,卷积核的通道数=输入的通道数,因为这是进行卷积操作的必要条件。
卷积与同道解释参考:CNN卷积核与通道讲解
(3)偏置数=卷积核数
1.4 填充padding
为了使卷积操作后能得到满意的输出图片尺寸,经常会使用padding对输入进行填充操作。默认在图片周围填充0。
(1)全零填充padding='same’
使用same时,会自动对原图进行全0填充,当步长为1时,可以保证输出的图片与输入的图片尺寸一致。
输出尺寸计算公式:输入长/步长 (向上取整)
TensorFlow中实现如下:(这里以卷积核个数:48,卷积核尺寸:3,步长:1,全填充为例)
layers.Conv2D(48, kernel_size=3, strides=1, padding='same')
(2)不填充padding='valid’
使用valid时,不进行任何填充,直接进行卷积,这是layers.Conv2D()默认的方式。
输出尺寸计算公式:(输入长-核长)/步长+1 (向下取整)
TensorFlow中实现如下:
layers.Conv2D(48, kernel_size=3, strides=1, padding='valid')
(3)自定义填充
一般是从上下左右四个方向进行填充,且左、右填充的列数p w p_wpw一般相同,上、下填充的行数p h p_hph也应该相同。如下图所示:
输出尺寸计算公式:
其中,h,w为原图的高和宽,k是卷积核的尺寸,s是步长。
在TensorFlow2.0中,自定义填充过程中,padding参数的设置格式为:
padding=[ [0,0],[上,下],[左,右],[0,0] ]
# 例如要在上下左右各填充一个单位,实现如下:
layers.Conv2D(48, kernel_size=3, strides=1, padding=[[0,0], [1,1], [1,1], [0,0]])
2. 池化层
池化作用如下“
1.使卷积神经网络抽取特征是保证特征局部不变性。
2.池化操作能降低维度,减少参数数量。
3..池化操作优化比较简单。
在卷积层中,可以通过调节步长参数 s 实现特征图的高宽成倍缩小,从而降低了网络的参数量。实际上,除了通过设置步长,还有一种专门的网络层可以实现尺寸缩减功能,它就是我们要介绍的池化层(Pooling layer)。
池化层同样基于局部相关性的思想,通过从局部相关的一组元素中进行采样或信息聚合,从而得到新的元素值。通常我们用到两种池化进行下采样:
(1)最大池化(Max Pooling),从局部相关元素集中选取最大的一个元素值。
(2)平均池化(Average Pooling),从局部相关元素集中计算平均值并返回。
3. 激活函数
激活函数也是神经网络不可缺少的部分,激活函数是用来加入非线性因素,提高网络表达能力,卷积神经网络中最常用的是ReLU,Sigmoid使用较少。
具体如何选择合适的激活函数。可参考这篇博文:神经网络搭建:激活函数总结 或者上文介绍。
4.全连接层
全连接层FC,之所以叫全连接,是因为每个神经元与前后相邻层的每一个神经元都有连接关系。如下图所示,是一个简单的两层全连接网络,输入时特征,输出是预测的结果。
全连接层的参数量是可以直接计算的,计算公式如下:
按照上图搭建的两层全连接网络,要训练分辨率仅仅是 28x28=784 的黑白图像,就有近 40 万个待优化的参数。现实生活中高分辨率的彩色图像,像素点更多,且为红绿蓝三通道信息。待优化的参数过多, 容易导致模型过拟合。为避免这种现象,实际应用中一般不会将原始图片直接喂入全连接网络。
在实际应用中,会先对原始图像进行卷积特征提取,把提取到的特征喂给全连接网络,再让全连接网络计算出分类评估值。
5. 网络参数量与计算量
卷积层参数/卷积计算量
卷积参数 = 卷积核长度x卷积核宽度x输入通道数x输出通道数+输出通道数(偏置)
卷积计算量 = 输出数据大小x卷积核的尺度x输入通道数
例:输入:224x224x3,输出:224x244x64,卷积核:3x3
参数量 = 3x3x3x64+64
计算量 = 224x224x64x3x3x3
卷积层:
比如:输入是32x32x3的的彩色图片,经过卷积层:
layers.Conv2D(100, kernel_size=3, strides=1, padding='same')
(1)网络参数量
主要是卷积核的参数和偏置的参数: 3x3x3x100+100=2800
(2)计算量FLOPS
深度学习框架FLOPs的概念:Floating point operations,即浮点运算数量。
{32x32x[3x3+(3x3-1)]x3+32x32x(3-1)}x100
全连接层:
比如第一层节点数是5,第二层节点数是10,求网络参数量和计算量FLOPS
(1)网络参数量
网络参数量主要来源神经元连接权重和偏置:5x10+10=60
(2)计算量FLOPS
5x10+10=60
2015 年,Google 研究人员Sergey 等基于参数标准化设计了BN层。BN层提出后,广泛地应用在各种深度网络模型上,使得网络的超参数的设定更加自由,同时网络的收敛速度更快,性能也更好。
详细了解请看:神经网络搭建:BN层
6.卷积神经网络训练:
训练基本流程:
Step 1:用随机数初始化所有的卷积核和参数/权重
Step 2:将训练图片作为输入,执行前向步骤(卷积, ReLU,池化以及全连接层的前向传播)并计算每个类别的对应输出概率。
Step 3:计算输出层的总误差
Step 4:反向传播算法计算误差相对于所有权重的梯度,并用梯度下降法更新所有的卷积核和参数/权重的值,以使输出误差最小化
注:卷积核个数、卷积核尺寸、网络架构这些参数,是在 Step 1 之前就已经固定的,且不会在训练过程中改变——只有卷积核矩阵和神经元权重会更新。
和多层神经网络一样,卷积神经网络中的参数训练也是使用误差反向传播算法,关于池化层的训练,需要再提一下,是将池化层改为多层神经网络的形式
将卷积层也改为多层神经网络的形式
CNN详细求解:
CNN在本质上是一种输入到输出的映射,它能够学习大量的输入与输出之间的映射关系,而不需要任何输入和输出之间的精确的数学表达式,只要用已知的模式对卷积网络加以训练,网络就具有输入输出对之间的映射能力。
卷积网络执行的是监督训练,所以其样本集是由形如:(输入向量,理想输出向量)的向量对构成的。所有这些向量对,都应该是来源于网络即将模拟系统的实际“运行”结构,它们可以是从实际运行系统中采集来。
1)参数初始化:
在开始训练前,所有的权都应该用一些不同的随机数进行初始化。“小随机数”用来保证网络不会因权值过大而进入饱和状态,从而导致训练失败;“不同”用来保证网络可以正常地学习。实际上,如果用相同的数去初始化权矩阵,则网络无学习能力。
2)训练过程包括四步
① 第一阶段:前向传播阶段
从样本集中取一个样本,输入网络
计算相应的实际输出;在此阶段信息从输入层经过逐级的变换,传送到输出层,这个过程也是网络在完成训练之后正常执行时执行的过程
② 第二阶段:后向传播阶段
计算实际输出与相应的理想输出的差
按照极小化误差的方法调整权值矩阵
网络的训练过程如下:
选定训练组,从样本集中分别随机地寻求N个样本作为训练组;
将各权值、阈值,置成小的接近于0的随机值,并初始化精度控制参数和学习率;
从训练组中取一个输入模式加到网络,并给出它的目标输出向量;
计算出中间层输出向量,计算出网络的实际输出向量;
将输出向量中的元素与目标向量中的元素进行比较,计算出输出误差;对于中间层的隐单元也需要计算出误差;
依次计算出各权值的调整量和阈值的调整量;
调整权值和调整阈值;
当经历M后,判断指标是否满足精度要求,如果不满足,则返回(3),继续迭代;如果满足就进入下一步;
训练结束,将权值和阈值保存在文件中。这时可以认为各个权值已经达到稳定,分类器已经形成。再一次进行训练,直接从文件导出权值和阈值进行训练,不需要进行初始化。
七、经典网络介绍
LeNet-5
神经元个数=卷积核数量X输出特征图宽度X输出特征图高度
卷积层可训练参数数量=卷积核数量X(卷积核宽度X卷积核高度+1)(1表示偏置)
汇聚层可训练参数数量=卷积核数量X(1+1)(两个1分别表示相加后的系数和偏置,有的汇聚层无参数)
连接数=卷积核数量X(卷积核宽度X卷积核高度+1)X输出特征图宽度X输出特征图高度(1表示偏置)
全连接层连接数=卷积核数量X(输入特征图数量X卷积核宽度X卷积核高度+1)(输出特征图尺寸为1X1)
AlexNet
Inception网络
残差网络
详细网络介绍可参考这篇:
卷积神经网络超详细介绍_呆呆的猫的博客-CSDN博客_卷积神经网络
CNN总结
本文学习参考资料:
水很深的深度学习-Task04卷积神经网络CNN_GoAl的博客-CSDN博客
CNN 的价值:
能够将大数据量的图片有效的降维成小数据量(并不影响结果)
能够保留图片的特征,类似人类的视觉原理
CNN 的基本原理:
卷积层 – 主要作用是保留图片的特征
池化层 – 主要作用是把数据降维,可以有效的避免过拟合
全连接层 – 根据不同任务输出我们想要的结果
CNN 的实际应用:
图片分类、检索
目标定位检测
目标分割
人脸识别
骨骼识别
八、RNN循环神经网络
RNN 的基本原理
传统神经网络的结构比较简单:输入层 – 隐藏层 – 输出层。如下图所示:
RNN 跟传统神经网络最大的区别在于每次都会将前一次的输出结果,带到下一次的隐藏层中,一起训练。如下图所示:
RNN学习资料参考:
大话循环神经网络(RNN)
九、LSTM长短期记忆神经网络