试图传递自定义损失,但它不允许我这样做 AttributeError:“浮动”对象没有属性“向后”

问题描述

我有一个自定义损失函数,正在尝试在模型上使用,但是当我在Pytorch中使用loss.backward()时不起作用。

这是我的损失函数

class Neg_Pearson(nn.Module):    # Pearson range [-1,1] so if < 0,abs|loss| ; if >0,1- loss
    def __init__(self):
        super(Neg_Pearson,self).__init__()
        return
    def forward(self,preds,labels):       # tensor [Batch,Temporal]
        loss = 0
        for i in range(preds.shape[0]):
            sum_x = torch.sum(preds[i])                # x
            sum_y = torch.sum(labels[i])               # y
            sum_xy = torch.sum(preds[i]*labels[i])        # xy
            sum_x2 = torch.sum(torch.pow(preds[i],2))  # x^2
            sum_y2 = torch.sum(torch.pow(labels[i],2)) # y^2
            N = preds.shape[1]
            pearson = (N*sum_xy - sum_x*sum_y)/(torch.sqrt((N*sum_x2 - torch.pow(sum_x,2))*(N*sum_y2 - torch.pow(sum_y,2))))
                        
            loss += 1 - pearson
        
        
        loss = loss.tolist()
        loss = loss/preds.shape[0]
        #print(loss) 
        return loss

当我尝试在像这样的模型上使用它时:

        yp = (yp-torch.mean(yp)) /torch.std(yp)     # normalize
        yt = (yt-torch.mean(yt)) /torch.std(yt)     # normalize
        
        
        
        loss = neg_pears_loss(yp,yt)
        print(loss)
        
        
        optimizer.zero_grad()
        loss.backward()
        optimizer.step()

我收到以下错误消息:AttributeError: 'float' object has no attribute 'backward'关于如何解决此问题的任何建议?

解决方法

backward是PyTorch Tensor的功能。调用loss.tolist()时,您破坏了计算图,因此无法从那里向后退。我不确定您要用那行代码完成什么,但是注释掉应该有帮助。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...