关键词:反向传播(BP);caffe源码;im2col;卷积;反卷积;上池化;上采样

公式推导

以前看到一长串的推导公式就想直接跳过,今天上午莫名有耐心,把书上的公式每一步推导自己算一遍,感觉豁然开朗。遂为此记。

sigmoid函数求导比relu复杂一点。如果采用relu,神经元输入和输出的导数就为1,计算更方便。
因为更新的原则是朝着损失降低最快的方向更新,可以把w看成是自变量,系数的计算就是反向传播的过程,系数越大,降低越快。


Caffe 源码解读

前向传播源码:

//前向传播
template <typename Dtype>
void ConvolutionLayer<Dtype>::Forward_cpu(const vector<Blob<Dtype>*>& bottom,const vector<Blob<Dtype>*>& top) {//blobs_[0]保存权值, blobs_[1]保存偏置const Dtype* weight = this->blobs_[0]->cpu_data();//bottom.size()是bottom中blob的数量,等于top中blob的数量,一般情况下为1for (int i = 0; i < bottom.size(); ++i) {//获取输入,输出数据指针const Dtype* bottom_data = bottom[i]->cpu_data();Dtype* top_data = top[i]->mutable_cpu_data();//第n张图片for (int n = 0; n < this->num_; ++n) {//卷积操作,采用矩阵乘积实现// bottom_dim_ =3*28*28// kernel = 20*5*5// top_dim_ = 20*24*24this->forward_cpu_gemm(bottom_data + n * this->bottom_dim_, weight,top_data + n * this->top_dim_);if (this->bias_term_) {const Dtype* bias = this->blobs_[1]->cpu_data();//加上偏置this->forward_cpu_bias(top_data + n * this->top_dim_, bias);}}}
}

反向传播源码:

