在 pytorch 中使用多个损失函数

     2023-03-28     134

关键词:

【中文标题】在 pytorch 中使用多个损失函数【英文标题】:Using multiple loss functions in pytorch 【发布时间】:2021-02-20 14:57:12 【问题描述】:

我正在处理图像恢复任务,我考虑了多个损失函数。我的计划是考虑 3 条路线:

1:使用多个损失进行监控,但仅使用少数损失进行自身训练 2:在用于训练的那些损失函数中,我需要给每个函数一个权重——目前我正在指定权重。我想让那个参数自适应。 3:如果在训练之间 - 如果我观察到饱和,我想改变损失函数。或其组件。目前我考虑重新训练一个网络(如果在第一次训练中模型饱和),使其在第一个 M 时期使用特定的损失函数进行训练,然后我改变损失。

    除了最后一种情况,我开发了一个计算这些损失的代码,但我不确定它是否会起作用。 - 即它是否会反向传播? (代码如下)

    在使用损失函数组合时是否可以自适应地给出权重 - 即我们可以训练网络以便也学习这些权重吗?

    这个实现可以用于上面提到的改变损失函数的案例 3

抱歉,如果这里给出的任何内容不明确或错误。如果我必须改进这个问题,请告诉我。 (我对 PyTorch 有点陌生)

criterion = _criterion
#--training
prediction = model(input)
loss = criterion(prediction, target)
loss.backward()



class _criterion(nn.Module):

    def __init__(self, model_type="CNN"):

        super(_criterion).__init__()    

        self.model_type = model_type

        

    def forward(self, pred, ref):

        loss_1 = lambda x,y : nn.MSELoss(size_average=False)(x,y)       

        loss_2 = lambda x,y : nn.L1Loss(size_average=False)(x,y)        

        loss_3 = lambda x,y : nn.SmoothL1Loss(size_average=False)(x,y)  

        loss_4 = lambda x,y : L1_Charbonnier_loss_()(x,y)     #user-defined         


        if opt.loss_function_order == 1:

            loss_function_1 = get_loss_function(opt.loss_function_1)

            loss = lambda x,y: 1*loss_function_1(x,y)  

        
        elif opt.loss_function_order == 2:

            loss_function_1 = get_loss_function(opt.loss_function_1)

            loss_function_2 = get_loss_function(opt.loss_function_2)

            weight_1 = opt.loss_function_1_weight

            weight_2 = opt.loss_function_2_weight

            loss = lambda x,y: weight_1*loss_function_1(x,y) + weight_2*loss_function_2(x,y)

        elif opt.loss_function_order == 3:

            loss_function_1 = get_loss_function(opt.loss_function_1)

            loss_function_2 = get_loss_function(opt.loss_function_2)

            loss_function_3 = get_loss_function(opt.loss_function_3)

        

            weight_1 = opt.loss_function_1_weight

            weight_2 = opt.loss_function_2_weight

            weight_3 = opt.loss_function_3_weight

        

            loss = lambda x,y: weight_1*loss_function_1(x,y) + weight_2*loss_function_2(x,y) +  weight_3*loss_function_3(x,y)    

        elif opt.loss_function_order == 4:

            loss_function_1 = get_loss_function(opt.loss_function_1)

            loss_function_2 = get_loss_function(opt.loss_function_2)

            loss_function_3 = get_loss_function(opt.loss_function_3)

            loss_function_4 = get_loss_function(opt.loss_function_4)

                

            weight_1 = opt.loss_function_1_weight

            weight_2 = opt.loss_function_2_weight

            weight_3 = opt.loss_function_3_weight

            weight_4 = opt.loss_function_4_weight     

           

            loss = lambda x,y: weight_1*loss_function_1(x,y) + weight_2*loss_function_2(x,y) +  weight_3*loss_function_3(x,y)  +  weight_4*loss_function_4(x,y)       

        else:

            raise Exception("_criterion : unable to interpret loss_function_order")

        return loss(ref,pred), loss_1(ref,pred), loss_2(ref,pred), loss_3(ref,pred), loss_4(ref,pred)



