# 总loss由多个loss组成时的组合

**1. 系统环境**

硬件环境\(Ascend/GPU/CPU\): Ascend/GPU/CPU

软件环境: MindSpore 版本: 2.0.0

执行模式（静态图/动态图）： 不限

Python 版本: 3.7.6

操作系统平台: linux

**2. 报错信息**

2.1 问题描述

损失函数返回loss1和loss2， 网络中的loss被定义为loss=alpha\*loss1 + beta\*loss2，其中alpha和beta是参数。使用pytorch的思路描述的话，类似于：

```
loss1, loss2 = loss_fn(output, target)
loss = alpha*loss1 + beta*loss2
loss.backward()
```

在自定义返回多个值的loss函数后仍需自定义TrainOneStepCell，使用类似如下的方法实现损失函数返回多个值：

```
net = Net()
loss_fn = MyLoss()
loss_with_net = MyWithLossCell(net, loss_fn)
train_net = MyTrainOneStepCell(loss_with_net, optim)
model = Model(net=train_net, loss_fn=None, optimizer=None)
```

似于pytorch中整合最终loss=alpha\*loss1 + beta\*loss2和loss.backward\(\)的步骤应该在以上哪一步实现？

**3. 根因分析**

可以自定义损失函数，继承框架中的基类 nn.LossBase，重写 construct 方法。

**4. 解决方案**

样例如下：

```
class MyLoss(nn.LossBase):
    def __init__(self, alpha=0.5, beta=0.5):
        super(MyLoss, self).__init__()
        self.alpha = alpha
        self.beta = beta

    def construct(self, logits, labels):
        return self.alpha * loss_fn1(logits, labels) + self.beta * loss_fn2(logits, labels)


net = Net()
loss_fn = MyLoss()
loss_with_net = MyWithLossCell(net, loss_fn)
train_net = MyTrainOneStepCell(loss_with_net, optim)
model = Model(net=train_net, loss_fn=None, optimizer=None)
```

