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

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

计算符号

  • N表示批量数据
  • C表示深度
  • H表示高度
  • W表示宽度
  • outputx表示第x层输出数据体

通道转换

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

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

网络输出

对输入层

XRN×C0×H0×W0=RN×1×32×32

对卷积层C1

output(1)RN×C1×H1×W1=RN×6×28×28

对池化层S2

output(2)RN×C2×H2×W2=RN×6×14×14

对卷积层C3

output(3)RN×C3×H3×W3=RN×16×10×10

对池化层S4

output(4)RN×C4×H4×W4=RN×16×5×5

对卷积层C5

output(5)RN×C5×H5×W5=RN×120

对全连接层F6

output(6)RN×C6×H6×W6=RN×84

对输出层F7

output(7)RN×C7×H7×W7=RN×10

前向计算

输入层

XRN×1×32×32

卷积层C1

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

输出空间尺寸为(32520)/1+1=28

所以单次卷积操作的向量大小为155=25,单个滤波器有2828=784个局部连接,N张图片有N784个局部连接

a(0)R(N784)×25W(1)R25×6b(1)R1×6z(1)=a(0)W(1)+b(1)R(N784)×6y(1)=relu(z(1))R(N784)×6

重置y(1)大小,输出数据体output(1)RN×6×28×28

池化层S2

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

输出空间尺寸为(282)/2+1=14

所以单次max操作的向量大小为22=4,单个滤波器有61414=1176个局部连接, N张图片有N1176个局部连接

a(1)R(N1176)×4z(2)=max(a(1))R(N1176)

argz(2)=argmax(a(1))R(N1176),每个值表示单次局部连接最大值下标

重置z(2)大小,输出数据体output(2)RN×6×14×14

卷积层C3

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

输出空间尺寸为(145+20)/1+1=10

所以单次卷积操作的向量大小为556=150,单个滤波器有1010=100个局部连接, N张图片有N100个局部连接

a(2)R(N100)×150W(3)R150×16b(3)R1×16z(3)=a(2)W(3)+b(3)R(N100)×16y(3)=relu(z(3))R(N100)×16

重置y(3)大小,输出数据体output(3)RN×16×10×10

池化层S4

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

输出空间尺寸为(102)/2+1=5

所以单次max操作的向量大小为22=4,单个滤波器有1655=400个局部连接, N张图片有N400个局部连接

a(3)R(N400)×4z(4)=max(a(3))R(N400)

argz(4)=argmax(a(3))R(N400),每个值表示单次局部连接最大值下标

重置z(4)大小,输出数据体output(4)RN×16×5×5

卷积层C5

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

输出空间尺寸为(55+20)/1+1=1

所以单次卷积操作的向量大小为5516=400,单个滤波器有11=1个局部连接, N张图片有N1个局部连接

a(4)RN×400W(5)R400×120b(5)R1×120z(5)=a(4)W(5)+b(5)RN×120y(5)=relu(z(5))RN×120

输出数据体output(5)RN×120

全连接层F6

神经元个数为84

a(5)=y(5)RN×120W(6)R120×84b(6)R1×84z(6)=a(5)W(6)+b(6)RN×84y(6)=relu(z(6))RN×84

输出数据体output(6)RN×84

输出层F7

神经元个数为10

a(6)=y(6)RN×84W(7)R84×10b(7)R1×10z(7)=a(6)W(7)+b(7)RN×10

输出数据体output(7)RN×10

分类概率

probs=h(z(7))=exp(z(7))exp(z(7))ABT

AR10×1,BR10×1都是全1向量

损失值

dataLoss=1N1Tlnexp(z(7)YA)exp(z(7))A

regLoss=0.5reg(||W(1)||2+||W(3)||2+||W(5)||2+||W(6)||2+||W(7)||2)

J(z(7))=dataLoss+regLoss

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

反向传播

输出层F7

求输入向量z(7)梯度

d(dataloss)=d(1N1Tlnexp(z(7)YA)exp(z(7))A)=tr(1N(probsTYT)dz(7))

