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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • B 站上有哪些很好的学习资源?[通俗易懂]

    B 站上有哪些很好的学习资源?[通俗易懂]哇说起B站,在小九眼里就是宝藏般的存在,放年假宅在家时一天刷6、7个小时不在话下,更别提今年的跨年晚会,我简直是跪着看完的!!最早大家聚在在B站是为了追番,再后来我在上面刷欧美新歌和漂亮小姐姐的舞蹈视频,最近两年我和周围的朋友们已经把B站当作学习教室了,而且学习成本还免费,真是个励志的好平台ヽ(.◕ฺˇдˇ◕ฺ;)ノ下面我们就来盘点一下B站上优质的学习资源:综合类Oeasy:综合…

    2022年7月17日
    13
  • python猴子摘桃问题_python解决简单实际问题

    python猴子摘桃问题_python解决简单实际问题如何实现猴子摘香蕉问题,只需要几点即可1.猴子与箱子的位置关系2.箱子与香蕉的位置关系3.猴子有无摘到香蕉猴子摘到香蕉的前提条件1.猴子与箱子在一起2.箱子与香蕉在一起3.猴子在箱子上面4.猴子没有摘到香蕉猴子可能存在的几种位置状态1.箱子和猴子不在一起2.猴子跟箱子在一起且不跟香蕉在一起3.猴子不在箱子上并且猴子跟箱子在一起4.猴子在箱子上并且箱子跟香蕉在一起以及猴子没有摘取香蕉5.猴子在箱子上但箱子不跟香蕉在一起6.猴子取到香蕉根据上述开始

    2022年9月26日
    3
  • clion 激活码[在线序列号]

    clion 激活码[在线序列号],https://javaforall.net/100143.html。详细ieda激活码不妨到全栈程序员必看教程网一起来了解一下吧!

    2022年3月19日
    76
  • Java中的statickeyword具体解释[通俗易懂]

    Java中的statickeyword具体解释

    2022年1月19日
    59
  • C语言的整型溢出问题 int、long、long long取值范围 最大最小值「建议收藏」

    C语言的整型溢出问题 int、long、long long取值范围 最大最小值「建议收藏」溢出和取值范围C语言的整型溢出问题整数溢出int、longint、longlongint占用字节疑问《C和指针》中写过:long与int:标准只规定long不小于int的长度,int不小于short的长度。double与int类型的存储机制不同,longint的8个字节全部都是数据位,而double是以尾数,底数,指数的形式表示的,类似科学计数法,因此double比

    2022年6月3日
    42
  • 数据流图解析

    数据流图解析(一)分层数据流图的设计方法:=====    第一步,画子系统的输入输出把整个系统视为一个大的加工,然后根据数据系统从哪些外部实体接收数据流,以及系统发送数据流到那些外部实体,就可以画出输入输出图。这张图称为顶层图。第二步,画子系统的内部把顶层图的加工分解成若干个加工,并用数据流将这些加工连接起来,使得顶层图的输入数据经过若干加工处理后,变成顶层图

    2022年6月21日
    117

发表回复

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

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