You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

多标签分类模型测试获100%准确率的原因排查求助

多标签分类模型测试获100%准确率的原因排查求助

大家好,我正在做一个多标签分类任务,每个样本需要预测两个独立的标签:action_name和condition。我用了15万张图片做训练和验证,测试集包含3万张图片,模型基于预训练的mobilenet_v2搭建,损失函数采用CrossEntropyLoss。但测试后发现两个类别的准确率居然都是100%,这显然不太合理,我检查了自己的代码脚本,没发现明显错误,想请大家帮忙分析下可能的原因。


1. 准确率计算函数

我用来计算两个类别准确率的代码如下:

def calculate_metrics(output, target):
    _, predicted_action = output['action_name'].cpu().max(1)
    gt_action = target['action_name'].cpu()

    _, predicted_condition = output['condition'].cpu().max(1)
    gt_condition = target['condition'].cpu()

    with warnings.catch_warnings():  # sklearn may produce a warning when processing zero row in confusion matrix
        warnings.simplefilter("ignore")
        accuracy_action = accuracy_score(y_true=gt_action.numpy(), y_pred=predicted_action.numpy())
        accuracy_condition = accuracy_score(y_true=gt_condition.numpy(), y_pred=predicted_condition.numpy())
   
    return accuracy_action, accuracy_condition

2. 训练与验证循环脚本

这是我执行训练和验证的核心代码:

n_train_samples = len(train_dataloader)
print("Starting training ...")

for epoch in range(start_epoch, N_epochs + 1):
    total_loss = 0
    accuracy_action = 0
    accuracy_condition = 0
  
    for batch in train_dataloader:
        optimizer.zero_grad()

        img = batch['img']
        target_labels = batch['labels']
        target_labels = {t: target_labels[t].to(device) for t in target_labels}
        output = model(img.to(device))

        loss_train, losses_train = model.get_loss(output, target_labels)
        total_loss += loss_train.item()
        batch_accuracy_action, batch_accuracy_condition = \
            calculate_metrics(output, target_labels)

        accuracy_action += batch_accuracy_action
        accuracy_condition += batch_accuracy_condition 

        loss_train.backward()
        optimizer.step()

    print("epoch {:4d}, loss: {:.4f}, action: {:.4f}, condition: {:.4f}".format(
        epoch,
        total_loss / n_train_samples,
        accuracy_action / n_train_samples,
        accuracy_condition / n_train_samples))

    logger.add_scalar('train_loss', total_loss / n_train_samples, epoch)

    if epoch % 5 == 0:
        validate(model, val_dataloader, logger, epoch, device)
        checkpoint_save(model, savedir, epoch)

3. 验证函数

单独的验证流程代码:

def validate(model, dataloader, logger, iteration, device, checkpoint=None):
    if checkpoint is not None:
        checkpoint_load(model, checkpoint)

    model.eval()
    with torch.no_grad():
        avg_loss = 0
        accuracy_action = 0
        accuracy_condition = 0
        
        for batch in dataloader:
            img = batch['img']
            target_labels = batch['labels']
            target_labels = {t: target_labels[t].to(device) for t in target_labels}
            output = model(img.to(device))

            val_train, val_train_losses = model.get_loss(output, target_labels)
            avg_loss += val_train.item()
            batch_accuracy_action, batch_accuracy_condition = \
                calculate_metrics(output, target_labels)

            accuracy_action += batch_accuracy_action
            accuracy_condition += batch_accuracy_condition

    n_samples = len(dataloader)
    avg_loss /= n_samples
    accuracy_action /= n_samples
    accuracy_condition /= n_samples

    print('-' * 72)
    print("Validation  loss: {:.4f}, action: {:.4f}, condition: {:.4f}\n".format(
        avg_loss, accuracy_action, accuracy_condition))

    logger.add_scalar('val_loss', avg_loss, iteration)
    logger.add_scalar('val_accuracy_action', accuracy_action, iteration)
    logger.add_scalar('val_accuracy_condition', accuracy_condition, iteration)

    model.train()

4. 数据集相关

我的数据集CSV结构如下:

image_path,action_name,condition
D:\organized_files\half_data\training\Patient747_image142.jpg,EstablishAccountBalance,Healthy
D:\organized_files\half_data\training\Patient745_image1485.jpg,EstablishAccountBalance,Healthy

Dataset类的__getitem__方法(已修正缩进问题):

def __getitem__(self, idx):
    # take the data sample by its index
    img_path = self.data[idx]

    # read image
    img = Image.open(img_path)

    # apply the image augmentations if needed
    if self.transform:
        img = self.transform(img)

    # return the image and all the associated labels
    dict_data = {
        'img': img,
        'labels': {
            'action_name': self.action_name_labels[idx],
            'condition': self.condition_labels[idx],
        }       
    }
    return dict_data

我实在想不通为什么会出现100%的准确率,总觉得哪里有疏漏但自己没发现,比如是不是数据集划分有问题?或者准确率计算的逻辑有漏洞?还是模型训练过程中出现了什么我没注意到的问题?麻烦各位帮忙看看,谢谢了!

备注:内容来源于stack exchange,提问作者anya

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.14 14:03:09