Dz(7)f(z(7))=1N(probsTYT)R10×Nz(7)f(z(7))=1N(probsY)RN×10

其他梯度

z(7)=a(6)W(7)+b(7)dz(7)=da(6)W(7)+a(6)dW(7)+db(7)

d(dataloss)=tr(Dz(7)f(z(7))dz(7))=tr(Dz(7)f(z(7))(da(6)W(7)+a(6)dW(7)+db(7)))=tr(Dz(7)f(z(7))da(6)W(7))+tr(Dz(7)f(z(7))a(6)dW(7))+tr(Dz(7)f(z(7))db(7)))

求权重矩阵W(7)梯度

d(dataloss)=tr(Dz(7)f(z(7))a(6)dW(7))

DW(7)f(W(7))=Dz(7)f(z(7))a(6)W(7)f(W(7))=(a(6))Tz(7)f(z(7))=R84×10RN×10=R84×10

求偏置向量b(7)梯度

d(dataloss)=tr(1Mi=1MDz(7)f(z(7))db(7)))

Db(7)f(b(7))=1Mi=1MDz(7)f(z(7))b(7)f(b(7))=1Mi=1Mz(7)f(z(7))R1×10

M=N,表示dz(7)的行数

求上一层输出向量a(6)梯度

d(dataloss)=tr(Dz(7)f(z(7))da(6)W(7))=tr(W(7)Dz(7)f(z(7))da(6))

Da(6)f(a(6))=W(7)Dz(7)f(z(7))a(6)f(a(6))=z(7)f(z(7))(W(7))T=RN×10R10×84=RN×84

全连接层F6

求输入向量z(6)梯度

a(6)=y(6)=relu(z(6))da(6)=1(z(6)0)dz(6)

d(dataloss)=tr(Da(6)f(a(6))da(6))=tr(Da(6)f(a(6))(1(z(6)0)dz(6)))=tr(Da(6)f(a(6))1(z(6)0)Tdz(6))

Dz(6)f(z(6))=Da(6)f(a(6))1(z(6)0)Tz(6)f(z(6))=a(6)f(a(6))1(z(6)0)RN×84

其他梯度

z(6)=a(5)W(6)+b(6)dz(6)=da(5)W(6)+a(5)dW(6)+db(6)

d(dataloss)=tr(Dz(6)f(z(6))dz(6))=tr(Dz(6)f(z(6))(da(5)W(6)+a(5)dW(6)+db(6)))=tr(Dz(6)f(z(6))da(5)W(6))+tr(Dz(6)f(z(6))a(5)dW(6))+tr(Dz(6)f(z(6))db(6)))

求权重矩阵w(6)梯度

d(dataloss)=tr(Dz(6)f(z(6))a(5)dW(6))

DW(6)f(W(6))=Dz(6)f(z(6))a(5)W(6)f(W(6))=(a(5))Tz(6)f(z(6))=R120×NRN×84=R120×84

求偏置向量b(6)梯度

d(dataloss)=tr(1Mi=1MDz(6)f(z(6))db(6)))

Db(6)f(b(6))=1Mi=1MDz(6)f(z(6))b(6)f(b(6))=1Mi=1Mz(6)f(z(6))R1×84

M=N,表示dz(6)的行数

求上一层输出向量a(5)梯度

d(dataloss)=tr(Dz(6)f(z(6))da(5)W(6))=tr(W(6)Dz(6)f(z(6))da(5))

Da(5)f(a(5))=W(6)Dz(6)f(z(6))a(5)f(a(5))=z(6)f(z(6))(W(6))T=RN×84R84×120=RN×120

卷积层C5

求输入向量z(5)梯度

a(5)=y(5)=relu(z(5))da(5)=1(z(5)0)dz(5)

d(dataloss)=tr(Da(5)f(a(5))da(5))=tr(Da(5)f(a(5))(1(z(5)0)dz(5)))=tr(Da(5)f(a(5))1(z(5)0)Tdz(5))

