Https://github.com/keras-team/keras/issues/2115 पर समाधान में जोड़ना । यदि आपको क्लास वेटिंग से अधिक की आवश्यकता है जहां आप झूठी सकारात्मक और झूठी नकारात्मक के लिए अलग-अलग लागत चाहते हैं। नए कार्स संस्करण के साथ अब आप नीचे दिए गए अनुसार संबंधित नुकसान फ़ंक्शन को ओवरराइड कर सकते हैं। ध्यान दें कि weights
एक वर्ग मैट्रिक्स है।
from tensorflow.python import keras
from itertools import product
import numpy as np
from tensorflow.python.keras.utils import losses_utils
class WeightedCategoricalCrossentropy(keras.losses.CategoricalCrossentropy):
def __init__(
self,
weights,
from_logits=False,
label_smoothing=0,
reduction=losses_utils.ReductionV2.SUM_OVER_BATCH_SIZE,
name='categorical_crossentropy',
):
super().__init__(
from_logits, label_smoothing, reduction, name=f"weighted_{name}"
)
self.weights = weights
def call(self, y_true, y_pred):
weights = self.weights
nb_cl = len(weights)
final_mask = keras.backend.zeros_like(y_pred[:, 0])
y_pred_max = keras.backend.max(y_pred, axis=1)
y_pred_max = keras.backend.reshape(
y_pred_max, (keras.backend.shape(y_pred)[0], 1))
y_pred_max_mat = keras.backend.cast(
keras.backend.equal(y_pred, y_pred_max), keras.backend.floatx())
for c_p, c_t in product(range(nb_cl), range(nb_cl)):
final_mask += (
weights[c_t, c_p] * y_pred_max_mat[:, c_p] * y_true[:, c_t])
return super().call(y_true, y_pred) * final_mask