1234567891011121314151617181920212223242526272829303132333435363738 |
- #!/usr/bin/env python
- # -*- coding: utf-8 -*-
- # time: 2023/5/8 13:15
- # file: loss.py.py
- # author: David
- # company: shenyang JY
- import tensorflow as tf
- from keras import backend as K
- import keras
- class SouthLoss(keras.losses.Loss):
- def __init__(self, cap, units=None):
- """
- 南网新规则损失函数
- :param cap:装机容量
- """
- super().__init__()
- self.cap = 0.2 * cap
- def call(self, y_true, y_predict):
- """
- 自动调用
- :param y_true: 标签
- :param y_predict: 预测
- :return: 损失值
- """
- # 计算实际和预测的差值
- diff = y_true - y_predict
- # y_true 减去 0.2cap,再乘以1000,y_true所有低于0.2cap的为高负值,高于0.2cap为高正值
- # 再sigmoid函数,对于高正值,此函数为1,对于高负值,此函数为0
- logistic_values = tf.sigmoid(1000 * (y_true - self.cap))
- # logistic_values,遮罩了所有负值,1-logistic_values,遮罩了所有正值
- # 遮罩负值,正值保留原有差值,遮罩正值,负值用0.2cap替换负值
- base = logistic_values * diff + (1-logistic_values)*self.cap
- loss = K.square(diff/base)
- loss = K.mean(loss, axis=-1)
- return loss
|