- ubuntu12.04环境下使用kvm ioctl接口实现最简单的虚拟机
- Ubuntu 通过无线网络安装Ubuntu Server启动系统后连接无线网络的方法
- 在Ubuntu上搭建网桥的方法
- ubuntu 虚拟机上网方式及相关配置详解
CFSDN坚持开源创造价值,我们致力于搭建一个资源共享平台,让每一个IT人在这里找到属于你的精彩世界.
这篇CFSDN的博客文章pytorch loss反向传播出错的解决方案由作者收集整理,如果你对这篇文章有兴趣,记得点赞哟.
今天在使用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
2
3
4
5
|
loss
=
criterion(pred, targets)
loss.backward()
# 改为:
loss
=
criterion(pred, targets)
loss.backward(loss.clone().detach())
|
把张量的输出修改为标量,比如说多多个维度的loss求和或求均值等。此方法对于某些任务不一定适用,可以尝试自己修改.
1
2
3
|
criterion
=
nn.L1Loss(reduction
=
'none'
)
# 把参数去掉,改为:
criterion
=
nn.L1Loss()
|
在新的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) 。
补充:在Pytorch下,由于反向传播设置错误导致 loss不下降的原因及解决方案 。
在Pytorch下,由于反向传播设置错误导致 loss不下降的原因及解决方案 。
刚刚接触深度学习一段时间,一直在研究计算机视觉方面,现在也在尝试实现自己的idea,从中也遇见了一些问题,这次就专门写一下,自己由于在反向传播(backward)过程中参数没有设置好,而导致的loss不下降的原因.
简单描述一下我的网络结构,我的网络是有上下两路,先对第一路网络进行训练,使用groud truth对这一路的结果进行监督loss_steam1,得到训练好的feature.然后再将得到的feature级联到第二路,通过网络得到最后的结果,再用groud truth进行监督loss.
这个问题确实折麽自己一段时间,结果发现自己出现了一个问题,下面将对这个问题进行分析和解答:
在PyTorch中,传入网络计算的数据类型必须是Variable类型, Variable包装了一个Tensor,并且保存着梯度和创建这个Variablefunction的引用,换句话说,就是记录网络每层的梯度和网络图,可以实现梯度的反向传递. 则根据最后得到的loss可以逐步递归的求其每层的梯度,并实现权重更新.
在实现梯度反向传递时主要需要三步:
1、初始化梯度值:net.zero_grad() 清除网络状态 。
2、反向求解梯度:loss.backward() 反向传播求梯度 。
3、更新参数:optimizer.step() 更新参数 。
自己在写代码的时候,还是没有对自己的代码搞明白。在反向求解梯度时,对第一路没有进行反向传播,这样肯定不能使这一路的更新,所以我就又加了一步:
loss_steam1.backward( retain_graph = True) //因为每次运行一次backward时,如果不加retain_graph = True,运行完后,计算图都会free掉.
1
|
loss.backward()
|
这样就够了么?我当时也是这么认为的结果发现loss_steam1还是没有降,又愁了好久,结果发现梯度有了,不更新参数,怎么可能有用! 。
1
2
|
optimizer_steam1.step()
/
/
这项必须加
optimizer.step()
|
哈哈!这样就完成了,效果也确实比以前好了很多.
以上为个人经验,希望能给大家一个参考,也希望大家多多支持我。如有错误或未考虑完全的地方,望不吝赐教.
原文链接:https://blog.csdn.net/u012505617/article/details/107530252 。
最后此篇关于pytorch loss反向传播出错的解决方案的文章就讲到这里了,如果你想了解更多关于pytorch loss反向传播出错的解决方案的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
正如 Keras 手册中所述 -使用 Pyhton 进行深度学习-,对于多输出模型,我们需要为网络的不同头指定不同的损失函数。但由于梯度下降要求您最小化标量,因此您必须将这些损失组合成单个值才能训练模
我无法判断这个错误是由于技术错误还是超参数造成的,但我的 DC-GAN 的鉴别器损失一开始很低,然后逐渐攀升,在 8 左右减慢,而我的发电机损失则大幅下降。我在大约 60,000 epoch 时结束了
我对以下日志有点怀疑,这是我在训练深度神经网络时得到的回归目标值在 -1.0 和 1.0 之间,学习率为 0.001 和 19200/4800 训练/验证样本: ___________________
简而言之: 我训练了一个自动编码器,其验证损失始终高于其训练损失(见附图)。 我认为这是过度拟合的信号。然而,我的自动编码器在测试数据集上表现良好。我想知道是否: 1)引用下面提供的网络架构,任何人都
我正在处理文本序列,序列长度在 1-3 之间。标签是一个“分数”。我有超过 500 万个样本。我的网络如下所示(Keras): model.add(Embedding(word_count, 128,
我正在训练用于图像语义分割的 CNN U-net 模型,但是训练损失的减少速度似乎比验证损失的减少速度快得多,这正常吗? 我使用的是 0.002 的损失 下图可以看到训练和验证损失: 最佳答案 是的,
我目前正在通过研究 MNIST 示例等示例来学习卷积神经网络。在神经网络的训练过程中,我经常看到如下输出: Epoch | Train loss | Valid loss | Train
我设计了自己的损失函数。但是,当尝试恢复到训练期间遇到的最佳模型时 model = load_model("lc_model.h5") 我收到以下错误: -----------------------
在基于RAW套接字的数据包发送测试期间,我发现了非常令人讨厌的症状。 使用默认的RAW套接字设置(尤其是SO_SNDBUF大小), 原始套接字可以毫无问题地发送100,000个数据包,但大约花费了8秒
我用JAVA编写了以下方法: public static float surface(float r) { return(4*Math.PI*Math.pow(r,2));
我正在学习pytorch,并正在做anpr项目,它是基于tensorflow的(https://github.com/matthewearl/deep-anpr, 奥 git _a)作为练习,将其移植
我试图找出为什么我的 Java 程序中会出现这种精度丢失错误。 这是错误: error: possible loss of precision int digit = num/Mat
我刚开始在 tensorflow(r1.0) 中使用 ctc 损失层,对“标签”输入有点困惑 在tensorflow的API文档中是这样写的 labels: An int32 SparseTensor
我知道在 Java 中将 BigDecimal 值转换为 Double 时存在“精度问题”。使用 BigDecimal.doubleValue() 简单地从 BigDecimal 转换为 Double
我读了 related question keras 自定义损失函数必须为每个批处理项返回一个标量。 我写了一个损失函数,输出整个批处理的标量,网络似乎收敛了。但是,我找不到任何关于此的文档或代码中究
我有一个 C++ 应用程序,它使用 UDP 服务器(使用 Boost.Asio)以高频率(每秒 3500 个数据包)从千兆本地网络设备接收数据包。一些用户报告了一些数据包丢失。所以最后我选择并行运行
更换了 用response.sendRedirect("URL"); ,我发现我知道一旦重定向发生就会失去 session 。有没有办法通过重定向保留 session ,或者重建 session co
我正在使用 DQN 算法在我的环境中训练代理,如下所示: 代理通过选择离散 Action (左、右、上、下)来控制汽车 目标是以理想的速度行驶而不会撞到其他汽车 状态包含代理的汽车和周围汽车的速度和位
我正在实现简单的 DQN算法使用 pytorch , 解决来自 gym 的 CartPole 环境.我已经调试了一段时间,我无法弄清楚为什么模型没有学习。 观察: 使用 SmoothL1Loss性能比
我正在开发一个网络打印海报打印应用程序。 我正在考虑使用 PHP 来裁剪用户上传的图像,我们最终将打印 PHP 裁剪的图像。 我担心的是原始用户上传的图像与被 PHP 裁剪后的图像之间的“质量”会有所
我是一名优秀的程序员,十分优秀!