| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758 |
- # 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 paddlex.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 = []
- final_output = 0
- for i, loss in enumerate(self.losses):
- output = loss(logits, labels)
- final_output += output * self.coef[i]
- return final_output
|