梯度计算所需的变量之一已通过就地操作进行了修改

时间:2018-11-25 12:31:17

标签: python pytorch

这是我的LossFunction,当我使用此函数时,会出现此错误。
而且我已经测试过使用nn.L1Loss()代替我的LossFunction,并且网络还可以。
我该怎么办?感谢您的帮助!

class LossV1(nn.Module):
    def __init__(self,weight=1,pos_weight=1,scale_factor=2.5):
        super(LossV1,self).__init__()
        self.weight = weight
        self.pos_weight = pos_weight
        self.scale_factor = scale_factor

    def forward(self,pred,truth):
        objmask = torch.tensor(truth[:,:6,:,:],dtype=torch.float32,requires_grad=False)
        #没有物体的Boxes,置信度损失*0.4
        objmask[objmask<0.65] = 0.4
        #辅助Boxes,系数0.8
        objmask[(objmask>0.649)*(objmask<0.949)] = 0.8
        objLoss = torch.sum(objmask*self.myBCEWithLogitsLoss(pred[:,:6,:,:],truth[:,:6,:,:]))
        #没有物体的Boxes,只计算置信度损失
        objmask[objmask<0.41] = 0
        personLoss = torch.sum(objmask*self.myBCEWithLogitsLoss(pred[:,6:12,:,:],truth[:,6:12,:,:]))
        carLoss = torch.sum(objmask*self.myBCEWithLogitsLoss(pred[:,12:18,:,:],truth[:,12:18,:,:]))
        wLoss = torch.sum(objmask*self.myL2Loss(pred[:,18:24,:,:],truth[:,18:24,:,:]))
        hLoss = torch.sum(objmask*self.myL2Loss(pred[:,24:,:,:],truth[:,24:,:,:]))
        return objLoss+personLoss+carLoss+wLoss+hLoss

    def myBCEWithLogitsLoss(self,x,y):
        #pos_weight>1增加召回,pos_weight<1提高精度
        return -self.weight*(self.pos_weight*y*torch.log(torch.sigmoid(x))+(1-y)*torch.log(1-torch.sigmoid(x)))

    def myL2Loss(self,x,y):
        return torch.pow(self.scale_factor*torch.sigmoid(x/self.scale_factor) - y,2)

1 个答案:

答案 0 :(得分:1)

我只需删除objmask,并在生成函数中对其进行计算,然后将其传递给带有真值标签的LossFunction,网络就可以正常工作。
我不明白自己已经做过requires_grad=False,为什么pytroch仍会计算梯度。