Keras支持class_weights
功能,允许为不同类别分配不同的权重 – 例如在样本数量不平衡时
我想做类似的事情,但使用基于每批次类别不平衡的动态权重。
这是可能的吗?
回答:
选项1:
手动循环处理epochs和batches,使用train_on_batch
方法,该方法也接受class_weight
参数:
for epoch in range(epochs): for batchX,batchY in batches: #根据你创建/获取批次的方式调整这个循环 weights = calculateOrGetTheWeights(batch) model.train_on_batch(batchX,batchY,...,class_weight=weights)
选项2:
创建自定义损失函数。这可能更复杂,取决于数据格式、类别数量、损失函数类型等。
假设是2D数据(样本,类别)并且是多类别问题:
import keras.backend as Kdef 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 Kdef binaryCustomLoss(yTrue,yPred): positives = yTrue negatives = 1 - yTrue positiveRatio = K.mean(positives) negativeRatio = 1 - positiveRatio #或者K.mean(negatives) weights = (positives / positiveRatio) + (negatives / negativeRatio) #你可能需要在这里使用K.squeeze(weights) return weights * K.some_loss_function(yTrue,yPred)
警告:如果任何类别的计数为零,这两个损失函数都会返回Nan(或无穷大)。