900字范文,内容丰富有趣,生活中的好帮手!
900字范文 > 深度神经网络在检测病理学组织癌症中的应用

深度神经网络在检测病理学组织癌症中的应用

时间:2020-07-31 22:26:06

相关推荐

深度神经网络在检测病理学组织癌症中的应用

通过机器学习和深度神经网络能够在病理扫描中自动检测转移性癌症是在医学成像和诊断领域非常具有潜力的应用。

在PCam数据集中预测癌症的准确率达到98.6%。

在这里,我们探索为此类分析和诊断准备的特定数据集--PatchCamelyon数据集(PCam)。

PCam是二元分类图像数据集,包含从数字组织病理学扫描中提取的大约300,000个标记的淋巴结切片的低分辨率图像。每个图像都由经过训练的病理学家标记为转移性癌症的。

本文通过准备和训练具有以下特征的神经网络来实现这一目标:

使用预先训练的Resnet50 ImageNet模型作为我们的骨干迁移学习。以下数据扩充:图像大小调整,随机裁剪、水平、垂直图像翻转。用适合的方法来选择我们训练的学习率。判别性学习率微调。此外,我们在训练中应用了以下"开箱即用"的优化和正规化技术:

Dropout权重衰减批量归一化平均和最大池亚当优化者ReLU激活本文使用Fastai + PyTorch进行研究和对该数据集的分析并作为参考,我们在这里使用Camelyon16教育和研究数据集中的原始高分辨率临床扫描的低分辨率版本。这证明了原型和测试各种深度学习算法的有效性是十分有用的。

背景和数据源

PCam实际上是Camelyon16数据集的一个子集:淋巴结切片的一组高分辨率全幻灯片图像(WSI)。

该数据包含来自拉德堡德大学医学中心和乌得勒支大学医学中心的两个独立数据集的前哨淋巴结总共400张全幻灯片图像。

第一个训练数据集包括170个淋巴结WSI(100个正常和70个含有转移瘤)和第二个100个WSI(包括60个正常和40个含有转移)。

测试数据集由从两所大学收集的130个WSI组成。

PatchCam(Kaggle)

PCam由来自荷兰的健康机器学习博士生Bas Veeling准备,专门帮助有兴趣研究这一特定问题的机器学习从业者。它由327,680,96x96彩色图像组成。

此特定数据集通过Kaggle API直接从Kaggle下载,并且是原始PCam(PatchCamelyon)数据集的一个版本,但删除了重复项。

PCam将临床相关的转移检测任务打包成一个直接的二进制图像分类任务,类似于CIFAR-10和MNIST。模型可以在几个小时内在单个GPU上轻松训练,并在Camelyon16肿瘤检测和整个幻灯片图像诊断任务中获得竞争分数。此外,任务难度和易处理性之间的平衡使其成为主动学习模型不确定性和可解释性等主题的基础机器学习研究的主要问题。

有了一些关于数据背景的背景,让我们开始设置我们的项目和工作目录......

获取数据

我们使用的数据存在于Kaggle上。我们使用Kaggle的SDK直接从那里下载数据集。要使用Kaggle SDK和API,需要在Kaggle帐户中创建Kaggle API令牌。

登录Kaggle后,导航到"我的帐户",然后向下滚动到可以看到"创建新API令牌"的位置。这将使用你的用户名和令牌字符串将JSON文件下载到你的计算机。将这些内容复制到/ .kaggle / kaggle.json令牌文件中。

使用ImageDataBunch准备数据

现在我们下载了数据,我们创建了一个ImageDataBunch对象,帮助我们将数据加载到模型中,设置数据扩充,并将数据拆分为训练集和测试集。

ImageDataBunch包含了许多特征,可以帮助我们将数据准备成我们在训练时可以使用的格式。让我们来看看它在下面执行的一些关键特征:

数据扩充

默认情况下,ImageDataBunch会对数据集执行许多修改和扩充:

中心裁剪图像为了数据增加的目的,还有一些关于它在何处以及如何裁剪的随机性重要的是,所有图像都需要具有相同的尺寸才能使模型能够进行训练图像翻转

我们也可以使用各种其他数据扩充。但是我们激活的关键之一是垂直方向上的图像翻转。

对于病理扫描,这是一个合理的数据增强激活,因为扫描是在纵轴还是横轴上都不重要,

默认情况下,fastai将在水平方向上翻转,但我们需要打开垂直方向上的翻转。

批量大小

我们将使用fit_one_cycle来训练我们的网络。这是一个超参数优化,允许我们使用更高的学习率。

较高的学习率是1循环政策中正规化的一种形式。回想一下,小批量添加正规化,因此在1周期学习中使用大批量时,可以使用更大的学习率。

这里的建议是使用批量大小,这是我们的GPU在使用1循环策略进行训练时支持的最大值。

训练,验证和测试集

我们指定数据的文件夹位置(子文件夹训练和测试的位置以及csv数据)引擎盖下的ImageDataBunch将图像分成训练集和验证集(默认为80/20%的分割)。训练集中有176,020个图像,验证集中有大约44,005个图像。我们还指定了包含未标记图像的测试子文件夹的位置。我们的学习模型将测量该数据集的准确性和错误率。还指定了包含数据标签的CSV文件基础架构和目标架构上的映像大小

目标PCam数据集中的图像是方形图像96x96。但是,当将经过预先训练的ImageNet模型引入我们的网络时,我们需要根据较大的图像进行训练,然后相应地设置大小以配合该数据集中的图像大小。

我们选择224作为一个良好的默认值。

规范化图像

