在深度学习计算损失函数的过程中,我一直有这样一个问题,如果Label是1.0,而预测结果是0.0,则BCE损失中理论上计算出的结果是无穷大的(当然pytorch并不会报错,而是将损失上限设在了100.0),在实际开发过程中,我们一般会使用torch.clamp等函数将预测tensor不符合取值范围的值全部置为最小或最大值,那对于这些被替换后的元素,他们会在反向传播过程中对网络产生梯度吗?我自己的第一想法是没有,因为这些替换后的新值的来源是一个赋值操作,而非通过网络计算出来的,但为了更好的理解,我们来做一个测试,因此有了本篇笔记一样的博客。

from torch.nn import functional as F
import torch.nn as nn
import torch
#初始化一个最简单的网络
fc = nn.Linear(in_features=1, out_features=1, bias=True)
fc.weight.data = torch.tensor([[0.01]])
fc.bias.data   = torch.tensor([[0.01]])
input_t = torch.tensor([[1.0]], dtype=torch.float32)
pred    = fc(input_t)
label   = torch.tensor([[1.0]])

这里网络的预测结果为0.02,将其强行截断到0.1,损失的计算仍然是正常的,但是反向传播后,网络的训练参数是没有梯度的,即可以认为这个预测的样本对网络是没有更新作用的,是一个无意义的预测样本

pred    = torch.clamp(pred, min=0.1, max=0.9)
loss = F.binary_cross_entropy(pred, label)
print(loss)                         #tensor(2.3026, grad_fn=<BinaryCrossEntropyBackward>)
loss.backward()
print(fc.weight.grad, fc.bias.grad) #tensor([[0.]]) tensor([[0.]])

正常的预测结果产生梯度,符合预期。

loss = F.binary_cross_entropy(pred, label)
print(loss)                          #tensor(3.9120, grad_fn=<BinaryCrossEntropyBackward>)
loss.backward()
print(fc.weight.grad, fc.bias.grad) #tensor([[-50.]]) tensor([[-50.]])

更一般的,假设有n个预测结果,其中有k个值由于torch.clamp等操作被强行修改了值,还剩n - k个预测结果是真实来源于网络,则在梯度反向传播的时候只有这n - k个样本能够成功回传梯度给网络,即便计算的loss是这k个样本产生的。
        防止遗忘将本经验记录了下来。

梯度反向传播过程中,测试强行修改后的预测结果是否还会传递loss?相关推荐

  1. 梯度反向传播(CS231n课程笔记翻译)

    CS231n课程笔记翻译:反向传播笔记 - 杜客的文章 - 知乎 译者注:本文智能单元首发,译自斯坦福CS231n课程笔记Backprop Note,课程教师Andrej Karpathy授权翻译.本 ...

  2. Pytorch(5)-梯度反向传播

    自动求梯度 1. 函数对自变量x求梯度--ax^2+b 2. 网络对参数w求梯度- loss(w,x) 3. 自动求梯度的底层支持--torch.autograd 3.1 Variable 3.1.1 ...

  3. 卷积神经网络前向及反向传播过程数学解析

    卷积神经网络前向及反向传播过程数学解析 文章目录 <center>卷积神经网络前向及反向传播过程数学解析 1.卷积神经网络初印象 2.卷积神经网络性质 3.前向传播 3.1.卷积层层级间传 ...

  4. 关于研发过程中测试工作的一些思考

    目录 一.背景&目标 二.需求设计阶段测试--测试计划与需求评估 三.开发设计阶段测试--分析与设计 四.测试阶段--测试执行与策略实施 五.发布前后阶段 一.背景&目标 测试工作是保 ...

  5. linux时间界面返回,Android开发教程:游戏过程中按Home键后返回游戏界面

    症状:游戏过程中,按下Home键返回手机主菜单,再点击游戏图标试图返回游戏的时候屏幕黑的一片! 以前一直没在意只有结束线程在运行游戏,今天觉得改仔细琢磨一下这个问题了! 首先第一件事:打印Logo看看 ...

  6. 离线状态下如何在Execl中实现数据修改后的高亮显示?

    Execl中实现数据修改后的高亮显示 1 问题描述 2 解决思路 2.1 保存操作记录 2.2 手动保存原记录后进行匹配 3 解决方法 3.1跟踪更改 3.2 条件格式 3.3 重复项匹配 3.4 设 ...

  7. 虚拟机正在使用的过程中电脑突然重启后虚拟机不能正常使用

    重启电脑提示该虚拟机似乎正在使用中的解决方法 虚拟机正在使用的过程中电脑突然重启后虚拟机不能正常使用 打开虚拟机时提示"该虚拟机似乎正在使用中.如果该虚拟机未在使用,请按"获取所有 ...

  8. 梯度反向传播求解示例

    深度学习中进行网络的训练的时候,常常采用梯度反向传递的方式对网络中的参数进行调整,那么具体是怎么实现的呢?我用一个简单的例子进行推导求解. 如下图,这里采用的是两层网络,损失函数采用的是平方差损失函数 ...

  9. 卷积神经网络的反向传播,卷积反向传播过程

    如何对CNN网络的卷积层进行反向传播 在多分类中,CNN的输出层一般都是Softmax.RBF在我的接触中如果没有特殊情况的话应该是"径向基函数"(RadialBasisFunct ...

最新文章

  1. ExtJS实战(10)-项目总结
  2. WebDev.WebServer 学习
  3. 事物与持久化_揭开Redis面纱,发布订阅、事务、安全、持久化
  4. 微信小程序 保存持久化cookie
  5. Prism For WPF Login对话框又简单又合理的方案之一
  6. 作为面试官的一些经历,希望能给找工作的朋友一些参考
  7. 设计模式-行为型模式-责任链模式
  8. 你了解京东云区块链吗?点开有详情!
  9. HP-UX 中配置Trusted System
  10. cmake 交叉编译_如何使用CMake编译RTT微内核
  11. java高级(java高级工程师证书)
  12. 夜深人静了,我们来学学分布式锁
  13. Matlab 线性拟合 非线性拟合
  14. 树上分治算法 + 路径剖分
  15. 网友戏说电影公司片头动画
  16. win10鼠标右键恢复
  17. 数据流图(Data Flow Diagram ,简称DFD)
  18. 计算机上如何转换搜狗,怎样切换输入法,搜狗输入法五笔和拼音切换
  19. c++语言编的小游戏,用C++语言编写小游戏系统(可读取文件)
  20. C语言sfr定义一个变量,单片机c语言的sbit和sfr

热门文章

  1. 完美解决:找不到msvcr120.dll,需要重新安装服务
  2. quic java_网络编程懒人入门(十):一泡尿的时间,快速读懂QUIC协议
  3. 分布式之 Redis 复习精讲
  4. 华为AC设备登陆web网管(ensp模拟)
  5. 分析了波周杰伦,还做了数据可视化!
  6. 90后黑客以1分钱拍迪斯尼门票后转卖 1周赚50万
  7. 一些机器学习相关的数学知识
  8. Java面试题视频讲解汇总
  9. 恶意软件免杀与技术(2022.04.25)
  10. 提供数据分析和可视化的五家初创公司