Python 项目 - 使用深度学习进行乳腺癌分类

2025年3月17日 | 阅读 15 分钟

乳腺癌是一种由乳房细胞不受控制地生长引起的恶性疾病。诊断和预防方面的进步使得早期治疗和诊断成为可能。女性和男性都应该注意以下症状和体征:新的肿块或肿物、乳头回缩、乳头或乳房疼痛、发红、乳头增厚、乳房皮肤鳞屑状变化,或乳头溢液(非母乳)。

当医生怀疑乳腺癌时,通常会安排进行活检。在这个检查和操作过程中,会取出一小部分乳房组织在显微镜下进行检查。医生根据疾病类型、分期、分级和基因表达等标准参数对每个乳腺癌病例进行分类,以提供最有效的治疗。在确诊后,癌症护理医疗团队将确定预后和治疗方案。

基于乳腺癌类型的分类

在活检期间检查组织时,可以确定是否存在癌症、腺癌或其他形式,如肉瘤。

癌症类型的分类通常是根据疾病的位置和严重程度来进行的。

导管癌是最常见的类型,意味着疾病最初在将乳汁输送到乳头的导管(管道)内发展。如果癌症没有扩散到导管外,并且被归类为原位癌(DCIS),那么它就是非侵袭性的,因此被包含在导管内;否则,它被描述为转移性乳腺癌。

其他亚型包括三阴性乳腺癌、炎性乳腺癌、晚期乳腺癌以及其他罕见的乳腺癌类型。

基于乳腺癌分级的分类

病理学家也会对疾病进行分级。分级是根据活检组织的外观、其与健康细胞的相似程度以及癌细胞的分裂速度来确定的。较低的级别通常表示生长速度较慢,转移风险较低,而较高的级别则表示生长速度较快,扩散风险较高。

组织学肿瘤分级可以用 Bloom-Richardson 分级、诺丁汉分级、Device can 分级或 Appeals to young 分级来描述。1级表示分化良好(非常接近正常细胞),而2级表示中度分化。分化差的乳腺癌被归为6级(几乎无法辨认且生长迅速)。

基于基因表达的乳腺癌分类

根据美国癌症协会的说法,表观遗传学是另一种相对较新的乳腺癌分类方法。基因表达根据 PAM50 测试确定的分子特征,将乳腺肿瘤分为四组。

具有 Luminal A 和亲水性 B 型基因表达模式的乳腺癌类型与组织相似。Luminal A 恶性肿瘤是生长缓慢的低级别肿瘤。Luminal B 恶性肿瘤更具侵袭性,生长速度更快。当存在 HER2 基因的额外拷贝时,则被诊断为 HER2 型乳腺癌。

当雌激素或孕激素受体检测不到但水平正常时,则被鉴定为基底细胞型,属于三阴性类型。这种类型在携带 BRCA1 突变的女性中患病率更高。由于不明原因,基底细胞型癌症在年轻女性和非裔美国女性中更为普遍。

Breast Cancer News 网站完全专注于提供有关该疾病的新闻和详细信息。它不提供医疗指导、诊断或护理。这些信息不能替代合格的医疗指导、诊断或护理。请务必考虑从您在本网站上找到的内容中获取专业的医疗建议。如果您对某种医疗状况有任何疑虑,请务必咨询您的医生或其他有资质的健康服务提供者。

学习 Python 乳腺癌分类项目中使用的术语。

深度学习:它是什么?

深度学习是一种严谨的机器学习方法,其灵感来源于人脑中的生物神经元网络。卷积神经网络、深度神经网络、感知机和深度信念网络等架构使用多个层来传递数据,然后产生输出。深度学习被用于众多领域,包括计算机视觉、自然语言处理、计算语言学、音频识别和药物开发,以推动人工智能的发展并支持许多应用。

什么是 Keras?

Keras 是一个基于 Python 的免费神经网络库。更高层的 API 可以与 Theano、CNTK 和 Python 一起使用。Keras 的主要目标是提供快速的实验和原型设计,并且能在 CPU 和 GPU 上流畅运行。它具有可扩展性、模块化和用户友好的特点。

乳腺癌分类 - 关于这个 Python 项目

在这个 Python 项目中,我们将创建一个分类器,使用 80% 的乳腺癌组织病理学图像数据集进行训练。我们将保留 10% 的信息用于验证。我们将使用 Keras 创建一个 CNN(卷积神经网络),称为 Cancernets,并使用我们的图像数据对其进行训练。之后,我们将创建一个判别函数来评估模型的有效性。