def get_loss_function(loss):    

    if loss == "MSE":

        criterion = nn.MSELoss(size_average=False)

    elif loss == "MAE":

        criterion = nn.L1Loss(size_average=False) 

    elif loss == "Smooth-L1":

        criterion = nn.SmoothL1Loss(size_average=False) 

    elif loss == "Charbonnier":

        criterion = L1_Charbonnier_loss_()
    else:

        raise Exception("not implemented")
    return criterion


class L1_Charbonnier_loss_(nn.Module):

    def __init__(self):

        super(L1_Charbonnier_loss_, self).__init__()

        self.eps = 1e-6 

    def forward(self, X, Y):

        diff = torch.add(X, -Y) 

        error = self.eps*((torch.sqrt(1+((diff * diff)/self.eps)))-1)

        loss = torch.sum(error) 

        return loss

【问题讨论】:

【参考方案1】:

而我理解你的问题。您的误差计算函数将进行反向传播,但在使用误差函数时需要小心,因为它们在每种情况下的工作方式不同。 关于权重,您需要保存此网络的权重,然后使用 pytorch 的迁移学习将其再次加载到另一个网络中,以便您可以使用其他执行的权重。Here 是有关如何使用的链接从 pythorch 学习迁移。

【讨论】:

如何在 PyTorch 中添加自定义定位损失函数?

】如何在PyTorch中添加自定义定位损失函数?【英文标题】:HowtoaddacustomlocalizationlossfunctioninPyTorch?【发布时间】:2021-10-0323:00:27【问题描述】:我有一个PyTorch网络,它使用Wi-FiRSS数据预测设备的位置。所以输出层包含两个对应于x... 查看详情

PyTorch 中使用 DNN 输出和附加变量的自定义损失函数

】PyTorch中使用DNN输出和附加变量的自定义损失函数【英文标题】:CustomizedlossfunctioninPyTorchwhichusesDNNoutputsandadditionalvariables【发布时间】:2021-05-0420:53:02【问题描述】:(如果我的英语不好,我很抱歉)如果函数只需要DNN输出向... 查看详情

我是否需要在pytorch中创建多个神经网络实例来测试多个损失函数?(代码片段)

我在PyTorch中写了一个神经网络,我想在这个网络上比较两种不同损失函数的结果我应该开始制作两个不同的网络实例,并像这样测试每个网络的一个丢失功能network_w_loss_1=ANN().cuda()network_w_loss_2=ANN().cuda()crit_loss_1=loss_1()crit_loss_2=lo... 查看详情

如何在一个模型中训练多个损失,并在 pytorch 中选择冻结网络的某些部分?

】如何在一个模型中训练多个损失,并在pytorch中选择冻结网络的某些部分?【英文标题】:Howtotrainmultiplelossesinonemodelwithfreezingsomepartofthenetworkoptionallyinpytorch?【发布时间】:2020-10-0911:49:20【问题描述】:我是pytorch的新手。我正... 查看详情

如何在pytorch中获取自定义损失函数的权重?

】如何在pytorch中获取自定义损失函数的权重?【英文标题】:Howtogetweightsforcustomlossfunctioninpytorch?【发布时间】:2018-09-2318:49:33【问题描述】:我在pytorch中有一个模型,想在loss_function中添加L1正则化。但我不想将权重传递给loss_f... 查看详情

PyTorch 中自定义后向函数的损失 - 简单 MSE 示例中的爆炸损失

】PyTorch中自定义后向函数的损失-简单MSE示例中的爆炸损失【英文标题】:LosswithcustombackwardfunctioninPyTorch-explodinglossinsimpleMSEexample【发布时间】:2021-05-0222:45:56【问题描述】:在处理更复杂的事情之前,我知道我必须实现自己的ba... 查看详情

pytorch中序数多分类的损失函数

】pytorch中序数多分类的损失函数【英文标题】:Lossfunctionforordinalmulticlassificationinpytorch【发布时间】:2019-03-1614:57:06【问题描述】:我是DNN和pytorch的初学者。我正在处理一个多分类问题,其中我的标签被编码成一个单热向量,... 查看详情

Pytorch:为啥在 nn.modules.loss 和 nn.functional 模块中都实现了损失函数?

