Вариант 1:
Сделайте ручной цикл для эпох и партий, используйте метод train_on_batch
, который также принимает class_weight
:
for epoch in range(epochs):
for batchX,batchY in batches: #adapt this loop to your way of creating/getting batches
weights = calculateOrGetTheWeights(batch)
model.train_on_batch(batchX,batchY,...,class_weight=weights)
Вариант 2:
Создание собственной потери. Может быть более сложным и зависит от формата данных, количества классов, типа функции потерь и т. Д.
Предположим, 2D-данные (образцы, классы) и проблема мультикласса:
import keras.backend as K
def customLoss(yTrue,yPred):
classes = K.argmax(yTrue)
classCount = K.sum(yTrue,axis=0)
loss = K.some_loss_function(yTrue,yPred)
return loss / K.gather(classCount, classes)
Предполагая двоичную классификацию (только 1 класс) с 1D или 2D данными:
import keras.backend as K
def binaryCustomLoss(yTrue,yPred):
positives = yTrue
negatives = 1 - yTrue
positiveRatio = K.mean(positives)
negativeRatio = 1 - positiveRatio #or K.mean(negatives)
weights = (positives / positiveRatio) + (negatives / negativeRatio)
#you may need K.squeeze(weights) here
return weights * K.some_loss_function(yTrue,yPred)
Предупреждение: обе функции потерь будут возвращать Nan (или бесконечность), если число классов равно нулю.