ResNet 皮肤癌分类tricks总结

project introduction

project使用的数据为皮肤癌的图片数据,分为了训练和测试集,两个数据集内图片没有重合,均为彩色图像,因为为良恶性皮肤癌的二分类任务,所以相对来讲比较简单。对于网络选择我个人不是很赞成使用算力很大的网络来提升参数指标,毕竟大算力可能会造成落地困难并且较大的算力并不亲民。

Approach

与分割任务不同,分类任务对应的label不会改变所以可以随心的添加许许多多的变换操作。对于皮肤癌的分类数据并没有做过多的预处理操作,仅仅使用的pytorch中自带的一些数据增强操作比如随机上下反转,随机左右翻转,随机旋转,说实话由于皮肤癌的图片大多都是居于中央的所以这些操作对于数据的增强效果并不显著。使用随机擦除以及随机仿射变换的操作就需要相应的提升训练的epoch才会达到较好的收敛效果。

在网络的选择上我选用的是ResNet,具体的搭建步骤参考的是B站一位大佬的视频代码搭建的,更改一下目录就可以用了。探讨了18层,34层,50层的网络的分类效果,因为数据量也没有很大所以50层已经可以做到较全面的提取图像特征。过深的网络反而可能会造成过拟合。

在这里插入图片描述

图1 ResNet的网络架构图

使用一些加速、以及提升算力的技巧来提升网络的性能,从而在有限的算力下获得更好的结果。

Tricks

使用了一系列的训练技巧的来提升网络性能,大部分都可以在pytorch的官网找到相应的调用代码

迁移学习

主要是将预训练好的模型权重加载进来

https://pytorch.org/hub/research-models

# 加载预训练预训练模型
model_weight_path = "./resnet34_pre.pth"
assert os.path.exists(model_weight_path), "file {} does not exist.".format(model_weight_path)
net.load_state_dict(torch.load(model_weight_path, map_location=device))

Auto Mix Precision

使用16位与32位存储混合精度训练,增加计算速度,但不会影响结果的准确度。

https://pytorch.org/docs/stable/amp.html

在这里插入图片描述

图2 在不同的网络中使用相同的训练超参数均没有出现准确率的下降

from torch.cuda.amp import autocast, GradScaler
scaler = GradScaler()                
        for step, data in enumerate(train_bar):
            images, labels = data
            with autocast():
                logits = net(images.to(device))
                loss = loss_function(logits, labels.to(device))/ accumulation_steps            
            scaler.scale(loss).backward()
            if((step+1) % accumulation_steps)==0:
                scaler.step(optimizer)
                scaler.update()
                optimizer.zero_grad()

梯度累计

内存不够,梯度累及来凑,计算多个轮次再更新一次权重。这里的accumulation_step用来决定多少个iteration更新一次权重。

loss = loss_function(logits, labels.to(device))
loss = loss / accumulation_steps
#   梯度累计训练
if((step+1) % accumulation_steps)==0:
	optimizer.step()
	optimizer.zero_grad()

预处理

添加预处理操作做数据增强

https://pytorch.org/vision/stable/transforms.html

from torchvision import transforms
transform = transforms.Compose([transforms.ToTensor(), 
								transforms.Normalize((0.5,), (0.5,))])

网络层数

调用一下18层、34层、还有50层,实在不行自己造一个10层,不过34层和18层我可以训练到0.9的准确率,auc可以达到0.97

动态学习率

https://pytorch.org/docs/stable/optim.html

optimizer = optim.Adam(params, lr=0.0001) #lr =0.0001
scheduler = optim.lr_scheduler.ExponentialLR(optimizer, gamma=0.98)
# 添加在epoch for循环的最后面
	lr_rate.append(optimizer.state_dict()['param_groups'][0]['lr'])
  scheduler.step()

Metrics

准确率(Accuracy): A c c = T P + T N T P + T N + F P + F N Acc = \frac{TP+TN}{TP+TN+FP+FN} Acc=TP+TN+FP+FNTP+TN

AUC_ROC

在这里插入图片描述

confusion matrix

在这里插入图片描述

使用的评价指标包括了准确率,AUC曲线,以及混淆矩阵

result

整体上分类的准确率可以达到0.9左右,使用梯度累计法可以有效的提高计算精度

使用AMP没有导致计算准确率的下降

在这里插入图片描述

Summary

总的来讲实现的过程比较简单,实现的结果也比较初级,感谢大佬提供参考的代码,大佬的B站id是霹雳吧啦Wz

小白上路还有很多不足请大家多多指教!

文中使用的图片来源于ResNet原论文以及NVIDIA官方的文档,侵权即删

  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
【资源介绍】 基于HAM10000数据集实现皮肤癌分类python源码+使用说明.zip 这是一个用于训练图像分类模型的代码。在运行代码之前,用户需要安装以下依赖库:argparse, os, pandas, numpy, PIL, datasets, torchvision, tqdm和transformers。用户还需要从Hugging Face上下载所需的预训练模型。 参数说明 - `--metadata_path`:metadata文件的路径。默认为"./archive/HAM10000_metadata.csv"。 - `--images_dir`:图像文件夹的路径。默认为"./archive/HAM10000_images/"。 - `--model_dir`:预训练模型的路径。默认为"../model/vit-large-patch16-224-in21k"。 - `--checkpoints_dir`:保存检查点文件的文件夹路径。默认为"./checkpoints"。 - `--learning_rate`:学习率。默认为1e-5。 - `--batch_size`:批大小。默认为64。 - `--epochs`:训练轮数。默认为5。 - `--warmup_ratio`:预热步骤的比例。默认为0.1。 - `--split`:训练-验证数据集的分割比例。默认为0.8。 - `--gpu`:指定使用哪张GPU。默认为"0"。 - `--logging_steps`:每隔多少步记录一次训练日志。默认为50。 用户可以在命令行中传递这些参数,例如: ```shell python train-hf.py --metadata_path ./archive/HAM4000_metadata.csv \ --images_dir ./archive/HAM10000_images/ \ --checkpoints_dir ./checkpoints \ --learning_rate 1e-4 \ --batch_size 64 \ --epochs 20 \ --warmup_ratio 0.1 \ --model_dir ../model/vit-large-patch16-224-in21k \ --gpu 5,6,7 \ --logging_steps 1 ``` 在代码运行过程中,会执行以下步骤: 1. 读取metadata文件,获取图像文件名和标签。 2. 将图像读入内存,并随机打乱。 3. 将数据集划分为训练集和验证集。 4. 对图像进行预处理,包括随机裁剪、归一化和转换为tensor。 5. 加载预训练模型,构建分类器。 6. 训练模型,并在验证集上评估模型性能。 7. 在训练过程中,每隔logging_steps步记录一次训练日志,包括损失值、准确率等指标。 8. 在训练结束后,保存模型的权重文件到checkpoints_dir文件夹中。 【备注】 该项目是个人毕设/课设/大作业项目,代码都经过本地调试测试,功能ok才上传,高分作品,可快速上手运行!欢迎下载使用,可用于小白学习、进阶。 该资源主要针对计算机、通信、人工智能、自动化等相关专业的学生、老师或从业者下载使用,亦可作为期末课程设计、课程大作业、毕业设计等。 项目整体具有较高的学习借鉴价值!基础能力强的可以在此基础上修改调整,以实现不同的功能。 欢迎下载使用,也欢迎交流学习!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值