Dz(5)f(z(5))=Da(5)f(a(5))1(z(5)0)Tz(5)f(z(5))=a(5)f(a(5))1(z(5)0)RN×120

其他梯度

z(5)=a(4)W(5)+b(5)dz(5)=da(4)W(5)+a(4)dW(5)+db(5)

d(dataloss)=tr(Dz(5)f(z(5))dz(5))=tr(Dz(5)f(z(5))(da(4)W(5)+a(4)dW(5)+db(5)))=tr(Dz(5)f(z(5))da(4)W(5))+tr(Dz(5)f(z(5))a(4)dW(5))+tr(Dz(5)f(z(5))db(5)))

求权重矩阵W(5)梯度

d(dataloss)=tr(Dz(5)f(z(5))a(4)dW(5))

DW(5)f(W(5))=Dz(5)f(z(5))a(4)W(5)f(W(5))=(a(4))Tz(5)f(z(5))=R400×NRN×120=R400×120

求偏置向量b(5)梯度

d(dataloss)=tr(1Mi=1MDz(5)f(z(5))db(5))

Db(5)f(b(5))=1Mi=1MDz(5)f(z(5))b(5)f(b(5))=1Mi=1Mz(5)f(z(5))R1×120

M=N, 表示dz(5)的行数

求上一层输出向量a(4)梯度

d(dataloss)=tr(Dz(5)f(z(5))da(4)W(5))=tr(W(5)Dz(5)f(z(5))da(4))

Da(4)f(a(4))=W(5)Dz(5)f(z(5))a(4)f(a(4))=z(5)f(z(5))(W(5))T=RN×120R120×400=RN×400

池化层S4

计算z(4)梯度

因为a(4)RN×400output(4)RN×16×5×5z(4)R(N400),卷积层C5滤波器空间尺寸为5×5,和激活图大小一致,所以z(4)梯度是a(4)梯度矩阵的向量化

dz(4)=dvec(a(4))

Dz(4)f(z(4))=vec(Da(4)f(a(4)))z(4)f(z(4))=vec(a(4)f(a(4)))

上一层输出向量a(3)梯度

z(4)=max(a(3))dz(4)=1(a(3) is the max)da(3)

配合argz(4),最大值梯度和z(4)一致,其余梯度为0

d(dataloss)=tr(Dz(4)f(z(4))dz(4))=tr(Dz(4)f(z(4))1(a(3) is the max)da(3))=tr(Dz(4)f(z(4))1(a(3) is the max)Tda(3)

Da(3)f(a(3))=Dz(4)f(z(4))1(a(3) is the max)Ta(3)f(a(3))=z(4)f(z(4))1(a(3) is the max)R(N400)×4

卷积层C3

计算y(3)梯度

因为a(3)R(N400)×4output(3)RN×16×10×10y(3)R(N100)×16,池化层S4滤波器空间尺寸为5×5,步长为1,按照采样顺序将a(3)梯度重置回output(3)梯度,再重置为y(3)梯度

求输入向量z(3)梯度

y(3)=relu(z(3))dy(3)=1(z(3)0)dz(3)

d(dataloss)=tr(Dy(3)f(y(3))dy(3))=tr(Dy(3)f(y(3))(1(z(3)0)dz(3)))=tr(Dy(3)f(y(3))1(z(3)0)Tdz(3))

Dz(3)f(z(3))=Dy(3)f(y(3))1(z(3)0)Tz(3)f(z(3))=y(3)f(y(3))1(z(3)0)R(N100)×16

其他梯度

z(3)=a(2)W(3)+b(3)dz(3)=da(2)W(3)+a(2)dW(3)+db(3)

d(dataloss)=tr(Dz(3)f(z(3))dz(3))=tr(Dz(3)f(z(3))(da(2)W(3)+a(2)dW(3)+db(3)))=tr(Dz(3)f(z(3))da(2)W(3))+tr(Dz(3)f(z(3))a(2)dW(3))+tr(Dz(3)f(z(3))db(3)))

