numpy实现神经网络系列
工程地址:https://github.com/yizt/numpy_neuron_network
基础知识
0_1-全连接层、损失函数的反向传播
0_2_1-卷积层的反向传播-单通道、无padding、步长1
0_2_2-卷积层的反向传播-多通道、无padding、步长1
0_2_3-卷积层的反向传播-多通道、无padding、步长不为1
0_2_4-卷积层的反向传播-多通道、有padding、步长不为1
0_2_5-池化层的反向传播-MaxPooling、AveragePooling、GlobalAveragePooling、GlobalMaxPooling
0_3-激活函数的反向传播-ReLU、LeakyReLU、PReLU、ELU、SELU
0_4-优化方法-SGD、AdaGrad、RMSProp、Adadelta、Adam
DNN练习
1_1_1-全连接神经网络做线性回归
1_1_2-全连接神经网络做mnist手写数字识别
CNN练习
2_1-numpy卷积层实现
2_2-numpy池化层实现
2_3-numpy-cnn-mnist手写数字识别
本文目录
依赖知识
a) 熟悉全连接层、损失函数的反向传播
b) 熟悉卷积层的反向传播-多通道、有padding、步长不为1
c) 熟悉池化层Max Pooling、Average Pooling、Global Average Pooling、Global Max Pooling
d) 熟悉以上三点的依赖知识
约定说明
a)
l
代表网络的第
l
层,
zl
代表第
l
层输出,
zld,i,j
代表第
l
层第
d
通道
(i,j)
位置的值;
zl
的通道数为
Cl
, 高度和宽度分别为
Hl,W^l
(
避免与权重相同
)
b) 池化单元的大小为
(kl−11,kl−12)
; 池化单元的步长为
(sl−11,sl−12)
; padding为
(pl−11,pl−12)
c) 记
pzl−1
为l-1层增加零填充后的张量
d) 记损失函数L关于第
l
层输出
zl
的偏导为
δl=∂L∂zl
前向传播
Max Pooling和Average Pooling
最大池化和平均池化,最大池化和平均池化和平均池化前向过程完全一样,只是使用的函数不同。
根据以上约定,经过池化层后输出的高度
Hl
和宽度
W^l
分别为
(Hl−1+2⋅pl−11−kl−11)/sl−11+1
和
(W^l−1+2⋅pl−12−kl−12)/sl−12+1
因此最大池化的前向公式为:
zlc,i,j=maxi⋅sl−11≤m<i⋅sl−11+kl−11;j⋅sl−12≤n<j⋅sl−12+kl−12(pzl−1c,i,j)i∈[0,Hl−1],j∈[0,W^l−1](1)
平均池化的前向公式为:
zlc,i,j=∑m=i⋅sl−11i⋅sl−11+kl−11−1∑n=j⋅sl−12j⋅sl−12+kl−12−1(pzl−1c,i,j)/(kl−11⋅kl−12)i∈[0,Hl−1],j∈[0,W^l−1](2)
Global Max Pooling和Global Average Pooling
全局最大池化和全局平均池化更加简单,是对单个通道上所有的元素求最大值和均值。所以经过全局平均池化后输出就是一维的了。
因此全局最大池化的前向公式为:
zlc=max0≤m<Hl−1;0≤n<W^l−1(zl−1c,m,n)(3)
全局平均池化的前向公式为:
zlc=∑m=0Hl−1−1∑n=0W^l−1−1(zl−1c,i,j)/(Hl−1⋅W^l−1)(4)
反向传播
Max Pooling
设
I(c,a,b)={(i,j)|argmaxm,n(pzl−1c,i,j)i⋅sl−11≤m<i⋅sl−11+kl−11;j⋅sl−12≤n<j⋅sl−12+kl−12=(a,b)}
代表最大池化过程中c通道上所有在l-1层最大值坐标在
(a,b)
位置的坐标
(i,j)
(l层)的集合;
则损失函数L关于最大池化层的偏导如下:
∂L∂pzl−1c,a,b=∑(i,j)∈I(c,a,b)∂L∂zlc,i,j⋅∂zlc,i,j∂pzl−1z,a,b=∑(i,j)∈I(c,a,b)δlc,i,j(1)(5)
δl−1c=(∂L∂pzl−1c,a,b)pl−11≤a<Hl−1+pl−11; pl−12≤b<W^l−1+pl−12=(∑(i,j)∈I(c,a,b)δlc,i,j)pl−11≤a<Hl−1+pl−11; pl−12≤b<W^l−1+pl−12(2)(6)
注:设矩阵
A=(ai,j)m×n
则
(ai,j)2≤i<5;4≤j<8
代表高度为第2行到第5行,宽度为第4列到第8列组成的矩阵
Average Pooling
由公式(2)可知l层在高度i和宽度j上接收l-1层坐标范围分别是
[i⋅sl−11,i⋅sl−11+kl−11−1]和[j⋅sl−12,j⋅sl−12+kl−12−1]
; 即
{i⋅sl−11≤m≤i⋅sl−11+kl−11−1j⋅sl−12≤n≤j⋅sl−12+kl−12−1(7)
可以推知l-1层坐标(m,n)对应l层坐标范围是:
⎧⎩⎨⎪⎪⎪⎪⌊m−kl−11+1sl−11⌋≤i≤⌊msl−11⌋⌊n−kl−12+1sl−12⌋≤j≤⌊nsl−12⌋(8)
故则损失函数L关于平均池化层的偏导如下:
δl−1c=(∂L∂pzl−1c,m,n)pl−11≤m<Hl−1+pl−11; pl−12≤n<W^l−1+pl−12=(∑i∑jδlc,i,j/(kl−11⋅kl−12))pl−11≤m<Hl−1+pl−11; pl−12≤n<W^l−1+pl−12(3)(9)
其中(i,j)满足公式(8)的条件,并且大于等于0
Global Max Pooling
全局最大池化的反向公式如下
δl−1c,i,j={δlc;0;如果(i,j)=argmaxm,n(zc,m,n)其它(10)
注意第l层是一维的
Global Average Pooling
全局平均池化就是后一层梯度平均的分给前一层所有的神经元,反向公式如下:
δl−1c,i,j=δlc/(Hl⋅W^l−1)(12)