IDC,即浸润性导管癌,是最常见的乳腺癌类型,占所有诊断的 80%。它始于乳腺导管,并扩散到导管外的纤维或脂肪组织。组织学是研究组织微观结构的学科。

乳腺癌分类的目标

使用 IDC 数据集构建一个乳腺癌分类器,该分类器可以准确识别良性或恶性的组织学图像。

数据集

我们将使用 Kaggle 的 IDC 常规数据集,其中包含乳腺癌组织学图像数据。该数据集包含 2,77,525 张 50x50 的前列腺癌组织贴片图像,这些图像是从 162 张完整载玻片图像在放大下扫描得到的。其中 1,98,768 张为 IDC 阴性,78,786 张为阳性。该数据集可公开获取。至少需要 6.02MB 的磁盘空间。

前提条件

您需要安装一些 Python 包来运行这个高级 Python 项目。可以使用 pip 来完成。

Python 高级项目方法 - 乳腺癌分类

第一步:获取此 zip 文件。请到首选位置解压缩它。

第二步:现在,在乳腺癌分类的目录中创建数据集;在此目录下,创建 original 目录。

第三步:`Original 6 mkdir datasets mkdir datasets` 复制数据集。

第四步:数据集可以在 original 目录中解压缩。我们将使用 tree 命令来检查此目录的结构。

输出

