1.导入必要的库
本文主要基于torch对肺部感染数据集进行处理,最终测试集的精度能够达到80%以上。首先我们将操作过程中所需要用到的库全部写在了开头,以供后续直接调用。
2. 定义图像变换函数:
我们首先定义了一个transform,主要功能是对我们的图片做一些变换,比如说伸缩、旋转、以及裁剪等等。采用了字典的格式。三个关键词:'train'、'val'和'test'分别是训练、验证和测试。每一个关键词后面的value都是对图片的变换。
对train,test,val依次都进行相似的的转换。封装成图像变换功能的函数。
3.读取数据集
4.数据集展示
读取数据集后,用dataloaders的dataset属性输出了数据集的简介,能够清晰的看到数据集的数量和所做的转换。同时也展示了一些肺部正常和感染的图片,为后续调用做铺垫。
5.图片的展示
因为在训练的过程中,我们需要将很多中间结果值保存起来,所以导入了SummaryWriter,来创建日志。
6.定义模型
troch中有很多预定义或者是预训练的模型。我们方法的实现基于迁移学习,用了Resnet50模型,他的参数是已经在其他数据集上训练好的,所以中间层的参数我们对其冻结,不做任何改变。因为我们训练的数据集发生了变化,所以主要是对模型中最后的池化层和全连接层做了改变。用自定义的层替换掉原来的层,然后进行训练。
7. 定义训练,测试函数
训练和测试函数的定义方式十分相似,通常都是相对固定的一种格式。输入一系列参数,定义了训练损失,验证损失,验证准确率,使用循环来读取训练集。接下来的流程十分固定:梯度置0,前向传播,计算损失,反向传播,更新参数,再计算累计损失和平均损失。只是要注意验证和测试要声明一下并不进行梯度更新。
8. 进行训练和测试
把训练的流程封装成了一个函数,后面直接调用函数就能输出结果。首先输入模型以及其他参数,然后初始化损失定义为正无穷,这样我们最终能够得到一个最小的损失,所对应的模型。即我们需要的模型。接着直接调用之前已经定义好的函数,train_val()和test()。分别返回各自的结果。然后判断test_loss 是否小于best_loss,保存最小损失,保存模型。我们只运行了10轮。最后函数输出每一轮的信息:训练损失,验证损失,验证准确率 ,测试损失和测试准确率。测试集的精度能够达到80%以上。