使用Fast.ai在X光片中寻找肺炎

我在数据学院的公司博客上看到了一篇文章 ,并决定检查Fast.ai库在本文提到的同一数据集上的功能。 在这里,您不会发现关于及时正确地诊断肺炎的重要性,在技术发展的条件下是否需要放射科医生,神经网络的预测是否可以被视为医学诊断等方面的争论。 主要目的是证明现代图书馆中的机器学习可以非常简单(字面上需要几行代码)并能提供出色的结果。 让我们记住这篇文章的结果(精度= 0.84,召回率= 0.96),看看发生了什么。

我们从此处获取数据进行培训。 数据是5856张X射线,分为两个类别-有无肺炎迹象。 神经网络的任务是为我们提供高质量的X射线图像二进制分类器,用于确定肺炎的体征。

我们首先导入库和一些标准设置:

%reload_ext autoreload %autoreload 2 %matplotlib inline from fastai.vision import * from fastai.metrics import error_rate import os 

接下来,确定批次大小。 在GPU上学习时,以内存未满的方式进行选择非常重要。 如有必要,可以将其减半。

 bs = 64 

重要更新:
正如在下面的评论中正确指出的那样,重要的是要清楚地监视将在其上训练模型并在其上测试其有效性的数据。 我们将在train和val文件夹中的图像中训练模型,并在测试文件夹中的图像中进行验证,类似于此处所做的。

我们确定数据的路径

 path = Path('storage/chest_xray') path.ls() 

并检查所有文件夹是否都在适当位置(val文件夹已移至训练中):

 Out: [PosixPath('storage/chest_xray/train'), PosixPath('storage/chest_xray/test')] 

我们正在准备将数据“加载”到神经网络中。 重要的是要注意,在Fast.ai中,有几种匹配图像标签的方法。 from_folder方法告诉我们,标签应从图像所在的文件夹的名称中获取。

size参数意味着我们将所有图像的尺寸调整为299x299(我们的算法适用于正方形图像)。 get_transforms函数为我们提供了图像增强功能,以增加训练数据量(此处保留默认设置)。

 np.random.seed(5) data = ImageDataBunch.from_folder(path, train = 'train', valid = 'test', size=299, bs=bs, ds_tfms=get_transforms()).normalize(imagenet_stats) 

让我们看一下数据:

 data.show_batch(rows=3, figsize=(6,6)) 



为了进行检查,我们看一下我们得到了什么类,以及训练和验证之间图像的定量分布:

 data.classes, data.c, len(data.train_ds), len(data.valid_ds) 

 Out: (['NORMAL', 'PNEUMONIA'], 2, 5232, 624) 

我们基于Resnet50架构定义训练模型:

 learn = cnn_learner(data, models.resnet50, metrics=error_rate) 

并根据“ 单周期政策”在8个时代开始学习:

 learn.fit_one_cycle(8) 



我们看到我们已经在验证样本上获得了89%的准确性。 我们将写下模型的权重并尝试改善结果。

 learn.save('step-1-50') 

“解冻”整个模型,因为 在此之前,我们仅在最后一组图层上训练模型,其余的权重取自在Imagenet和“冻结”上预先训练的模型:

 learn.unfreeze() 

我们正在寻找继续学习的最佳学习率:

 learn.lr_find() learn.recorder.plot() 



我们开始训练10个时代,每个组的学习率都不同。

 learn.fit_one_cycle(10, max_lr=slice(1e-6, 1e-4)) 



我们看到,在验证样本中,我们模型的准确性略微提高到89.4%。

我们写下权重。

 learn.save('step-2-50') 

建立混淆矩阵:
 interp = ClassificationInterpretation.from_learner(learn) interp.plot_confusion_matrix() 


在这一点上,我们记得仅精度参数是不够的,尤其是对于不平衡的类。 例如,如果在现实生活中只有0.1%的X射线检查者发生了肺炎,那么该系统可以简单地在所有情况下排除肺炎的发生,其准确性将达到99.9%的水平,并且绝对零效用。

这是精度和召回率指标发挥作用的地方:

  • TP-真实肯定的预测;
  • TN-真实的负面预测;
  • FP-误报预测;
  • FN-假阴性预测。

=TP/TP+FP=385/446=0.863


=TP/TP+FN=385/390=$0.98



我们看到,我们获得的结果甚至比文章中提到的结果略高。 在进一步执行任务时,值得记住的是,Recall是医疗问题中极为重要的参数,因为 错误从诊断的角度来看,负错误是最危险的(意味着我们可以简单地“忽略”危险的诊断)。

Source: https://habr.com/ru/post/zh-CN471282/


All Articles