】Pytorch:为啥在nn.modules.loss和nn.functional模块中都实现了损失函数?【英文标题】:Pytorch:Whylossfunctionsareimplementedbothinnn.modules.lossandnn.functionalmodule?Pytorch:为什么在nn.modules.loss和nn.functional模块中都实现了损失函数?【发布时间】... 查看详情

4.6pytorch使用损失函数(代码片段)

欢迎订阅本专栏:《PyTorch深度学习实践》订阅地址:https://blog.csdn.net/sinat_33761963/category_9720080.html第二章:认识Tensor的类型、创建、存储、api等,打好Tensor的基础,是进行PyTorch深度学习实践的重中之重的基础... 查看详情

Pytorch 语义分割损失函数

】Pytorch语义分割损失函数【英文标题】:Pytorchsemanticsegmentationlossfunction【发布时间】:2021-07-3018:11:20【问题描述】:我是细分模型的新手。我想使用deeplabv3_resnet50模型。我的图像形状为(256,256,3),我的标签形状为(256,256)。我标签... 查看详情

PyTorch 运行自定义损失函数

】PyTorch运行自定义损失函数【英文标题】:PyTorchGettingCustomLossFunctionRunning【发布时间】:2018-09-2401:21:14【问题描述】:我正在尝试通过扩展nn.Module来使用自定义损失函数,但我无法克服错误变量的元素0不需要grad并且没有grad_fn... 查看详情

在pytorch中使用交叉熵损失时我应该使用softmax作为输出吗?

】在pytorch中使用交叉熵损失时我应该使用softmax作为输出吗?【英文标题】:ShouldIusesoftmaxasoutputwhenusingcrossentropylossinpytorch?【发布时间】:2019-09-0414:51:07【问题描述】:我在为pytorch中的MNIST数据集分类具有2个隐藏层的完全连接的... 查看详情

如何在 PyTorch 中计算自举交叉熵损失?

】如何在PyTorch中计算自举交叉熵损失?【英文标题】:HowdoIcomputebootstrappedcrossentropylossinPyTorch?【发布时间】:2020-12-2309:03:28【问题描述】:我读过一些论文,它们使用“自举交叉熵损失”来训练他们的分割网络。我们的想法是... 查看详情

Pytorch NLLLOSS 的理解

】PytorchNLLLOSS的理解【英文标题】:UnderstandingofPytorchNLLLOSS【发布时间】:2021-11-1808:56:24【问题描述】:PyTorch的负对数似然损失,nn.NLLLoss定义为:因此,如果使用单批次中一个的标准重量计算损失,则损失的公式始终为:-1*(正... 查看详情

使用 PyTorch 的交叉熵损失函数是不是需要 One-Hot Encoding?

】使用PyTorch的交叉熵损失函数是不是需要One-HotEncoding?【英文标题】:IsOne-HotEncodingrequiredforusingPyTorch\'sCrossEntropyLossFunction?使用PyTorch的交叉熵损失函数是否需要One-HotEncoding?【发布时间】:2020-10-0821:34:14【问题描述】:例如,... 查看详情

忽略 keras 中 R 的缺失目标值的损失函数

...用kerasR-package将LSTM模型拟合到多元时间序列(关于Python或PyTorch中的keras的答案也会有帮助,因为我可以切换)并且有多个输出(3个连续的,一个分类)。一些目标在某些时间步长 查看详情

pytorch学习笔记8.实现线性回归模型

PyTorch学习笔记8.实现线性回归模型一、回归的概念1.概念2.目标3.应用4.训练线性回归的步骤二、数据集1.构造数据集2.把数据集转为pytorch使用的张量三、模型1.模型定义2.损失函数3.优化器四、使用模型1.训练2.测试3.预测4.可视化五... 查看详情

学习笔记pytorch十二损失函数与反向传播(代码片段)

【学习笔记】【Pytorch】十二、损失函数与反向传播一、损失函数的介绍1.L1Loss类的使用代码实现2.MSELoss类的使用3.损失函数在模型中的实现二、反向传播一、损失函数的介绍参考:损失函数(lossfunction)pytorchloss-functio... 查看详情