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

2023-10-29

关键词:反向传播(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的数量,一般情况下为1
  for (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*24
      this->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类似)

参考链接

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

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

  • 从组合中估计概率

    一些分类算法缺乏输出结果为概率的能力 比如rf 这个时候使用calibratedclassifiercv 它使用2种方法将分类结果转化为概率 第一种 platte的归类方法 第二种 isotonic回归 import pandas as p
  • R资源大全

    0 前言 虽然很早就知道R被微软收购 也很早知道R在统计分析处理方面很强大 开始一直没有行动过 直到 直到12月初在微软技术大会 看到我软的工程师演示R的使用 我就震惊了 然后最近在网上到处了解和爬一些R的资料 看着看着就入迷了 这就是个大
  • Cascade network——multi-stage refinement

    文章目录 List Preview AttractioNet 2016 CRAFT CRAFT Objects from Images 2016 CC Net chained cascade network for object detec
  • 聚类五之总结

    1 聚类方法的选择 1 对于数据量较大的情况 k means 2 对于数据量较一般的情况 最大密度聚类 DBSCAN 3 对于数据量较少的情况 谱聚类 2 类别数目k未知 且数据有噪声 可使用密度聚类 如DBSCAN 最大密度聚类 DBSC
  • 感知机(Perceptron)-----最详细记录感知机

    1 前言 感知机是1957年 由Rosenblatt提出会 是神经网络和支持向量机的基础 感知机是有生物学上的一个启发 他的参照对象和理论依据可以参照下图 我们的大脑可以认为是一个神经网络 是一个生物的神经网络 在这个生物的神经网络里边呢
  • 朴素贝叶斯理论推导与三种常见模型

    朴素贝叶斯 Naive Bayes 是一种简单的分类算法 它的经典应用案例为人所熟知 文本分类 如垃圾邮件过滤 很多教材都从这些案例出发 本文就不重复这些内容了 而把重点放在理论推导 其实很浅显 别被 理论 吓到 三种常用模型及其编码实现
  • OpenCV中SVM的参数具体设置

    CvSVMParams CvSVMParams svm type CvSVM C SVC kernel type CvSVM RBF degree 0 gamma 1 coef0 0 C 1 nu 0 p 0 class weights 0
  • pandas中的时间序列

    一 夯实基础 datetime 模块中的数据类型 date 以公历形式存储日历日期 年月日 time 将时间存储为时分秒毫秒 datetime 存储日期和时间 timedelta 表示两个datetime值之间的差 日 秒 毫秒 1 获取当
  • 对numpy.c_的理解

    文章目录 文档描述 关于python科学计算 pandas numpy 中axis 轴 的理解 理解 文档描述 来自官方文档的叙述 这里只简单翻译一部分 numpy c numpy c
  • confidence weighted learning

    这个算法原作者意思是在NLP中面对高维向量和数据稀疏时效果会不错 算法保持了当前预测向量w的均值和方差 并做优化 代码实现如下 cw learning algorithm def get phi confidence parameter p
  • 【CS229 lecture19】微分动态规划

    首先声明一下 这节课基本没听懂 但是还是把课程笔记写下 lecture19 微分动态规划 继续强化学习算法的讨论 Agenda 课程中段我曾讲过调试learning algorithm 今天再来将强化学习的部分 The motivating
  • 深度学习知识体系学习大全 牛!!

    搬来了大牛的博客 点击直接前往 https www yuque com angsweet machine learning jian jie 配一张大牛的思维导图 具体内容点进去都能看到 数学 机器学习 语言 算法 深度学习 书籍推荐 东西
  • 异常检测(二)——IsolationForest

    1 简介 孤立森林 Isolation Forest 是另外一种高效的异常检测算法 它和随机森林类似 但每次选择划分属性和划分点 值 时都是随机的 而不是根据信息增益或者基尼指数来选择 在建树过程中 如果一些样本很快就到达了叶子节点 即叶子
  • 深度学习 vs 概率图模型 vs 逻辑学

    深度学习 vs 概率图模型 vs 逻辑学 发表于 2015 04 30 21 55 1359次阅读 来源 quantombone 0 条评论 作者 Tomasz Malisiewicz 深度学习 deep learning 图模型 人工智能
  • 监督学习,无监督学习,半监督学习,主动学习的概念

    1 监督学习 supervised learning 训练数据既有特征 feature 又有标签 label 通过训练 让机器可以自己找到特征和标签之间的联系 在面对只有特征没有标签的数据时 可以判断出标签 即生成合适的函数将输入映射到输出
  • Structural Time Series modeling in TensorFlow Probability

    在邯郸学步后 想要深入用好Tensorflow中的STS model 还是要静下心来 好好阅读点材料 f t f 1
  • 【数据预处理】Pandas缺失的数据处理

    目录 缺少数据基础 何时 为何 数据丢失 被视为 缺失 的值 日期时间 插入缺失数据 缺少数据的计算 Sum Prod of Empties Nans GroupBy中的NA值 清理 填写缺失数据 填充缺失值 fillna 用PandasO
  • 机器学习可视化:模型评估和参数调优

    本篇文章详细阐述机器学习模型评估和参数调优 将主要围绕两个问题来阐述 知其所以然 当你选择的一个机器学习模型运行时 你要知道它是如何工作的 青出于蓝 更进一步 你得知道如何让此机器学习模型工作的更优 模型评估的方法 一般情况来说 F1评分或
  • 如何使用 Whisper 和 Spleeter AI 工具制作卡拉 OK 视频

    介绍 人工智能工具可用于处理图像 音频或视频以产生新颖的结果 直到最近 在不使用大量时间和计算能力的情况下 自动编辑图像或音频仍然具有挑战性 即使如此 通常也只能运行交钥匙滤波器来删除声音中的某些频率或更改图像的调色板 较新的方法使用人工智
  • 吴恩达机器学习笔记系列(五)——梯度下降

    一 gradient descent 梯度下降 1 概念 线性回归的目的就是找出使得误差 损失函数 最小的参数值 可以用梯度下降来确定 参数的大小 梯度下降是一种迭代方法 能够求解局部最小值 结果与初始点的选取有关 为了找到最小值 从某一点

随机推荐

  • 手机主域名服务器修复,手机主域名服务器修复

    手机主域名服务器修复 内容精选 换一换 安装依赖时 使用pip3 7 5 install xxx命令安装相关软件时提示无法连接网络 且提示 Could not find a version that satisfies the requir
  • SQL Server问题记录

    问题 DataGrip连接SQL Server 连接SQL Server失败 默认使用的驱动是sqljdbc4 结果报错信息如下 08S01 驱动程序无法通过使用安全套接字层 SSL 加密与 SQL Server 建立安全连接 错误 The
  • Zero Tier Windows远程桌面 免费跨网段 不在一个局域网 免费内网穿透

    1 注册 点击连接 ZeroTier Central 2 添加网络 点击 Create A Network 获取该网络network ID 下载 软件 https www zerotier com download 运行 右击右下角 图标
  • yolov5_prune剪枝训练记录及遇见的问题

    学习参考链接 转发 深度学习模型压缩与加速理论与实战 一 模型剪枝 AHU WangXiao 博客园 cnblogs com 剪枝顾名思义 就是通过一些算法或规则删去一些不重要的部分 来使模型变得更加紧凑 减小计算或者搜索的复杂度 它包括四
  • elasticsearch初识

    初识elasticsearch 了解ES elasticsearch的作用 elasticsearch是一款非常强大的开源搜索引擎 具备非常多强大功能 可以帮助我们从海量数据中快速找到需要的内容 例如 在GitHub搜索代码 在电商网站搜索
  • mysql没开启binlog恢复删除表_无全量备份、未开启binlog日志,利用percona工具恢复delete的数据...

    当我们忘记做全量备份时 并且没有开启binlog 并执行了delete from sbtest 数据全部丢失 要想恢复是很有难度的 今天 利用Percona Data Recovery Tool for InnoDB工具 仅支持InnoDB
  • Dubbo(二)详细介绍

    转自 https www cnblogs com juncaoit p 7686510 html 1 背景 随着互联网的发展 网站应用的规模不断扩大 常规的垂直应用架构已无法应对 分布式服务架构以及流动计算架构势在必行 亟需一个治理系统确保
  • Service的两种启动方式之间的比较与区别

    在Android中 有两种主要的方式可以启动Service 启动式启动和绑定式启动 1 启动式启动 Start Service 使用 startService 方法启动Service Service在后台运行 独立于启动它的组件 如Acti
  • spark读取hive

    spark读取hive是最简单的 构造一个sparksession对象 直接执行SQL就得读取 然后直接insert就能写入 因为spark客户端配置了你的hive数据库的信息 所以能够直接读取hive数据库 spark SparkSess
  • AI绘图实战(五):放大并修复老照片、马赛克照片、身份证件照

    S 你安装stable diffusion就是为了看小姐姐么 I 当然不是 当然是为了公司的发展谋出路 预先学习 安装及其问题解决参考 Windows安装Stable Diffusion WebUI及问题解决记录 运行使用时问题 Windo
  • 一根网线两台电脑传输文件

    用两个网线连接两台电脑 确保网线连接没有问题 打开网络共享中心 然后打开更改适配器设置 选择以太网 右键属性 4 双击 Internet协议版本4 TCP IPv4 然后进行如下设置 在另一台电脑上进行上述一样的操作 只是IP地址的设置不同
  • android编程中遇到的关于 java.lang.NullPointerException错误的原因及解决办法

    LogCat中的错误提示如下 04 29 09 43 23 390 E AndroidRuntime 24967 FATAL EXCEPTION main 04 29 09 43 23 390 E AndroidRuntime 24967
  • 创建型模式5之3-Singleton单例模式的八种写法比较

    单例模式的八种写法比较 单例模式是最常用到的设计模式之一 熟悉设计模式的朋友对单例模式都不会陌生 一般介绍单例模式的书籍都会提到 饿汉式 和 懒汉式 这两种实现方式 但是除了这两种方式 本文还会介绍其他几种实现单例的方式 让我们来一起看看吧
  • 打发时光的102个网站

    1 看看自己具有哪个大明星的脸型 http www play analogia com cgi bin index 2 超有意思的Flash网站 虚拟办公 http agencynet com 3 亲自动手给美女画纹身 http www c
  • nginx 详解反向代理负载均衡

    什么是反向代理负载均衡 使用代理服务器可以将请求转发给内部的Web服务器 使用这种加速模式显然可以提升静态网页的访问速度 因此也可以考虑使用这种技术 让代理服务器将请求 均匀转发给多台内部Web服务器之一上 从而达到负载均衡的目的 这种代理
  • 【blender】材质球参数及各种问题

    目录 材质设置 1 共用一种材质 但是不同颜色 2 关联材质 3 无法绘制贴图 4 材质保存为资产 5 材质描边 材质设置 1 玻璃 1 共用一种材质 但是不同颜色 物体信息节点 gt 仅需改变物体颜色即可 2 关联材质 ctrl L 3
  • 网络安全——命令执行漏洞概述

    一 命令执行漏洞概述 1 基本定义 命令执行漏洞是指攻击者可以随意执行系统命令 分为远程命令执行 远程代码执行 和系统命令执行 2 原理 程序应用有时候需要调用一些执行系统命令的函数 如PHP中的system exec shell exex
  • SpringCloud组件之断路器Hystrix(hoxton版本)

    1 Hystrix 简介 在微服务架构中 根据业务来拆分成一个个的服务 服务与服务之间可以相互调用 RPC 在Spring Cloud可以用RestTemplate Ribbon和Feign来调用 为了保证其高可用 单个服务通常会集群部署
  • WinForm中如何实现panel和SplitContainer相结合进行布局呢

    相信大家都会在winform应用程序中进行布局 通常我们也会使用一下这种布局 如图 以上布局分别采用了Panel 黑色区域 和SplitContainer控件 白色区域 这布局相信大家耳熟能详了 比如VS2010不就是典型这样布局吗 但是需
  • 西瓜书之误差逆传播公式推导、源码解读及各种易混淆概念

    关键词 反向传播 BP caffe源码 im2col 卷积 反卷积 上池化 上采样 公式推导 以前看到一长串的推导公式就想直接跳过 今天上午莫名有耐心 把书上的公式每一步推导自己算一遍 感觉豁然开朗 遂为此记 sigmoid函数求导比rel