卷积神经网络组成:
input--CONV--ReLU--pooling--FC
输入层 -- 卷积层 -- 激活函数 -- 池化层 -- 全连接层
在这里需要指出的是:-- 卷积层 -- 激活函数 -- 池化层 -- 全连接层, 它的组合不唯一, 网上摘的图片:
由于它们的组合可以作出相应的改变, 所以使得卷积神经网络有很多不同的表达, 尤其是在深度上的提高.
卷积层
卷积层一般是由 3x3 或 5x5, 甚至是 11x11 的卷积核与传入数据进行卷积得到的, 下图是 3x3Filter 与绿色的图像做卷积的过程, 粉红色的图是卷积之后的结果.
局部感受野: 上图中的 3x3 卷积核, 先与图像中的左上角的 3x3 局部感受野做点积并将所有的结果进行加和才得到粉色图像中的第一个数字 4, 接着每移动一列进行一次内积并作加和, 直到所有的局部感受野处理完毕为止. 就得到了第一个卷积特征图. 在这里面的移动步长 S 为 1. 补充一下: 卷积核的行列值一般都是奇数. 上图的计算过程中不难发现, 输入图的矩阵的四个边只利用到了一次, 如果想要充分利用边上的特征就需要扩边. 在下图中就是对一个 RGB 图进行了边的扩充, 当然 RGB 是三维的, 所以可以利用三个卷积核对每一维进行卷积, 然后将所有的卷积结果进行相加, 即图中的绿色输出的第一个图的左上角数字 5 是由, w0 三个卷积核分别对不同维度做卷积后的结果的总和.
权值共享: 在我看来, 卷积的过程本身就是权值共享, 卷积核的大小决定了权值的数量, 卷积核就是权值的组合, 所以在卷积过程中每一个总的特征图都只用了同样的卷积核, 也就是权值共享. 所以为了能更好更充分多角度采集到图像的特征, 就对一个图选择多个卷积核做卷积, 进行特征提取.
卷积核 "矩阵" 值: 卷积神经网络的参数(权值), 卷积核初值随机生成, 通过反向传播更新.
卷积核数目: 卷积神经网络的 "宽度", 常见参数 64,128,256, 可以使 GPU 并行更加高效.
与传统神经网络相比 (参数 / 计算量) 更多还是更少? 答: 参数量变少了, 计算量变多了.
卷积层输出矩阵的大小:
sizeoutput=[(N+2P−F)/S]+1 其中 N 为输入图像的行数(通常行列相等),P 为扩充边界数量, F 为卷积核的行数(通常行列相等),S 为卷积滑动步长.
激活函数 ReLU (Rectified Linear Units)
为了方便记忆, 假设第一次卷积层结束就使用了激活函数, 常用的激活函数有 sigmoid,tanh,relu 等等, 前两者 sigmoid/tanh 比较常见于全连接层, 后者 ReLU 常见于卷积层.
在卷积神经网络中, 激活函数一般使用 ReLU(The Rectified Linear Unit, 修正线性单元), 它的特点是收敛快, 求梯度简单. 计算公式也很简单, max(0,T), 即对于输入的负值, 输出全为 0, 对于正值, 则原样输出. 如下图的从左至右使用激活函数的过程.
池化层
池化层一般是将激活之后的输出特征图进行将采用, 可以是均值采样, 可以是最大值采样, 也可以是中值采样, 池化的操作也很简单, 通常情况下, 池化区域是 2*2 大小, 然后按一定规则转换成相应的值, 例如取这个池化区域内的最大值 (max-pooling), 平均值(mean-pooling) 等, 以这个值作为结果的像素值.
下图 https://my.oschina.net/u/876354/blog/1620906 显示了左上角 2*2 池化区域的 max-pooling 结果, 取该区域的最大值作为池化后的结果, 接着移动两列取 2*2 池化区域的 max-pooling 结果, 直到第一行结束, 接着下移两行从左至右进行上一步的操作, 直到将图中的所有数据采集完, 如下图:
最大池化 (max-pooling) 保留了每一小块内的最大值, 也就是相当于保留了这一块最佳的匹配结果(因为值越接近 1 表示匹配越好). 也就是说, 它不会具体关注窗口内到底是哪一个地方匹配了, 而只关注是不是有某个地方匹配上了.
通过加入池化层, 图像缩小了, 能很大程度上减少计算量, 降低机器负载.
全连接层
全连接层在整个卷积神经网络中起到 "分类器" 的作用, 即通过卷积, 激活函数, 池化等深度网络后, 再经过全连接层对结果进行识别分类.
卷积神经网络的反向传播
以下内容均转自
已知池化层的推导上一层的δl-1, 这个过程一般称为 upsample
假设池化的 size 为 2*2,δl:
由于池化 size 为 2*2, 首先将 size 还原:
假设是最大池化, 并且之前记录的最大值的位置为左上, 右下, 右上, 左下. 那么δl-1:
解释下为什么要这么做, 在正向传播的时候, 池化之前的四个最大值位置左上, 右下, 右上, 左下, 都以比例为 1 的系数传递到下一层. 而其他位置对输出的贡献都为 0, 也就是说对池化输出没有影响, 因此比例系数可以理解为 0. 所以在正向传播的过程中, 最大值所在位置可以理解为通过函数 f(x)=x 传递到下一层, 而其他位置则通过 f(x)=0 传递到下一层, 并且把这些值相加构成下一层的输出, 虽然 f(x)=0 并没有作用, 但这样也就不难理解反向传播时, 把δl 的各个值移到最大值所在位置, 而其他位置为 0 了. 因为由 f(x)=x, 最大值位置的偏导数为 1, 而 f(x)=0 的偏导数为 0.
如果平均池化, 那么δl-1:
平均池化的话, 池化操作的四个位置传递到下一层的作用可以等价为 f(x)=x/4, 所以在方向传播过程中就相当于把δl 每一个位置的值乘 1/4 再还原回去.
所以由δl 推导δl-1 可以总结为:
等式右边第一项表示上采样, 第二项是激活函数的导数, 在池化中可以理解为常数 1(因为池化过程的正向传播过程中没有激活函数).
已知卷积层的δl 推导上一层的δl-1:
首先由链式法则:
rot180(wl)代表对卷积核进行翻转 180° 的操作,σ'(zl-1)为激活函数的导数. 这里比较难理解的是为什么要对卷积核进行 180° 的翻转.
假设我们 (l-1) 层的输出 (al-1) 是一个 3x3 矩阵, 第 l 层的卷积核 W 是一个 2x2 矩阵, 采用 1 像素的步幅, 则输出 zl 是一个 2x2 的矩阵. 这里暂时不考虑偏置项 b 的影响.
那么可得:
展开:
求 al 的梯度:
又由展开式:
a11 只与 z11 有关, 并且系数为 w11, 所以:
a12 只与 z11 和 z12 有关, 并且系数分别为 w11,w12, 所以:
同理:
使用矩阵形式表示就是:
这就解释了为什么在反向传播时需要将卷积核进行 180° 的翻转操作了.
已知卷积层的δl 推导 w,b 的梯度:
全连接层中的 w,b 的梯度与 DNN 中的推导一致, 池化层没有 w,b 参数, 所以不用进行 w,b 梯度的推导.
对于卷积层正向传播过程:
所以参数 w 的梯度:
注意到这里并没有翻转 180° 的操作:
因为由之前的展开式:
所以 w 的梯度:
这也就是没有进行翻转的原因.
b 的梯度:
这里假设 w=0, 那么 z=b, 梯度δl 是三维张量, 而 b 只是一个向量, 不能像普通网络中那样直接和δl 相等. 通常的做法是将误差δ的各个子矩阵的项分别求和, 得到一个误差向量所以这里 b 的梯度就是δl 的各个通道对应位置求和:
得到的是一个误差向量.
总结一下 CNN 的反向传播过程:
1 池化层的反向传播:
2 卷积层的反向传播
3 参数更新
来源: http://www.bubuko.com/infodetail-3286625.html