卷积神经网络推导-批量图片矩阵计算

之前推导LeNet-5网络输入单个图像数据的前后向传播,现在实现批量图像数据的前后向传播

计算符号

  • 表示批量数据
  • 表示深度
  • 表示高度
  • 表示宽度
  • 表示第层输出数据体

通道转换

使用OpenCVPIL读取一张图片,保存为numpy ndarray结构,图像尺寸前3位分别表示长度、宽度和深度:

批量处理图像数据相当于在深度上进行累加,为方便计算,先转换成深度、长度和宽度:

网络输出

对输入层

对卷积层

对池化层

对卷积层

对池化层

对卷积层

对全连接层

对输出层

前向计算

输入层

卷积层

共6个滤波器,每个滤波器空间尺寸为,步长为, 零填充为

输出空间尺寸为

所以单次卷积操作的向量大小为,单个滤波器有个局部连接,张图片有个局部连接

重置大小,输出数据体

池化层

执行运算,每个滤波器空间尺寸,步长为

输出空间尺寸为

所以单次操作的向量大小为,单个滤波器有个局部连接, 张图片有个局部连接

,每个值表示单次局部连接最大值下标

重置大小,输出数据体

卷积层

共16个滤波器,每个滤波器空间尺寸为,步长为, 零填充为

输出空间尺寸为

所以单次卷积操作的向量大小为,单个滤波器有个局部连接, 张图片有个局部连接

重置大小,输出数据体

池化层

执行运算,每个滤波器空间尺寸,步长为

输出空间尺寸为

所以单次操作的向量大小为,单个滤波器有个局部连接, 张图片有个局部连接

,每个值表示单次局部连接最大值下标

重置大小,输出数据体

卷积层

共120个滤波器,每个滤波器空间尺寸为,步长为, 零填充为

输出空间尺寸为

所以单次卷积操作的向量大小为,单个滤波器有个局部连接, 张图片有个局部连接

输出数据体

全连接层

神经元个数为

输出数据体

输出层

神经元个数为

输出数据体

分类概率

都是全向量

损失值

,仅有正确类别为1, 其余为0

反向传播

输出层

求输入向量梯度

其他梯度

求权重矩阵梯度

求偏置向量梯度

,表示的行数

求上一层输出向量梯度

全连接层

求输入向量梯度

其他梯度

求权重矩阵梯度

求偏置向量梯度

,表示的行数

求上一层输出向量梯度

卷积层

求输入向量梯度

其他梯度

求权重矩阵梯度

求偏置向量梯度

, 表示的行数

求上一层输出向量梯度

池化层

计算梯度

因为,卷积层滤波器空间尺寸为,和激活图大小一致,所以梯度是梯度矩阵的向量化

上一层输出向量梯度

配合,最大值梯度和一致,其余梯度为

卷积层

计算梯度

因为,池化层滤波器空间尺寸为,步长为,按照采样顺序将梯度重置回梯度,再重置为梯度

求输入向量梯度

$$
d(dataloss)
=tr(D_{y^{(3)}}f(y^{(3)})\cdot dy^{(3)})\
=tr(D_{y^{(3)}}f(y^{(3)})\cdot (1(z^{(3)} \geq 0)dz^{(3)}))\
=tr(D_{y^{(3)}}f(y^{(3)})
1(z^{(3)} \geq 0)^{T}\cdot dz^{(3)})
$$

其他梯度

求权重矩阵梯度

求偏置向量梯度

,表示的行数

求上一层输出向量梯度

池化层

计算梯度

因为,卷积层滤波器空间尺寸为,步长为,所以按照采样顺序将梯度重置回梯度,再重置为梯度

上一层输出向量梯度

配合,最大值梯度和一致,其余梯度为

卷积层

计算梯度

因为,池化层滤波器空间尺寸为,步长为,按照采样顺序将梯度重置回梯度,再重置为梯度

求输入向量梯度

$$
d(dataloss)
=tr(D_{y^{(1)}}f(y^{(1)})\cdot dy^{(1)})\
=tr(D_{y^{(1)}}f(y^{(1)})\cdot (1(z^{(1)} \geq 0)dz^{(1)}))\
=tr(D_{y^{(1)}}f(y^{(1)})
1(z^{(1)} \geq 0)^{T}\cdot dz^{(1)})
$$

其他梯度

求权重矩阵梯度

求偏置向量梯度

, 表示的行数

小结

矩阵计算的优缺点

  • 优点:逻辑简单,易于理解
  • 缺点:占用额外内存(因为计算过程中每层数据体的值都应用在矩阵多个位置

相关阅读