一旦我们设置了ImageDataBunch对象,我们也会对图像进行标准化。

归一化图像使用图像的均值和标准偏差将图像值转换为标准化分布,该分布对于神经网络训练更有效。

下面我们来看一些随机的数据样本,这样我们就可以了解我们正在为网络提供什么。这是一个二进制分类问题,因此只有两个类:

阴性(0)/转移(1)

学习器(CNN Resnet50)

一旦我们正确设置了ImageDataBunch对象,我们现在可以将它与预先训练的ImageNet模型一起传递给cnn_learner。我们将使用Resnet50作为我们的骨干。

Fastai在其cnn_learner中包含了许多最先进的计算机视觉学习。它是管理我们的模型训练并集成我们的数据的顶级构造。

迁移学习

从已经在另一个数据集上预先训练的性能良好的模型开始的骨干网络是一种称为迁移学习的方法。

迁移学习的前提是,你可以使用来自其他机器学习模型的学习作为起点,而不是从头开始训练你的数据。

这是一种非常有效的训练方法,并且是训练深度神经网络的当前最先进实践的基础。

当使用预先训练的模型时,我们特别利用与预训练模型和目标数据集(PCam)最常见的学习特征。

因此,例如,对于在ImageNet上预训练的模型,例如Resnet50,训练将利用已经从基础数据集中学习的共同特征来训练目标数据集。

对于我们的模型,我们将使用Resnet50。Resnet50是一个使用50层ImageNet数据训练的残差神经网络,将为我们的网络提供一个良好的起点。

训练并适应一个周期

我们将使用称为fit one cycle的方法来训练我们的网络。此优化是在我们针对特定图层组的训练运行中的整个时期段中应用可变学习率的方式。事实证明,这是调整训练学习率超参数的一种非常有效的方法。

拟合一个周期将学习速率从第一个时期的最小值(默认为lr_max / div_factor)改变到预定的最大值(lr_max),然后在剩余的历元中再次下降到最小值。这种min-max-min学习率方差称为循环。

那么我们如何确定最合适的最大学习率以实现一个周期?我们运行fastai的lr_find方法。

解冻网络之前运行lr_find会产生下图。我们希望在损失开始呈指数增长之前选择学习率。

从对所得学习率图的目视观察,从学习率1e-02开始似乎是初始lr值的合理选择。

冻结

默认情况下,我们从冻结的网络开始。这意味着我们预先训练的Resnet50模型的图层已应用trainable = False,并且仅在目标数据集上开始训练。我们为fit_one_cycle提供的学习率仅适用于此初始训练运行的该层组。

分析第一批结果

分析初始训练运行的图表,我们可以看到训练损失和验证损失在训练过程中稳定地减少并开始收敛。

随着验证损失稳步下降,没有明显过度拟合或过度拟合的明显迹象。

目前的准确率为97.76%。

我们可以通过使用Fastai的混淆矩阵并绘制我们的最高损失来了解有关此训练的更多信息。

混淆矩阵是一个方便的工具,可以帮助我们获得有关训练效果的更多细节。具体来说,我们可以清楚地了解神经网络预测的假阳性和假阴性的数量。

绘制我们的最高损失使我们能够更详细地检查特定图像。Fastai生成我们错误预测的图像热图。热图允许我们检查混淆我们网络的图像区域。这样做很有用,因此我们可以更好地了解我们的模型在每次测试运行中的表现,并指导我们如何改进它。

微调,解冻和判别性学习率

初步结果在第一次训练中已经很好。但是通过一些更微调,我们实际上可以做得更好。

迁移学习+微调=更好的泛化

单独转移学习比从头开始训练我们的网络带来了更多。但是,当连接经过训练的网络时,这种方法易于在脆弱的共同覆盖层之间存在优化困难。我们通过微调我们的模型来解决这个问题:使我们网络的所有层,包括预先训练好的Resnet50层,都可以训练。当我们解冻时,我们会训练所有层。这导致更好的结果和改进的推广到新示例的能力。

判别学习率和1周期

由于我们的网络中的所有层都已解冻并且开放用于训练,我们现在还可以结合fit_one_cycle 利用判别学习率来进一步改进我们的优化。

判别学习率允许我们将特定的学习率应用于我们网络中的图层组,并针对每个组进行优化。安装一个周期然后对这些值进行操作,并根据1周期策略使用它们来改变学习率。

我们如何找到适合1周期的最佳学习率范围?我们可以使用lr_find来帮助我们。

分析上面的lr图,我们在损失开始急剧增加之前选择一系列学习率,并将其作为切片应用于下面的fit_one_cycle方法。

从上面的图中,选择1e-4的上限速率似乎是合理的,并且作为我们的下限速率的推荐规则,我们可以选择比我们的上限小10倍的值,在这种情况下为1e-5。

下限速率将应用于我们预先训练的Resnet50图层组中的图层。这里的权重已经很好地学习,因此我们可以为这组图层继续学习较慢的学习速度。

上限速率将应用于先前在目标数据集上的最后一次训练运行中训练的最后一层图层。该组中的图层将受益于更快的学习速度。

最后的分析

在最后的微调训练中,我们可以看到我们的训练损失和验证损失在训练中期开始相互分离,并且训练损失以比验证损失快得多的速度逐渐改善,稳步下降直至稳定在运行的最后一个时期内到一个稳定的值范围。

在持续减少训练损失的情况下,我们的验证损失进一步增加将导致过度拟合,未能很好地概括为新的例子。

在我们的训练中最终完成训练,在我们的第一阶段训练结果中产生了98.6%的微调精度。

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。