多标签分类模型测试获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
相关产品推荐
相关产品推荐

