# Copyright (c) 2021 PaddlePaddle Authors. All Rights Reserve. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. import numpy as np import paddle from paddle import nn import paddle.nn.functional as F from paddleseg.cvlibs import manager @manager.LOSSES.add_component class MixedLoss(nn.Layer): """ Weighted computations for multiple Loss. The advantage is that mixed loss training can be achieved without changing the networking code. Args: losses (list[nn.Layer]): A list consisting of multiple loss classes coef (list[float|int]): Weighting coefficient of multiple loss Returns: A callable object of MixedLoss. """ def __init__(self, losses, coef): super(MixedLoss, self).__init__() if not isinstance(losses, list): raise TypeError('`losses` must be a list!') if not isinstance(coef, list): raise TypeError('`coef` must be a list!') len_losses = len(losses) len_coef = len(coef) if len_losses != len_coef: raise ValueError( 'The length of `losses` should equal to `coef`, but they are {} and {}.' .format(len_losses, len_coef)) self.losses = losses self.coef = coef def forward(self, logits, labels): loss_list = [] for i, loss in enumerate(self.losses): output = loss(logits, labels) loss_list.append(output * self.coef[i]) return loss_list