pytorch loss反向传播出错

pytorch loss反向传播出错在使用pytorch进行训练代码时,在运行loss.backward()误差反向传播时出错:RuntimeError:gradcanbeimplicitlycreatedonlyforscalaroutputsFile”train.py”,line143,intrainloss.backward()File”/usr/local/lib/python3.6/dist-packages/torch/tensor.py”,line198…

大家好,又见面了,我是你们的朋友全栈君。

 

今天在使用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

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/144114.html原文链接:https://javaforall.net

赞 (0)
全栈程序员-站长的头像全栈程序员-站长

相关推荐

  • 激活成功教程版补丁_PyCharm永久激活2021

    激活成功教程版补丁_PyCharm永久激活2021参考https://www.cnblogs.com/pupilheart/p/9734124.html实测可行。——————————————————————————————————2019年01月15日更新最新测试该,博客的激活成功教程文件JetbrainsIdesCrack-3.1-release-sha1.jar,最后激活步骤显示keyisinvalid,测试了几个网站激活码发现均…

    2022年8月27日
  • getinstance方法(java replace函数)

    一般在单例模式下使用.getInstance()创建对象;但并不是所有有私有构造方法,对外通过getInstance方法提供实例的情况就是单例模式。注:单例模式:一个类有且只有一个实例。1,一个私有的构造器2,一个私有的该类类型的变量3,必须有一个共有的返回类型为该类类型的方法,用来返回这个唯一的变量eg:publicclassSingleton{

    2022年4月14日
  • vue报错:Navigation cancelled from “/userIndex“ to “/blank/login“ with a new navigati

    vue报错:Navigation cancelled from “/userIndex“ to “/blank/login“ with a new navigati最近在弄一个vue项目时碰到这么一个报错,查了下资料,记录一下:这个错误是vue-router的内部错误,是因为没有进行catch处理,导致的编程式导航跳转问题,往同一个地址跳转时,会报错。解决方法如下:在路由文件中进行配置:router/index.jsimportVuefrom’vue’importRouterfrom’vue-router’Vue.use(Router)//解决报错constoriginalPush=Router.prototype.pushco

    2022年7月26日
  • NP-Hard问题浅谈

    NP-Hard问题浅谈看相关算法的paper的时候,经常会出现NP-Hard这个词。本博主也不是纯数学系出身,对于这么高深的问题自然没有特别深入独到的理解。但是本博主的习惯就是看到一个东西老在眼前晃来晃去但自己还不是很明白,就有强迫症一定要搞明白这到底是个什么玩意。so,咱们就来看看这个NP-Hard问题,怎么用最简单的方式去了解。1.世界七大数学难题之首2000年,美国克莱数学研究所公布了世界七大数学难题,又称千禧年大

    2022年9月13日
  • redis学习笔记(14)—redis基本命令总结

    redis学习笔记(14)—redis基本命令总结

    2021年10月10日
  • BoostNote使用,没有说明

    BoostNote使用,没有说明Thisisatitle斜体Thisisalsoatitle二级标题aaasddw第三极symbol标记代码块ThisisaCodesetThisisaCodesetfor(inti=0;i<5;i++){cout<<"Hel

    2022年10月31日

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号