没有合适的资源?快使用搜索试试~ 我知道了~
资源详情
资源评论
资源推荐
最大值池化层梯度反向传播
最大值池化层梯度反向传播类似于ReLU激活层梯度反向传播。
ReLU是求max(0,x)的偏导数,最大池化层是求f=max(a,b,c,d)的偏导数,其中a,b,c,d
是输入2*2窗口的数据。对于该函数的偏导数,对a,b,c,d种最大值的梯度为1,其他为0。
代码实现如下:
首先定义一些超参数并随机生成一些必要的数据,这些数据能在正向计算中获得。
1 importnumpyasnp
2 #设置超参数并随机生成一些必要的数据
3 (batch,in_height,in_width,in_depth)=(8,32,48,16)
4 filter_size=2
5 filter_size2=filter_size**2
6 stride=2
7 out_height=(in_height‐filter_size)//stride+1
8 out_width=(in_width‐filter_size)//stride+1
9 out_depth=in_depth
10 out_size=out_height*out_width
11
12 dout_data=np.random.randn(batch,out_height,out_width,out_depth)#是
上次梯度反向传播得到的,是输入梯度
13 matric_data_max_pos=np.random.randn(out_size*in_depth*batch,filter_si
ze)
14 #matric_data_max_pos记录输入特征图中最大值的位置,尺寸是变换后的大矩阵,每
行只有局部窗口4个元素,从正向传播中得到
15 matric_data_max_pos=matric_data_max_pos>0#模拟最大值位置,一个元素为b
ool类型的矩阵
16 matric_data_not_max_pos=~matric_data_max_pos#对matric_data_max_pos取
反,即得到非最大值的位置,因为非最大值位置处的梯度为0
17 din_data=np.zeros((batch,in_height,in_width,in_depth),dtype=np.flo
at64)#输入特征图梯度,需要通过计算得到
然后遍历每一个特征图的局部窗口,将din_data最大值位置处的梯度赋值为dout_data,
将非最大值位置的梯度赋值为0
1 #将din_data最大位置处的梯度赋值为dout_data,将非最大值位置处的梯度赋值为0
2 height_ef=in_height‐filter_size+1
3 width_ef=in_width‐filter_size+1
4 fori_batchinrange(batch):
5 i_batch_size=i_batch*out_size*in_depth
6 fori_h_out,i_heightinzip(range(out_height),range(0,height_ef,strid
e)):
7 i_height_size=i_batch_size+i_h_out*out_width*in_depth
马李灵珊
- 粉丝: 33
- 资源: 297
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功
评论0