前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >CNN中的反向传播

CNN中的反向传播

作者头像
mathor
发布2020-02-20 11:52:08
7750
发布2020-02-20 11:52:08
举报
文章被收录于专栏:mathormathor

Pooling层的反向传播

我们知道Pooling操作会使得feature map的尺寸发生变化,假如做$2\times 2$的池化,假设$l+1$层的feature map有16个梯度,那么第$l$层应该需要64个梯度,做法很简单,只需要把1个像素的梯度反向传给4个像素即可,但是要保证传递的梯度总和不变。由于有这条原则,因此avg pooling和max pooling的反向传播并不相同

1. avg pooling

avg pooling的前向传播就是把一个patch(窗口)内的值求和取平均。那么反向传播的过程就是把某个元素的梯度等分成n份,分配给前一层,这样就保证了池化前后的梯度之和保持不变,还是比较好理解的,图示如下

avg pooling比较容易让人理解错的地方就是以为梯度直接复制N遍,但是这样会造成loss之和变为原来的N倍,网络会发生梯度爆炸

2. max pooling

max pooling也要满足梯度之和不变的原则,max pooling的前向传播是把patch中最大的值传给后一层,而其他像素的值直接被舍弃掉。那么反向传播也就是把这个梯度直接传给前一层某一像素,儿其它像素不接受梯度,也就是0。max pooling和avg pooling操作的不同点在于需要记录池化时,到底哪个像素的值是最大的,也就是max_id,这个可以看caffe的源码的pooling_layer.cpp,下面是caffe框架max pooling部分的源码

代码语言:javascript
复制
// If max pooling, we will initialize the vector index part
if (this->layer_param_.pooling_param().pool() == PoolingParameter_PoolMethod_MAX
    && top.size() == 1) {
    max_idx_.Reshape(bottom[0]->num, channels_, pooled_height_, pooled_width_);
}    

源码中有一个名为max_idx_的变量,这个变量记录的就是最大值所在的位置,因为在反向传播中要用到。前向传播和反向传播的过程如下图所示

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • Pooling层的反向传播
    • 1. avg pooling
      • 2. max pooling
      领券
      问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档