pytorch自定义loss,如何进行后向传播loss.backward()?

之前loss用自带的MSE,这样写的

criterion = nn.MSELoss(size_average=False).cuda()
...
loss = criterion(output, target)
loss.backward()

这样是没有问题的


现在需要用自定义loss函数newLoss,因为要逐个像素进行loss运算(算法需要)

#this is in model.py
class newLoss(nn.Module):
    def __init__(self):
        super(newLoss, self).__init__()
    def forward(self, output, gt):
        loss = 0
        for row_out, row_gt :
            for pixel_out, pixel_gt :
                loss += something pixelwise
        return loss
# this is in train.py
newloss = newLoss()
loss = newloss(output,gt)

这样计算出来的loss是float类型的,下面的代码会报
''AttributeError: 'float' object has no attribute 'backward''
的错


我现在的做法是:把newloss数值加到原来的MSE类型loss上:

criterion = nn.MSELoss(size_average=False).cuda()
...
loss = criterion(output, target)
newloss= newLoss()
loss += newloss(output,gt)
loss.backward()

这样写我新加的newloss在后向传播时能生效吗?

0
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
其他相关推荐
Pytorch问题:autograd与backward()及相关参数的理解
关于backward标量的问题 问题提出 在pytorch的官方教程中,有这么一段(我稍微修改了一些) import torch #x = torch.randn(3, requires_grad=True) x = torch.tensor([-1.0, -0.1, -0.05],requires_grad=True) print(x) y = x * 2 index = 0 while...
pytorch学习笔记(三):自动求导
本片博文主要是对http://pytorch.org/docs/notes/autograd.html的部分翻译以及自己的理解,如有错误,欢迎指正! Backward过程中排除子图 pytorch的BP过程是由一个函数决定的,loss.backward(), 可以看到backward()函数里并没有传要求谁的梯度。那么我们可以大胆猜测,在BP的过程中,pytorch是将所有影响loss的Var...
在Pytorch下,由于反向传播设置错误导致 loss不下降的原因及解决方案*
在Pytorch下,由于反向传播设置错误导致 loss不下降的原因及解决方案 本人研究生渣渣一枚,第一次写博客,请各路大神多多包含。刚刚接触深度学习一段时间,一直在研究计算机视觉方面,现在也在尝试实现自己的idea,从中也遇见了一些问题,这次就专门写一下,自己由于在反向传播(backward)过程中参数没有设置好,而导致的loss不下降的原因。 对于多个网络交替 【描述】简单描述一下我的网络结构,...
pytorch: 自定义损失函数Loss
pytorch: 自定义损失函数Loss pytorch中自带了一些常用的损失函数,它们都是torch.nn.Module的子类。因此自定义Loss函数也需要继承该类。 在__init__函数中定义所需要的超参数,在forward函数中定义loss的计算方法。forward方法就是实际定义损失函数的地方,其返回值是一个标量(Scalar),而不是张量(Tensor)和向量(Vector)。也就...
PyTorch(六)——梯度反向传递(BackPropogate)的理解
目录连接 (1) 数据处理 (2) 搭建和自定义网络 (3) 使用训练好的模型测试自己图片 (4) 视频数据的处理 (5) PyTorch源码修改之增加ConvLSTM层 (6) 梯度反向传递(BackPropogate)的理解 (总) PyTorch遇到令人迷人的BUG PyTorch的学习和使用(六) 多个网络交替情况 最近使用PyTorch搭一个对抗网络,由于对抗...
Pytorch如何自定义Loss
将Loss视作单独的层,在forward函数里写明loss的计算方式,无需定义backwardclass MyLoss(nn.Module): def __init__(self): super(MyLoss, self).__init__() print '1' def forward(self, pred, truth): ret...
PyTorch学习系列(五)——自定义loss
在PyTorch中可以自定义loss,并且只要输入到输出的过程中一直使用的都是Variable(没有用tensor或者numpy),那么loss可以自动求梯度。
Pytorch自定义网络结构+读取自己数据+自定义Loss 全过程代码示例
1、限定使用GPU的序号import os os.environ['CUDA_VISIBLE_DEVICES'] = '3' os.system('echo $CUDA_VISIBLE_DEVICES')2、导入相关头文件import torch import torch.nn as nn import torch.nn.functional as F import torch.utils.dat...
【DeepLearning】PyTorch 如何自定义损失函数(Loss Function)?
转自:https://www.zhihu.com/question/66988664 文章目录1. 直接利用torch.Tensor提供的接口2. 利用PyTorch的numpy/scipy扩展3. 写一个PyTorch的C扩展 1. 直接利用torch.Tensor提供的接口 因为只是需要自定义loss,而loss可以看做对一个或多个Tensor的混合计算,比如计算一个三元组的Loss(Tr...
PyTorch学习笔记(4)——自定义Loss Function(自动打印每次的梯度)
在stackoverflow上看到一个名叫Ismail_Elezi的老铁问了个自定义Loss Function的问题,它的问题在于:1)反向传播报错 2)矩阵算法使用不行 3)算法数值稳定性不行。 我决定在这个例子的基础上(它应该不是torch 0.4.0的新版本,因为看他的变量还是用Variable格式),对自定义的Loss Function进行说明基于新版本(torch 0.4.0)是如...
PyTorch: 梯度下降及反向传播
线性模型 线性模型介绍 线性模型是很常见的机器学习模型,通常通过线性的公式来拟合训练数据集。训练集包括(x,y),x为特征,y为目标。如下图: 将真实值和预测值用于构建损失函数,训练的目标是最小化这个函数,从而更新w。当损失函数达到最小时(理想上,实际情况可能会陷入局部最优),此时的模型为最优模型,线性模型常见的的损失函数: 线性模型例子 下面通过一个例子可以观察不同权重...
深度学习【29】pytorch 自定义损失函数
构建一个加权函数: loss=w1∗loss1+w2∗loss2loss = w1*loss1+w2*loss2class myloss(nn.Module): def __init__(self,w1,w2): super(myloss,self).__init__() self.w1 = w1 self.w2 = w2 r
在pytorch框架下,训练model过程中,loss=nan问题时该怎么解决?
当我在UCF-101数据集训练alexnet时,epoch设为100,跑到三十多个epoch时,出现了loss=nan问题,当时是一脸懵逼,在查阅资料后,我通过减小学习率解决了问题,现总结一下出现这个问题的可能原因及解决方法: 1.  减小整体学习率。学习率比较大的时候,参数可能over shoot了,结果就是找不到极小值点; 减小学习率可以让参数朝着极值点前进; 2.  改变网络宽度。有可能是...
使用Pytorch训练过程中loss不下降的一种可能原因
在使用Pytorch进行神经网络训练时,有时会遇到训练学习率不下降的问题。出现这种问题的可能原因有很多,包括学习率过小,数据没有进行Normalization等。不过除了这些常规的原因,还有一种难以发现的原因:在计算loss时数据维数不匹配。下面是我的代码: loss_function = torch.nn.MSE_loss() optimizer.zero_grad() output = mod...
pytorch里optimizer作用、自动求导autograd,from_numpy、numpy()等函数声明变量时候的浅拷贝、显卡内存 out of memory
1、其中optimizer的作用,其主要起到的作用就是进行权重的更新,如下: net=models.resnet50(pretrained=False) learning_rate=0.01 # 权重更新 如果使用自带的optimizer函数进行梯度更新,效率更好,因为其还可以引入梯度 #下降的方法,例如动量等方法 for f in net.parameters(): f.data.s...
sigmoid的前向传播以及loss函数计算,后向传播的梯度计算
cs231n只给出了softmax的传播梯度计算,所以自己试着写了sigmoid,此处自己写的sigmoid的后向传播梯度只适用于2分类,且标签为[0,1,0,1…]这种列表形式,后向梯度计算时利用CS231N的梯度校验函数算出来的梯度和自己算的梯度总是相差2倍关系,最后发现可能是计算是将1标签和0标签的损失都算了一遍,多算了一次,相当于数据量为2N import numpy as np imp...
pytorch实现seq2seq时如何对loss进行mask
如何对loss进行mask pytorch官方教程中有一个Chatbot教程,就是利用seq2seq和注意力机制实现的,感觉和机器翻译没什么不同啊,如果对话中一句话有下一句,那么就把这一对句子加入模型进行训练。其中在训练阶段,损失函数通常需要进行mask操作,因为一个batch中句子的长度通常是不一样的,一个batch中不足长度的位置需要进行填充(pad)补0,最后生成句子计算loss时需要忽略那...
pytorch产生loss的计算图
import torch.nn as nn import torch.nn.functional as F class Net(nn.Module):     def __init__(self):         super(Net,self).__init__()         self.conv1=nn.Conv2d(1,6,5)         self.conv2=nn.Conv2d...
pytorch训练过程中loss出现NaN的原因及可采取的方法
在pytorch训练过程中出现loss=nan的情况 1.学习率太高。 2.loss函数 3.对于回归问题,可能出现了除0 的计算,加一个很小的余项可能可以解决 4.数据本身,是否存在Nan,可以用numpy.any(numpy.isnan(x))检查一下input和target 5.target本身应该是能够被loss函数计算的,比如sigmoid激活函数的target应该大于0,...
pytorch中的L2和L1正则化,自定义优化器设置等操作
在pytorch中进行L2正则化,最直接的方式可以直接用优化器自带的weight_decay选项指定权值衰减率,相当于L2正则化中的λλ\lambda,也就是: Lreg=||y−y^||2+λ||W||2(1)(1)Lreg=||y−y^||2+λ||W||2 \mathcal{L}_{reg} = ||y-\hat{y}||^2+\lambda||W||^2 \tag{1} 中的λλ\l...
Torch 中添加自己的 nn Modules:以添加 Dropout、 Triplet Loss 为例
因为要复现前面阅读的一篇论文:《论文笔记:Deep Relative Distance Learning: Tell the Difference Between Similar Vehicles》 中提到的用来区分相似图像的两个损失函数:Triplet Loss、Coupled Cluster Loss 。上面的那篇论文没有提供源代码,因此得自己去写这两个损失函数模块。
【PyTorch学习笔记】8:激活函数,损失函数,使用PyTorch求导
激活函数 在PyTorch的老版本里这些激活函数在torch.nn.functional下,现在大多已经改到了torch下。 Sigmoid 数据将被映射到0到1之间。 f(x)=σ(x)=11+e−xf(x)=\sigma (x)=\frac{1}{1+e^{-x}}f(x)=σ(x)=1+e−x1​ import torch a = torch.linspace(-100, 100, 10)...
pytorch中自定义反向传播,求导
pytorch中自定义backward()函数。在图像处理过程中,我们有时候会使用自己定义的算法处理图像,这些算法多是基于numpy或者scipy等包。那么如何将自定义算法的梯度加入到pytorch的计算图中,能使用Loss.backward()操作自动求导并优化呢。下面的代码展示了这个功能` import torch import numpy as np from PIL import Imag...
深度学习干货学习(2)—— triplet loss
一、Triplet结构: triplet loss是一种比较好理解的loss,triplet是指的是三元组:Anchor、Positive、Negative: 整个训练过程是: 首先从训练集中随机选一个样本,称为Anchor(记为x_a)。 然后再随机选取一个和Anchor属于同一类的样本,称为Positive (记为x_p) 最后再随机选取一个和Anchor属于不同类的样本,称为...
pytorch学习笔记(反向传播)
反向传播算法是一个有效求解梯度的算法,本质上是一个链式求导的法则的应用。 链式法则           考虑一个简单的函数,比如,我们可以直接求出这个函数的微分,但是这里我们要使用链式法则,令q=x+y,那么f=qz,对于这两个式子来说,分别求出他们的微分,,,同时q是x和y的求和,所以可以得到,。关心的问题是,链式法则告诉我们如何求得它们的值。  通过链式法则可以知道,如果对其...
pytorch开发之自定义module
硬件 GPU 软件:pycharm+pytorch+python2 参考文献: https://blog.csdn.net/tsq292978891/article/details/79364140 这一篇在于关注如何构建module https://www.cnblogs.com/hellcat/p/8496850.html 这一篇主要关注最后的数据传入,先进行初始化,在传入参数。(...
pytorch中如何只让指定变量向后传播梯度?
pytorch中如何只让指定变量向后传播梯度? (或者说如何让指定变量不参与后向传播?) 有以下公式,假如要让L对xvar求导: (1)中,L对xvar的求导将同时计算out1部分和out2部分; (2)中,L对xvar的求导只计算out2部分,因为out1的requires_grad=False; (3)中,L对xvar的求导只计算out1部分,因为out2的requires_gr...
pytorch学习笔记4:网络和损失函数的可视化
1.效果 2.环境 1.pytorch 2.visdom 3.python3.5 3.用到的代码 # coding:utf8 import torch from torch import nn, optim # nn 神经网络模块 optim优化函数模块 from torch.utils.data import DataLoader from torch.autograd import Va...
Pytorch学习之十九种损失函数
损失函数通过torch.nn包实现, 1 基本用法 criterion = LossCriterion() #构造函数有自己的参数 loss = criterion(x, y) #调用标准时也有参数 2 损失函数 2-1 L1范数损失 L1Loss torch.nn.L1Loss(size_average=True) 2-2 均方误差损失 MSELoss torch.nn.MSELoss(siz...
pytorch实现focal loss的两种方式
import torch import torch.nn.functional as F import numpy as np from torch.autograd import Variable ''' pytorch实现focal loss的两种方式(现在讨论的是基于分割任务) 在计算损失函数的过程中考虑到类别不平衡的问题,假设加上背景类别共有6个类别 ''' def compute_cl...
pytorch学习_官方tutorial理解(一)
一、What is pytorch?(两点note) 1.1 Any operation that mutates a tensor in-place is post-fixed with an . For example: x.copy(y), x.t_(), will change x. 1.2 All the Tensors on the CPU except a Char Tensor s...
PyTorch绘制训练过程的accuracy和loss曲线
PyTorch、Caffe绘制训练过程的accuracy和loss曲线 衡量模型的好坏其实最重要的看的就是准确率与损失率,所以将其进行可视化是一个非常重要的一步。这样就可以直观明了的看出模型训练过程中准确率以及损失率的变化。 因为博主一直是在caffe和pytorch进行深度学习研究的,之前查了相关资料发现caffe有相关的绘制方法,但是pytorch并没有找到,所以在这里进行总结。 Caf...
Pytorch中使用样本权重(sample_weight)的正确方式
step:1.将标签转换为one-hot形式。2.将每一个one-hot标签中的1改为预设样本权重的值即可在Pytorch中使用样本权重。eg:对于单个样本:loss = - Q * log(P),如下:P = [0.1,0.2,0.4,0.3] Q = [0,0,1,0] loss = -Q * np.log(P)增加样本权重则为loss = - Q * log(P) *sample_weigh
pytorch 加正则化的方法
https://stackoverflow.com/questions/42704283/adding-l1-l2-regularization-in-pytorch
WGAN学习笔记(从理论分析到Pytorch代码实践)
原始的GAN存在的问题 原始的GAN的目标函数实际上可以表现为 −Ex∼Pr[logD(x)]−Ex∼Pg[log(1−D(x))] -E_{x\sim{P_r}}[logD(x)] - E_{x\sim{P_g}[log(1-D(x))]} −Ex∼Pr​​[logD(x)]−Ex∼Pg​[log(1−D(x))]​ 这里PrP_rPr​是真实的样本分布,PgP_gPg​是生成器产生的样本分布。...
Pytorch 学习笔记(二)—— 二分类
1、建立数据集 # 假数据 n_data = torch.ones(100, 2) # 数据的基本形态 x0 = torch.normal(2*n_data, 1) # 类型0 x data (tensor), shape=(100, 2) y0 = torch.zeros(100) # 类型0 y data (tensor), shap...
pytorch的坑---loss没写好,现存爆炸
作者:陈诚 链接:https://www.zhihu.com/question/67209417/answer/344752405 来源:知乎 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。 算是动态图的一个坑吧。记录loss信息的时候直接使用了输出的Variable。 应该不止我经历过这个吧... 久久不用又会不小心掉到这个坑里去... for d
PyTorch(二)——搭建和自定义网络
PyTorch的学习和使用(二)最近刚好在看一篇与Siamese network有关的论文,在PyTorch中没有example,caffe中有,刚好使用PyTorch实现。(PS:图片单独打开更清晰) 主要步骤为: 数据预处理 模型搭建 模型训练 数据预处理Siamese的网络结构如下:通过输入两张图片X1和X2,经过权重共享的CNN,各自得到一个输出特征向量Gw(X1)G_w(X_1)和Gw(
potorch 在loss中加入l2正则
正则化应该是模型每一层的加权参数,而不是每一层的输出。 import torch from torch.autograd import Variable from torch.nn import functional as F class MLP(torch.nn.Module): def __init__(self): super(MLP, self).__ini...
PyTorch里的多分类损失函数
http://blog.leanote.com/post/lincent/PyTorch%E9%87%8C%E7%9A%84%E5%A4%9A%E5%88%86%E7%B1%BB%E6%8D%9F%E5%A4%B1%E5%87%BD%E6%95%B0-2 最近大热的PyTorch即将推出1.0版,做为各类深度学习任务的最优框架之一,PyTorch提供了丰富的损失函数,而多分类任务用到最多的就是n...
文章热词 机器学习教程 Objective-C培训 交互设计视频教程 颜色模型 设计制作学习
相关热词 mysql关联查询两次本表 native底部 react extjs glyph 图标 视频进行大数据处理 怎么进行区块链