今天在使用pytorch进行训练,在运行 loss.backward() 误差反向传播时出错 :

RuntimeError: grad can be implicitly created only for scalar outputs

File "train.py", line 143, in train
    loss.backward()
  File "/usr/local/lib/python3.6/dist-packages/torch/tensor.py", line 198, in backward
    torch.autograd.backward(self, gradient, retain_graph, create_graph)
  File "/usr/local/lib/python3.6/dist-packages/torch/autograd/__init__.py", line 94, in backward
    grad_tensors = _make_grads(tensors, grad_tensors)
  File "/usr/local/lib/python3.6/dist-packages/torch/autograd/__init__.py", line 35, in _make_grads
    raise RuntimeError("grad can be implicitly created only for scalar outputs")
RuntimeError: grad can be implicitly created only for scalar outputs

问题分析:

因为我们在执行 loss.backward() 时没带参数,这与 loss.backward(torch.Tensor(1.0)) 是相同的,参数默认就是一个标量。

但是由于自己的loss不是一个标量,而是二维的张量,所以就会报错。

解决办法:

1. 给 loss.backward() 指定传递给后向的参数维度:

loss = criterion(pred, targets)
loss.backward()
# 改为:
loss = criterion(pred, targets)
loss.backward(loss.clone().detach())

2. 修改loss函数的输出维度,把张量的输出修改为标量,比如说多多个维度的loss求和或求均值等。此方法对于某些任务不一定适用,可以尝试自己修改。

criterion = nn.L1Loss(reduction='none')
# 把参数去掉,改为:
criterion = nn.L1Loss()

这里顺便介绍一下pytorch loss函数里面 的reduction 参数:

在新的pytorch版本里,使用reduction 参数取代了旧版本的size_average和reduce参数。

reduction 参数有三种选择:

'elementwise_mean':为默认情况,表明对N个样本的loss进行求平均之后返回(相当于reduce=True,size_average=True);

'sum':指对n个样本的loss求和(相当于reduce=True,size_average=False);

'none':表示直接返回n分样本的loss(相当于reduce=False)


参考:

http://www.cocoachina.com/articles/90127

https://blog.csdn.net/goodxin_ie/article/details/89645358

pytorch loss反向传播出错相关推荐

  1. 人工智能-作业1:PyTorch实现反向传播

    人工智能-作业1:PyTorch实现反向传播 人工智能-作业1:PyTorch实现反向传播 环境配置: 计算过程 反向传播 PyTorch Autograd自动求导 人工智能-作业1:PyTorch实 ...

  2. pytorch学习 -- 反向传播backward

    pytorch学习 – 反向传播backward 入门学习pytorch,在查看pytorch代码时对autograd的backard函数的使用和具体原理有些疑惑,在查看相关文章和学习后,简单说下我自 ...

  3. 【2021-2022 春学期】人工智能-作业1:PyTorch实现反向传播

    1 安装pycharm,配置好python开发环境 PyCharm 安装教程(Windows) | 菜鸟教程 (runoob.com) 2 安装pytorch PyTorch 3 使用pytorch实 ...

  4. Pytorch的反向传播backward()详解

    在Pytorch中,我们有时候会进行多个loss的回传,然而回传中,会发生一些错误.例如: RuntimeError: Trying to backward through the graph a s ...

  5. Pytorch(三) --反向传播

    整体上来说,和上一节的梯度下降法差不多,不过这次是用Pytorch实现的,调用了其中的一些方法. 需要注意的事项: ①Tensor中包含data和grad,其中data和grad也是Tensor.在更 ...

  6. 【Pytorch】反向传播为NaN报错的排查解决方法,RuntimeError: Function ‘BmmBackward0‘ returned nan values

    最近在训练模型的过程中,反复出现方向传播至为NaN的报错,报错信息如下所示: File "/home/fu/anaconda3/envs/torch/lib/python3.7/site-p ...

  7. 使用pytorch构建一个神经网络、损失函数、反向传播、更新网络参数

    关于torch.nn: 使用Pytorch来构建神经网络, 主要的工具都在torch.nn包中. nn依赖于autograd来定义模型, 并对其自动求导. 构建神经网络的典型流程: 定义一个拥有可学习 ...

  8. Pytorch框架中SGD&Adam优化器以及BP反向传播入门思想及实现

    因为这章内容比较多,分开来叙述,前面先讲理论后面是讲代码.最重要的是代码部分,结合代码去理解思想. SGD优化器 思想: 根据梯度,控制调整权重的幅度 公式: 权重(新) = 权重(旧) - 学习率 ...

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

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

最新文章

  1. 电脑练习打字软件_KeyBlaze Free Typing Tutor(打字练习软件)最新版下载_KeyBlaze Free Typing Tutor(打字练习软件)最新版本下载v4.02官方版...
  2. Axis --SOAP引擎
  3. GitLab五种权限
  4. 计算机教室安全预案 博客,校园安全应急预案
  5. 阿里推出会议AI助理“听悟”,面向未来会议
  6. 简练软考知识点整理-估算成本过程
  7. Hystrix 熔断器舱壁模式
  8. 《面向数据科学的概率论》翻译活动期待大家的参与 | ApacheCN
  9. 数据结构和算法1 稀疏数组
  10. arduino 停止程序_Arduino用ISD1820语音录放模块制作留言机
  11. 从此使用linux系统,但是QQ是必不可少的!!该篇文章方法成功!!!已验证!!!!!...
  12. FlightGear编译
  13. 开发erp管理系统的好处
  14. python合并excel工作簿_Python操作Excel教程-合并同一工作簿下多张工作表
  15. 华南理工计算机就业棒棒,国内3所校名“一字之差”的大学:均为理工大学,实力却天差地别...
  16. 跨端融合!探索前沿科技无限可能,深圳腾讯2018TLC大会再度来袭,早鸟票最后一天...
  17. 快捷餐饮之店家后台厨艺秀实现
  18. 石油大P14040存在
  19. KBEngine warring项目源码阅读(三) 实体文件与Account处理
  20. 养车记账本小程序开发教程

热门文章

  1. 跨平台应用开发进阶(四十七)APP字体库文件处理方案
  2. 新型冠状病毒之物资的分配
  3. 什么是wildfly
  4. 面向对象程序设计(c++)面试常问——for考研复试面试
  5. C语言数据存储-浮点型
  6. HTML黑白触摸变彩色,使用HTML5 转换彩色图片为黑白色知识讲解.doc
  7. java毕业设计免税商品优选购物商城设计mybatis+源码+调试部署+系统+数据库+lw
  8. R语言数据可视化教程(ggplot2)_绘制散点图
  9. 蜂鸟E200模块分析——IFU:Simple-BPU
  10. 有未经处理的异常 0xC00000FD Stack overflow (参数: 0x00000000, 0x00842000)