求权重矩阵W(3)梯度

d(dataloss)=tr(Dz(3)f(z(3))a(2)dW(3))

DW(3)f(W(3))=Dz(3)f(z(3))a(2)W(3)f(W(3))=(a(2))Tz(3)f(z(3))=R150×(N100)R(N100)×16=R150×16

求偏置向量b(3)梯度

d(dataloss)=1Mi=1Mtr(Dz(3)f(z(3))db(3))

Db(3)f(b(3))=1Mi=1MDz(3)f(z(3))b(3)f(b(3))=1Mi=1Mz(3)f(z(3))=R1×16

M=N100,表示dz(3)的行数

求上一层输出向量a(2)梯度

d(dataloss)=tr(Dz(3)f(z(3))da(2)W(3))=tr(W(3)Dz(3)f(z(3))da(2))

Da(2)f(a(2))=W(3)Dz(3)f(z(3))a(2)f(a(2))=z(3)f(z(3))(W(3))T=R(N100)×16R16×150=R(N100)×150

池化层S2

计算z(2)梯度

因为a(2)R(N100)×150output(2)RN×6×14×14z(2)R(N1176),卷积层C3滤波器空间尺寸为5×5,步长为1,所以按照采样顺序将a(2)梯度重置回output(2)梯度,再重置为z(2)梯度

上一层输出向量a(1)梯度

z(2)=max(a(1))dz(2)=1(a(1) is the max)da(1)

配合argz(2),最大值梯度和z(2)一致,其余梯度为0

d(dataloss)=tr(Dz(2)f(z(2))dz(2))=tr(Dz(2)f(z(2))1(a(1) is the max)da(1))=tr(Dz(2)f(z(2))1(a(1) is the max)Tda(1)

Da(1)f(a(1))=Dz(2)f(z(2))1(a(1) is the max)Ta(1)f(a(1))=z(2)f(z(2))1(a(1) is the max)R(N1176)×4

卷积层C1

计算y(1)梯度

因为a(1)R(N1176)×4output(1)RN×6×28×28y(1)R(N784)×6,池化层S2滤波器空间尺寸为2×2,步长为2,按照采样顺序将a(1)梯度重置回output(1)梯度,再重置为y(1)梯度

求输入向量z(1)梯度

y(1)=relu(z(1))dy(1)=1(z(1)0)dz(1)

d(dataloss)=tr(Dy(1)f(y(1))dy(1))=tr(Dy(1)f(y(1))(1(z(1)0)dz(1)))=tr(Dy(1)f(y(1))1(z(1)0)Tdz(1))

Dz(1)f(z(1))=Dy(1)f(y(1))1(z(1)0)Tz(1)f(z(1))=y(1)f(y(1))1(z(1)0)RN×784×6

其他梯度

z(1)=a(0)W(1)+b(1)dz(1)=da(0)W(1)+a(0)dW(1)+db(1)

d(dataloss)=tr(Dz(1)f(z(1))dz(1))=tr(Dz(1)f(z(1))(da(0)W(1)+a(0)dW(1)+db(1)))=tr(Dz(1)f(z(1))da(0)W(1))+tr(Dz(1)f(z(1))a(0)dW(1))+tr(Dz(1)f(z(1))db(1)))

求权重矩阵W(1)梯度

d(dataloss)=tr(Dz(1)f(z(1))a(0)dW(1))

DW(1)f(W(1))=Dz(1)f(z(1))a(0)W(1)f(W(1))=(a(0))Tz(1)f(z(1))=R25×(N784)R(N×784)×6=R25×6

求偏置向量b(1)梯度

d(dataloss)=1Mi=1Mtr(Dz(1)f(z(1))db(1))

Db(1)f(b(1))=1Mi=1MDz(1)f(z(1))b(1)f(b(1))=1Mi=1Mz(1)f(z(1))R1×6

M=N784, 表示dz(1)的行数

小结

矩阵计算的优缺点

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

相关阅读