You need to enable JavaScript to run this app. PyTorch交叉熵DCA组合损失转换为Keras自定义多分类损失咨询
优惠活动
大模型
产品
解决方案
定价
更多

PyTorch交叉熵DCA组合损失转换为Keras自定义多分类损失咨询

带DCA校准项的多分类损失函数Keras适配实现

核心思路

该损失函数的设计参考医学影像分类领域的校准优化方案,核心是在交叉熵损失基础上增加预测置信度与准确率差值(DCA)作为辅助惩罚项,将置信度校准融入模型训练流程:当交叉熵持续下降但分类准确率停滞时,DCA项会自动施加惩罚,避免模型出现过度自信的置信度偏移问题。

原PyTorch版本实现

import torch
from torch.nn import functional as F

def cross_entropy_with_dca_loss(logits, labels, weights=None, alpha=1., beta=10.):        
    ce = F.cross_entropy(logits, labels, weight=weights)

    softmaxes = F.softmax(logits, dim=1)
    confidences, predictions = torch.max(softmaxes, 1)
    accuracies = predictions.eq(labels)
    mean_conf = confidences.float().mean()
    acc = accuracies.float().sum()/len(accuracies)
    dca = torch.abs(mean_conf-acc)
    loss = alpha*ce+beta*dca
    
    return loss

适配后Keras自定义损失函数

适配要求:输入为多分类one-hot真实标签y_true、softmax输出的预测概率y_pred,可直接替代categorical cross-entropy使用。

import tensorflow as tf
from tensorflow.keras import backend as K

def cross_entropy_with_dca_loss(alpha=1.0, beta=10.0, class_weights=None):
    """
    带DCA校准项的多分类损失函数
    :param alpha: 交叉熵损失权重,默认1.0
    :param beta: DCA校准项权重,默认10.0,可根据实际校准需求调整
    :param class_weights: 类别权重数组,可选,用于不平衡分类场景
    :return: 可直接传入model.compile的损失函数对象
    """
    def calculate_loss(y_true, y_pred):
        # 计算基础分类交叉熵损失
        ce = K.categorical_crossentropy(y_true, y_pred)
        # 若传入类别权重则加权处理
        if class_weights is not None:
            weight_tensor = K.constant(class_weights, dtype=K.floatx())
            sample_weights = K.gather(weight_tensor, K.argmax(y_true, axis=-1))
            ce = ce * sample_weights
        ce = K.mean(ce)

        # 计算DCA校准项
        confidences = K.max(y_pred, axis=-1)
        pred_labels = K.argmax(y_pred, axis=-1)
        real_labels = K.argmax(y_true, axis=-1)
        acc = K.mean(K.cast(K.equal(pred_labels, real_labels), K.floatx()))
        mean_conf = K.mean(confidences)
        dca = K.abs(mean_conf - acc)

        # 返回总损失
        return alpha * ce + beta * dca
    return calculate_loss

使用示例

# 模型编译时直接传入损失函数即可,可自定义alpha、beta参数
model.compile(
    optimizer='adam',
    loss=cross_entropy_with_dca_loss(alpha=1.0, beta=8.0),
    metrics=['accuracy']
)

内容的提问来源于stack exchange,提问作者shiva

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.08 16:36:03