//反向传播
template <typename Dtype>
void ConvolutionLayer<Dtype>::Backward_cpu(const vector<Blob<Dtype>*>& top,const vector<bool>& propagate_down/*是否反传*/, const vector<Blob<Dtype>*>& bottom) {const Dtype* weight = this->blobs_[0]->cpu_data();Dtype* weight_diff = this->blobs_[0]->mutable_cpu_diff();for (int i = 0; i < top.size(); ++i) {//上一层传下来的导数const Dtype* top_diff = top[i]->cpu_diff();const Dtype* bottom_data = bottom[i]->cpu_data();//传给下一层的导数Dtype* bottom_diff = bottom[i]->mutable_cpu_diff();// Bias gradient, if necessary.// 更新偏置,直接加上残差(每个偏置所对应的图内所有残差之和)if (this->bias_term_ && this->param_propagate_down_[1]) {Dtype* bias_diff = this->blobs_[1]->mutable_cpu_diff();for (int n = 0; n < this->num_; ++n) {this->backward_cpu_bias(bias_diff, top_diff + n * this->top_dim_);}}if (this->param_propagate_down_[0] || propagate_down[i]) {for (int n = 0; n < this->num_; ++n) {// gradient w.r.t. weight. Note that we will accumulate diffs.// 对weight 计算导数(用来更新weight)// /将下一层残差与weight进行相关计算,得到卷积层的残差if (this->param_propagate_down_[0]) {this->weight_cpu_gemm(bottom_data + n * this->bottom_dim_,top_diff + n * this->top_dim_, weight_diff);}// gradient w.r.t. bottom data, if necessary.// 对bottom数据计算导数(传给下一层)// bottom_data与top_diff做相关计算,得到w权值更新量if (propagate_down[i]) {this->backward_cpu_gemm(top_diff + n * this->top_dim_, weight,bottom_diff + n * this->bottom_dim_);}}}}
}

所以也就更好理解为什么
bottom_data * top_diff = weight_diff
top_diff * weight = bottom_diff

真实的过程应该是一个不断的循环

bottom_data * top_diff = weight_diff(用于更新当前层的权值)
top_diff * weight = bottom_diff (传递到下一层)
(上一层的bottom_diff 是下一层的top_diff )
bottom_data * top_diff = weight_diff (用于更新当前层的权值)
top_diff * weight = bottom_diff(继续传递到下一层)


关于提升卷积速度(im2col)

卷积核横向展开为1行

将多个通道应用卷积核的相同位置区域(3维数据)纵向展开为一列

案例1: 前向传播
kernel size:20 * 5 * 5
input blob:1 * 28 * 28
output blob:20 * 24 * 24(576)

kernel size:50 * 5 * 5
input blob:20 * 12 * 12
output blob:50 * 8 * 8

参考链接

案例2(前向传播、计算bottom_diff、计算weight_diff):

核心思想:
将卷积核展开成行。
将不同图片相同位置的卷积区域提取成列。
定格位置的数目即输出特征图像的大小。

反向传播过程中pad的问题
假设输入特征图 m * m,输出特征图 n * n
卷积过程pad(p) ,stride(s) =1 ,kernel (k)
n = (m+2p-k)/ s +1
m - n = k -1-2p
若 p = (k-1)/ 2,m = n
若 p != (k-1)/ 2,要考虑补边。


卷积与反卷积

卷积过程:

反卷积过程:

卷积 | 反向传播 | 反卷积 | 导向反向传播 | 的区别

  • 反向传播要记录先前输入大于0的位置,反卷积只考虑梯度
  • 反卷积的参数需要学习,反向传播用的是既有参数。

上池化 | 上采样 | 反卷积 | 的区别

上池化(UnPooling)、上采样(UnSampling)、反卷积(Deconvolution)

图(a)表示UnPooling的过程,特点是在Maxpooling的时候保留最大值的位置信息,之后在unPooling阶段使用该信息扩充Feature Map,除最大值位置以外,其余补0。
与之相对的是图(b),两者的区别在于UnSampling阶段没有使用MaxPooling时的位置信息,而是直接将内容复制来扩充FeatureMap。从图中即可看到两者结果的不同。
图(c)为反卷积的过程,反卷积是卷积的逆过程,又称作转置卷积。最大的区别在于反卷积过程是有参数要进行学习的(类似卷积过程),理论是反卷积可以实现UnPooling和unSampling,只要卷积核的参数设置的合理。

backward propagation:记录输入大于0的位置
unpooling:记录最大值信息(如果池化采用的是平均池化,那么UnPooling和unSampling类似)

参考链接

西瓜书之误差逆传播公式推导、源码解读及各种易混淆概念相关推荐

  1. BP算法误差逆传播参数更新公式推导

    BP算法误差逆传播参数更新公式推导

  2. 《机器学习与数据挖掘》实验五 编程实现误差逆传播算法(BP算法)

    前言: 摘要:本文对机器学习实验五 标准BP算法的代码进行实现,如果不了解的BP算法的话,可以自行上网搜索BP算法的详解. 实验题目:编程实现误差逆传播算法(BP算法) 实验目的:掌握误差逆传播算法( ...

  3. java存入光盘_java 这是 学习笔记(jdk7)书中的光盘里的源码,不知大家需要不,里面都是新手 的好 Develop 238万源代码下载- www.pudn.com...

    文件名称: java下载 收藏√  [ 5  4  3  2  1 ] 开发工具: Java 文件大小: 1272 KB 上传时间: 2013-04-01 下载次数: 18 提 供 者: 孙鹏启 详细 ...

  4. 【赠书福利】掘金爆火小册同名《Spring Boot源码解读与原理剖析》正式出书了!...

    关注我们丨文末赠书 承载着作者的厚望,掘金爆火小册同名读物<Spring Boot源码解读与原理剖析>正式出书! 本书前身是掘金社区销量TOP的小册--<Spring Boot源码解 ...

  5. css 视频播放列表,jquery结合CSS实现的多样式多视频列表连播效果源码

    jquery结合CSS实现的多样式多视频列表连播效果源码是一段实现了右侧缩略图片+文字列表显示所有视频.右侧文字列表显示所有视频及底部缩略图片+文字列表显示所有视频三种样式的视频连播效果代码,本段代码 ...

  6. 苹果CMS仿西瓜视频大气响应式视频模板源码

    苹果CMS仿西瓜视频大气响应式视频模板源码,苹果cmsV10MXone Pro自适应模板,此模板带有暗黑模式 白天晚上自动切换 全新UI全新框架,加载响应速度更快,seo更好,去除多余页面优化代码. ...

  7. aqs java 简书,Java AQS源码解读

    1.先聊点别的 说实话,关于AQS的设计理念.实现.使用,我有打算写过一篇技术文章,但是在写完初稿后,发现掌握的还是模模糊糊的,模棱两可. 痛定思痛,脚踏实地重新再来一遍.这次以 Java 8源码为基 ...

  8. Bert系列(二)——源码解读之模型主体

    本篇文章主要是解读模型主体代码modeling.py.在阅读这篇文章之前希望读者们对bert的相关理论有一定的了解,尤其是transformer的结构原理,网上的资料很多,本文内容对原理部分就不做过多 ...

  9. Bert系列(三)——源码解读之Pre-train

    https://www.jianshu.com/p/22e462f01d8c pre-train是迁移学习的基础,虽然Google已经发布了各种预训练好的模型,而且因为资源消耗巨大,自己再预训练也不现 ...

  10. Alamofire源码解读系列(九)之响应封装(Response)

    本篇主要带来Alamofire中Response的解读 前言 在每篇文章的前言部分,我都会把我认为的本篇最重要的内容提前讲一下.我更想同大家分享这些顶级框架在设计和编码层次究竟有哪些过人的地方?当然, ...

最新文章

  1. 2018 年人工智能会怎么发展?这里有 8 个预测
  2. [译]ES6新特性:八进制和二进制整数字面量
  3. php中可以实现多态的是继承,PHP设计模式通过继承实现多态
  4. 详解Python第三方库(一)-----tqdm库
  5. vue 心跳监控_vue websocket 加心跳
  6. 【全】Docker(二)-在Docker中部署Nginx实现负载均衡视频教程
  7. Android 活体人脸实时采集,百度、虹软
  8. 【JVM】jvm jmap 使用
  9. php yii框架连接数据库,Yii 框架使用数据库(databases)的方法示例
  10. Postfix无法在centos上启动
  11. ubuntu 分屏工具
  12. springboot 解决put,delete方法获取不到参数问题
  13. VM虚拟机手动配置IP地址
  14. C#中方法,方法声明,方法调用和方法重载!
  15. 毕业设计 python opencv 机器视觉图像拼接算法
  16. 微信小程序自定义底部导航栏组件
  17. DJL 教程 1.1 什么是AI人工智能
  18. 邮箱服务器如何配置?POP和IMAP如何定义?
  19. 经济机器是如何运行的(观后感)
  20. sdn的用处_SDN原来如此简单?三分钟轻松掌握!

热门文章

  1. 音频处理工具 GoldWave / Cool Edit Pro
  2. 华为的PBC个人绩效评价模板
  3. jQuery实现验证码60秒倒计时
  4. 搜索引擎(二)网页排名算法(1)PageRank
  5. Unit3D--人机交互入门
  6. 集成Ueditor秀米
  7. 如何免费下载英文论文
  8. C#毕业设计——基于C#+asp.net+SQL server的物料管理系统(ERP)设计与实现(毕业论文+程序源码)——物料管理系统(ERP)
  9. java treemap指定排序_TreeMap按照key排序
  10. VMware tools 安装失败