((base) C: \Users\Sumeet Rathore\Desktop\breast-cancer-classification\breast-cancer-classification\datasets\original?tree
Folder PATH listing for volume windows
The volume serial number is 02FE-40C9
-10253
0
-1
-10254
-0
-1
-10255
�
1
-10256
-0
-1
-10257
-0
1
-10258
-0
-1
-10259
-0
1
-10260
-O

对于每个患者 ID,我们都有一个目录。在这些目录中,我们还有 0 和 1 两个子目录,分别用于存放良性和恶性内容的图像。

文件名:config.py

我们需要一些配置来构建数据集和训练模型。这可以在 cancernets 目录中找到。

说明

在这一部分,我们指定了训练、验证和测试目录路径的基础路径,输入数据集的路径(datasets/original)以及新目录(datasets/IDC)的路径。此外,我们声明训练将使用 80% 的数据集,验证将使用 10%。

文件名:build_datasets.py

这将根据上述比例将我们的数据集划分为训练、验证和测试集:20% 用于测试,10% 用于验证(注:原文此处有误,应为 10% 验证,10% 测试)。我们将使用 Keras 的 ImageDataGenerator 以批处理方式提取图像,以避免一次性占用整个数据集的内存空间。

说明

这里将使用来自 shutil、imutils、config、random 和 OS 的导入。在打乱顺序后,我们将编译一个原始图像路径的列表。然后将此列表的长度乘以 0.8 来计算一个索引,这使我们能够将其切片为训练和测试数据集的子列表。列表的其余部分用于训练本身,其中 10% 的列表用于验证的训练数据集。

现在,一个名为 dataset 的元组列表包含了有关训练、验证和测试集的信息。对于每个集合,这些元组都保存了路径和基础路径。例如,对于此列表中的每个 setType、path 和 basePath,我们将打印“正在构建测试集”。如果没有基础路径,我们将创建该目录。此外,我们将为每个 originalPaths 路径提取类别标签和文件名。我们将构建到标签目录(0 或 1)的路径;如果它尚不存在,我们将显式创建它。现在我们将构建最终图像的路径,并将其复制到相应的位置。

第五步:执行 build_datasets.py 脚本

输出截图

C: \Users \ADMIN\Desktop\breast-cancer-classification\breast-cancer-classification>pybuild_dataset.py
Building training set
Building directory datasets/idc\training
Building directory datasets/idcltraining\e
Building directory datasets/ide\training\1
Building validation set
Building directory datasets/idclvalidation
Building directory datasets/idc\validation\1
Building directory datasets/idclvalidationle
Building testing set
Building directory datasets/idcltesting
Building directory datasets/idcltesting\1
Building directory datasets/idcltesting(0)

文件名:cancernets.py

我们将构建的网络命名为 Cancernets:一个 CNN(卷积神经网络)。该网络执行以下操作:

  • 使用三个 (6) CONV 过滤器;
  • 将这些过滤器堆叠在一起;
  • 执行最大池化;
  • 采用深度可分离卷积,它更有效且使用更少的内存。

很快,基线模型就过拟合了。通过两种 dropout 放置设置,模型变得更加一致。

正如我们所看到的,将 dropout 层放在池化层之后,模型无法达到更高的训练准确率。TensorFlow 采用逐元素 dropout,其中一些神经元的激活通过乘以零被随机屏蔽。无论如何,实际存在的神经元数量仍然相同。因此,对此应用池化操作等同于对卷积层的输出应用池化操作。另一方面,当池化之后是 dropout 时,我们从已经减少的神经元中随机移除一些神经元。在这种情况下,我们可用于训练的神经元更少。虽然在这种情况下我们没有充分利用模型的全部潜力,但正则化似乎更强。

将 dropout 层放在池化层之后的模型具有更好的泛化能力。这一点从测试错误率可以明显看出。

在卷积块中使用 dropout 层没有对错之分。另一方面,池化层之后的 dropout 会显著降低模型容量。对于卷积块,强烈推荐使用批量归一化。在代码部分,我们将解决这个问题。

说明

Cancernets 是使用 Sequential API 构建的,而深度可分离卷积是使用 SeparableConv2D 实现的。为 Cancernets 类创建的静态方法有四个输入:图像的宽度和高度,其厚度(每个图像中的颜色信息数量),以及网络将预测的类别数量,对我们来说是 2(0 和 1)。

我们在此过程中初始化模型和形状。当使用“channels first”时,我们修改形状和流维度。

现在将定义三个 DEPTHWISE CONV => RELU => POOL 层,每个层都有更高的层数和更多的过滤器。softmax 分类器为每个类别生成预测百分比。最后,我们返回模型。

如前所述,批量归一化使我们能够以更快的学习率训练模型,使我们的网络收敛更快,同时避免内部协变量偏移。

这个实验证明了这种效果。你不会相信,对隐藏层的输入进行归一化这个简单的概念能有多么有效。

观察结果:在使用批量归一化(BN)层时,学习率为 0.01 且未经 BN 训练的模型表现更好。

非 BN 模型有 37,222 个可训练参数,而基于 BN 的模型有 37,734 个。因此,可训练参数的数量仅增加了 522 个,而这些额外的可训练参数并未对学习过程造成显著变化。关键在于,隐藏表示的归一化是有效的。

使用相同配置的 BN 层,测试错误率降至 29.1%。这表明 BN 是有效的。对于一个 10 类分类模型,非 BN 模型的测试错误率为 90%,这相当于随机猜测。

因此,我们可以使用批量归一化,通过适当的学习率调度来加速训练过程并实现更快的收敛。

如前所述,批量归一化使我们能够以更高的学习率训练模型,从而使网络收敛更快,同时防止内部协变量偏移。

这个实验证明了这一结果。你会惊奇地发现,对卷积神经元的输入进行归一化这个看似简单的概念是多么强大。

观察结果

使用批量归一化(BN)层,在比例增益为 0.01 的情况下,未使用 BN 的深度学习算法表现优于其他模型。

基于 BN 的模型有 37,834 个可训练参数,而非 BN 模型有 37,322 个。因此,增加的 512 个可训练参数并未改变学习过程。需要记住的要点是,对隐藏表示进行归一化是有效的。

文件名:train_models.py

这个文件评估和训练模型。让我们从 numpy、keras、cancernets、sklearn、config、matplotlib、imutils 和 os 导入所需的库。

说明

我们在这个脚本的开始设置批次大小、学习率和 epoch 数的初始值。将获取三个目录中训练、验证和测试路径的数量。然后将获得训练数据的类别权重以纠正不平衡。

现在将初始化训练数据增强对象。正则化是使模型更具泛化性的过程。我们在这里对训练样本进行轻微修改,以避免需要额外的训练数据。将初始化验证和测试数据增强对象。

现在,我们调用 fit.generator() 来拟合模型。项目数据集的训练、验证和测试生成器将被初始化,以产生大小为 batch_size 的图像批次。之后,我们将使用 Adagrad 优化器初始化模型,并使用 binary_crossentropy 损失函数来编译它们。

我们的模型已经成功训练。现在让我们使用测试数据评估模型。我们将重置生成器并使用数据进行预测。然后获取测试集中图像具有最高预测概率的标签索引。此外,将显示一个分类报告。

现在我们有了原始准确率、特异性和灵敏度,我们将计算混淆矩阵并显示所有值。最后,我们将绘制准确率和训练损失图。

输出控制台屏幕

WARNING: tensorflow: From C: \Users \ADMIN\ AppData \Local \Programs \Python \Python37 \lib\site-packages\tensorflow\python \ops \nn
 - - - - - - - - - - - - - - - - loved in a future version. - - - - - - - - - - - - - - - - - -
imp1.py: 180: add_dispatch_support.?locals>.wrapper (from tensorflow.python.ops.array_ops) is deprecated and will be rem
- - - - - - - - - - - - - - - - - Instructions for updating - - - - - - - - - - - - - - - - - -
Use tf. Wherein 2.0, which has the same broadcast rule as p.where
Epoch 1/40 6244/6244 [= 0.8370 = = = = ==] - 25905 415ms/step - loss: 0.3717 - acc: 0.8422 - val loss: 0.4139 - val acc: Epoch 2/40
6244/6244 [= 0.8471 I= = = = ==] - 24985 400ms/step - loss: 0.3464 - acc: 0.8527 - val loss: 0.3955 - val acc
Epoch 3/40 6244/6244 T = = = = ==] - 24805 397ms/step - loss: 0.3416 - acc: 0.8552 - val loss: 0.4203 - val acc:
? 0.8423 Epoch 4/40 6244/6244 [= = = = ==]
- 24985 400ms/step - loss: 0.3396 - aCC: 0.8562 - val loss: 0.4028 - val acc: 0.8414 Epoch 5/40 6244/ 6244 = = = = =] - 24395 391ms/step
- loss: 0.3388 - acc: 0.8573 - val loss: 0.3880 - val acc: 0.8461
- - - - - - - - - - - - - - - - - - Epoch 6/40 6244/6244 [= = = = ==]- - - - - - - - - - - - - - - - - -
- 24205 388ms/step - loss: 0.3366 - acc: 0.8573 - val loss: 0.3868 - val acc:
0.8460 Epoch 7/40 6244/6244===] - 24085 386ms/step - loss: 0.3363 - acc: 0.8578 - val loss: 0.3879 - val acc: 0.8456
Epoch 8/40 6244/6244= = = = =] - 24175 387ms/step - loss: 0.3355 - acc: 0.8580 - val loss: 0.3854 val acc: 565 6244/6244 [== 0.8529
Epoch 38/40 6244/6244 = = = = == 0.8513
Epoch 39/40 6244/ 6244 [ 0.8511 Epoch 40/40 6244/6244 [== 0.8516
- - - - - - - - - - - - - - - - - Now evaluating the model precision. - - - - - - - - - - - - - - - - - - 
OX = = = =] - 2382s 381ms/step - loss: 0.3303 - acc: 0.8605 - val loss: 0.3807 - val acc: ~ = = = =] - 2384s 382ms/step - loss: 0.3308
acc: 0.8599 - val loss: 0.3854 - val acc: = = = =] - 2676s 429ms/step - loss: 0.3317
acc: 0.8594 - val loss: 0.3847 - val acc: = = = =] - 23795 381ms/step loss: 0.3318
acc: 0.8598 - val loss: 0.3848 - val acc: recall
- - - - - - - - - - - - - - - - - - f1-score support- - - - - - - - - -- - - - - - - - - - 
C 30 0.91 0.72 0.87 0.79 0.89 0.75 39736 15769 accuracy macro ave
weighted ave 0.71 0.86 0.83 0.85 0.85 0.82 0.85 55505 557505 55505
?Data [[34757 4979] I 3271 12498]] Accuracy: 0.8513647419151428
Specificity: 0.79256769617579512626 Sensitivity: 0.8746980068451782
C: \Users \ADMIN\Desktop\breast-cancers-classifications\breast-cancer-classification>

预期的输出图表如下所示

Project in Python - Breast Cancer Classification with Deep Learning

总结

在这个 Python 项目中,我们开发了 Cancernets 数据集网络,并学习了如何使用 IDC 数据集(包含晚期导管癌的组织学图像)构建一个乳腺癌分类器。为了实现这一点,我们利用了 Keras 库。我希望你喜欢这个 Python 项目。