sloss.py 1.3 KB

1234567891011121314151617181920212223242526272829303132333435363738
  1. #!/usr/bin/env python
  2. # -*- coding: utf-8 -*-
  3. # time: 2023/5/8 13:15
  4. # file: loss.py.py
  5. # author: David
  6. # company: shenyang JY
  7. import tensorflow as tf
  8. from keras import backend as K
  9. import keras
  10. class SouthLoss(keras.losses.Loss):
  11. def __init__(self, cap, units=None):
  12. """
  13. 南网新规则损失函数
  14. :param cap:装机容量
  15. """
  16. super().__init__()
  17. self.cap = 0.2 * cap
  18. def call(self, y_true, y_predict):
  19. """
  20. 自动调用
  21. :param y_true: 标签
  22. :param y_predict: 预测
  23. :return: 损失值
  24. """
  25. # 计算实际和预测的差值
  26. diff = y_true - y_predict
  27. # y_true 减去 0.2cap,再乘以1000,y_true所有低于0.2cap的为高负值,高于0.2cap为高正值
  28. # 再sigmoid函数,对于高正值,此函数为1,对于高负值,此函数为0
  29. logistic_values = tf.sigmoid(1000 * (y_true - self.cap))
  30. # logistic_values,遮罩了所有负值,1-logistic_values,遮罩了所有正值
  31. # 遮罩负值,正值保留原有差值,遮罩正值,负值用0.2cap替换负值
  32. base = logistic_values * diff + (1-logistic_values)*self.cap
  33. loss = K.square(diff/base)
  34. loss = K.mean(loss, axis=-1)
  35. return loss