__init__.py 2.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465
  1. import copy
  2. import paddle
  3. import paddle.nn as nn
  4. from paddlex.ppcls.utils import logger
  5. from .celoss import CELoss, MixCELoss
  6. from .googlenetloss import GoogLeNetLoss
  7. from .centerloss import CenterLoss
  8. from .emlloss import EmlLoss
  9. from .msmloss import MSMLoss
  10. from .npairsloss import NpairsLoss
  11. from .trihardloss import TriHardLoss
  12. from .triplet import TripletLoss, TripletLossV2
  13. from .supconloss import SupConLoss
  14. from .pairwisecosface import PairwiseCosface
  15. from .dmlloss import DMLLoss
  16. from .distanceloss import DistanceLoss
  17. from .distillationloss import DistillationCELoss
  18. from .distillationloss import DistillationGTCELoss
  19. from .distillationloss import DistillationDMLLoss
  20. from .multilabelloss import MultiLabelLoss
  21. from .deephashloss import DSHSDLoss, LCDSHLoss
  22. class CombinedLoss(nn.Layer):
  23. def __init__(self, config_list):
  24. super().__init__()
  25. self.loss_func = []
  26. self.loss_weight = []
  27. assert isinstance(config_list, list), (
  28. 'operator config should be a list')
  29. for config in config_list:
  30. assert isinstance(config,
  31. dict) and len(config) == 1, "yaml format error"
  32. name = list(config)[0]
  33. param = config[name]
  34. assert "weight" in param, "weight must be in param, but param just contains {}".format(
  35. param.keys())
  36. self.loss_weight.append(param.pop("weight"))
  37. self.loss_func.append(eval(name)(**param))
  38. def __call__(self, input, batch):
  39. loss_dict = {}
  40. # just for accelerate classification traing speed
  41. if len(self.loss_func) == 1:
  42. loss = self.loss_func[0](input, batch)
  43. loss_dict.update(loss)
  44. loss_dict["loss"] = list(loss.values())[0]
  45. else:
  46. for idx, loss_func in enumerate(self.loss_func):
  47. loss = loss_func(input, batch)
  48. weight = self.loss_weight[idx]
  49. loss = {key: loss[key] * weight for key in loss}
  50. loss_dict.update(loss)
  51. loss_dict["loss"] = paddle.add_n(list(loss_dict.values()))
  52. return loss_dict
  53. def build_loss(config):
  54. module_class = CombinedLoss(copy.deepcopy(config))
  55. logger.debug("build loss {} success.".format(module_class))
  56. return module_class