全连接层
通过计算每一个节点的偏导,就能计算得到每一个节点的误差梯度,将得到的损失值,反向应用到损失梯度,就达到了误差的反向传播过程
y1,y2并不符合概率分布,经过softmax处理,使得o1+02 = 1,一般来说最后一层的激活函数用softmax
损失函数计算 交叉熵损失
Oi*为真实值标签,Oi为预测值
如果是多分类问题 ,且经过softmax输出 交叉熵损失就是 H = O1*lnO1 + O2*lnO2 + ... 输出的类别是互斥的不可能归于多个类别 比如猫,狗
如果是二分类问题,最终经过sigmoid输出,交叉熵损失就是下面的第二个,由于是经过sigmoid输出会使得y1+y2 并不等于1,可以理解为y1为是人的概率,y2为是男人的概率,两个事件并不互斥
损失函数的反向传播
以w11_2 为例
w11_1代表从前一层第一个节点到当前层的第一个节点的权重,此时当前层为第一层(输入层为第0层)
w12_2代表从前一层第一个节点到当前层的第二个节点的权重,此时当前层为第二层
用求得的损失函数反过来影响w11_2,用梯度下降法,Loss对w11_2求偏导
计算过程为
权重更新
优化器介绍
首先我们很清楚用的数据并不是所有的数据集,由于内存和算力的限制只能分批次进行训练,
设置好学习率和迭代次数,使用部分数据集很难能得到最优的梯度方向,也就是算出的是局部最优而不是全局最优(需要用全部数据集进行训练)
举个例子 比如每次训练32个图 即batch = 32, 这使得此次计算的损失梯度方向是当前批次的最优方向
损失梯度方向是否是最优的,是否是损失减小最快的方向这是一个问题
我们介绍几种优化器
SGD
SGD+Momentum通过考虑之前的梯度方向,来更好地衡量现在的梯度方向,来抑制数据噪声的影响 我理解这存在两面性 如果最开始训练的数据是正确的那么会更好的抑制噪声数据造成的影响,那如果刚开始训练的数据是有问题的,那也会更慢的回到最优方向
Adagrad优化器(自适应学习率) St会越来越大,使得α会很小,迭代次数一定,会使得还没收敛就停止了训练,提前出现饱和的情况
RMSProp优化器(自适应学习率)
Adam优化器看公式有点类似SGD+Momentum与RMSProp的结合
利用BP神经网络做数字识别
读入一个彩色RGB图像(图一),每个像素包含三个分量(RGB分量),将其灰度化,使得每个像素只有一个分量(图2),再进行二制化,得到黑白图,黑_0[0000 0000],白_255[1111 1111],用一个滑动窗口(5*3) 去计算每个窗口中的白色像素占整个像素的百分比,会得到一个5*5的矩阵,矩阵再进行展开成一个1*25的行向量 也就是输入节点数
One-hot 编码 n个分类--->n列数 第几个分类就在第几个位置置1,其余位置置0
10个分类通过编码 会得到10个输出节点数
理解输入层节点数,输出层节点数
卷积层
滑动窗口在特征图上滑动并计算,将卷积核上的值与滑动窗口中的值相乘并相加
激活函数,引人非线性因素,使其具备解决非线性的能力
sigmoid激活函数 在接近饱和时 梯度值接近于0,
Relu激活函数 当反向传播过程中,有一个非常大的梯度经过时,会导致权重分布中心小于0经过Relu会始终等于0,无法更新权重
出现越界一般的策略就是补几列0值padding
这里 w = 4 S= 2 F = 3 P = 1 只加入P就可以了 2P指的是左右上下都加入padding
N = 2
池化层(subsample过程)
这个案例是 poolsize = 2*2 在每个2*2的滑动窗口中取最大值(图1)或者平均值(图2)
首先与卷积层不同的是池化层没有训练参数,我的理解是卷积核与池化核不同,卷积核里面有数值,卷积核与滑动窗口进行运算,卷积层有训练参数
只改变特征矩阵的我w,h 不改变深度 比如下图是4*4*3 ,池化核是2*2最终得到的结果是2*2*3
一边来说步长stride与池化核大小poolsize相等