使用Python 机器学习-5-Python Mini Project–使用深度学习进行乳腺癌分类

一、前言

该文章仅作为个人学习使用

二、正文

项目源代码:Python 项目 - 使用深度学习进行乳腺癌分类 - DataFlair (data-flair.training)

数据集:乳腺组织病理学图像 |卡格尔 (kaggle.com)

Python 中的乳腺癌分类项目

了解 Python 中乳腺癌分类项目中使用的术语

什么是深度学习?

深度学习是一种密集的机器学习方法,其灵感来自人脑及其生物神经网络的工作原理。深度神经网络、递归神经网络、卷积神经网络和深度信念网络等架构由多层组成,供数据在最终生成输出之前通过。深度学习有助于改进人工智能,使其许多应用成为可能;它应用于计算机视觉、语音识别、自然语言处理、音频识别和药物设计等许多此类领域。

什么是Keras?

Keras 是一个用 Python 编写的开源神经网络库。它是一个高级 API,可以在 TensorFlow、CNTK 和 Theano 之上运行。Keras 旨在实现快速实验和原型设计,同时在 CPU 和 GPU 上无缝运行。它是用户友好的、模块化的和可扩展的。

乳腺癌分类 – 目标

在 IDC 数据集上构建乳腺癌分类器,该分类器可以准确地将组织学图像分类为良性或恶性。

乳腺癌分类 – 关于 Python 项目

在这个 python 项目中,我们将构建一个分类器来训练 80% 的乳腺癌组织学图像数据集。其中,我们将保留 10% 的数据进行验证。使用 Keras,我们将定义一个 CNN(卷积神经网络),将其命名为 CancerNet,并在我们的图像上对其进行训练。然后,我们将推导出一个混淆矩阵来分析模型的性能。

IDC 是浸润性导管癌;在乳腺导管中发展并侵入乳腺导管外的纤维或脂肪乳腺组织的癌症;它是最常见的乳腺癌形式,占所有乳腺癌诊断的 80%。组织学是对组织微观结构的研究。

数据集

我们将使用 Kaggle 的 IDC_regular 数据集(乳腺癌组织学图像数据集)。该数据集包含 2,77,524 个大小为 50×50 的斑块,这些斑块是从 162 张以 40 倍扫描的乳腺癌标本的整个载玻片图像中提取的。其中,IDC 检测结果为阴性 1,98,738 人,78,786 人检测呈阳性。该数据集在公共领域可用,您可以在此处下载。为此,您至少需要 3.02GB 的磁盘空间。

此数据集中的文件名如下所示:

8863_idx5_x451_y1451_class0

这里,8863_idx5 是患者 ID,451 和 1451 是作物的 x 和 y 坐标,0 是类标签(0 表示没有 IDC)。

先决条件

您需要安装一些 python 包才能运行此高级 python 项目。你可以用 pip- 来做到这一点

pip install numpy opencv-python pillow tensorflow keras imutils scikit-learn matplotlib

Python 高级项目的步骤 – 乳腺癌分类

1. 下载此 zip。在您喜欢的位置解压缩,到达那里。

截图:

乳腺癌检测蟒蛇项目

2. 现在,在内部乳腺癌分类目录中,创建目录数据集 - 在此目录中,创建原始目录:

mkdir 数据集
mkdir 数据集\原始

3. 下载数据集。

4. 解压原始目录下的数据集。要观察此目录的结构,我们将使用 tree 命令:

cd 乳腺癌分类\乳腺癌分类\数据集\原始

输出截图:

Python 中的原始结构项目

我们为每个患者 ID 提供了一个目录。在每个这样的目录中,我们都有 0 和 1 目录,用于具有良性和恶性内容的图像。

config.py:

这包含了构建数据集和训练模型所需的一些配置。您可以在 cancernet 目录中找到它。

导入操作系统
INPUT_DATASET = “数据集/原始”
BASE_PATH = “数据集/IDC”
TRAIN_PATH = 操作系统。路径9月join([BASE_PATH, “训练”])
VAL_PATH = 操作系统。路径9月join([BASE_PATH, “验证”])
TEST_PATH = 操作系统。路径9月join([BASE_PATH, “测试”])
TRAIN_SPLIT = 0.8
VAL_SPLIT = 0.1

截图:

乳腺癌分类 - Python Project

在这里,我们声明输入数据集的路径 (datasets/original)、新目录的路径 (datasets/idc) 以及使用基本路径的训练、验证和测试目录的路径。我们还声明整个数据集的 80% 将用于训练,其中 10% 将用于验证。

build_dataset.py:

这会将我们的数据集按上述比例分为训练集、验证集和测试集——80% 用于训练(其中 10% 用于验证),20% 用于测试。使用 Keras 的 ImageDataGenerator,我们将提取批量图像,以避免一次在内存中为整个数据集腾出空间。

从 cancernet 导入配置
从 imutils 导入路径
导入随机、shutil、操作系统
originalPaths=listpaths.list_imagesconfig.INPUT_DATASET))
随机。种子7)
随机。shuffle原始路径)
index=intlenoriginalPaths*配置。TRAIN_SPLIT)
trainPaths=originalPaths[:index]
testPaths=originalPaths[索引:]
index=intlentrainPaths*config。VAL_SPLIT)
valPaths=trainPaths[:index]
trainPaths=trainPaths[index:]
datasets=[(“training”, trainPaths, config.TRAIN_PATH
(“validation”, valPaths, config.VAL_PATH
(“testing”、testPaths、配置。TEST_PATH)
]
forsetType, originalPaths, basePath 数据集中:
printf'构建 {setType} set')
如果不是 OS。路径存在basePath):
printf'构建目录 {base_path}')
操作系统。makedirsbasePath))
对于 originalPaths 中的 path
file=路径。splitos.路径9月)[-1]
标签=文件[-5-4]
labelPath=os。路径9月join([basePath,label])
如果不是 OS。路径存在labelPath):
广告

printf'构建目录 {labelPath}')

操作系统。makedirslabelPath)
newPath=os。路径9月join([labelPath, 文件])
舒蒂尔。copy2输入路径, newPath)

截图:

Python 机器学习项目

在这里,我们将从 config、imutils、random、shutil 和 os 导入。我们将构建图像的原始路径列表,然后对列表进行随机排序。然后,我们通过将此列表的长度乘以 0.8 来计算索引,以便我们可以对该列表进行切片以获得训练和测试数据集的子列表。接下来,我们进一步计算一个指数,将 10% 的列表用于训练数据集进行验证,并将其余部分保留用于训练本身。

现在,数据集是一个包含元的列表,用于提供有关训练集、验证集和测试集的信息。它们保存每个路径和基本路径。对于此列表中的每个 setType、路径和基本路径,我们将打印“构建测试集”。如果基本路径不存在,我们将创建目录。对于 originalPaths 中的每个路径,我们将提取文件名和类标签。我们将构建标签目录(0 或 1)的路径 - 如果它还不存在,我们将显式创建此目录。现在,我们将构建生成图像的路径,并将图像复制到它所属的位置。

5. 运行脚本build_dataset.py:

py build_dataset。py

输出截图:

构建数据集

cancernet.py:

我们将构建的网络将是CNN(卷积神经网络),并将其称为CancerNet。该网络执行以下操作:

  • 使用 3×3 个 CONV 滤波器
  • 将这些过滤器堆叠在一起
  • 执行最大池化
  • 使用深度可分离卷积(效率更高,占用内存更少)
来自Keras。模型导入顺序
来自Keras。规范化导入 BatchNormalization
来自Keras。卷积导入 SeparableConv2D
来自Keras。卷积导入 MaxPooling2D
来自Keras。核心导入激活
来自Keras。核心导入 Flatten
来自Keras。核心导入 Dropout
来自Keras。核心导入密集
从 keras 导入后端为 K
CancerNet:
@staticmethod
def buildwidth,height,depth,classes
model=顺序()
shape=高度,宽度,深度)
通道Dim=-1
如果 K。image_data_format()==“channels_first”
shape=深度,高度,宽度)
通道Dim=1
型。addSeparableConv2D323,3, padding=“相同”,input_shape=形状))
型。add激活“relu”))
型。addBatchNormalizationaxis=channelDim))
型。添加MaxPooling2Dpool_size=2,2)))
型。add辍学0.25))
型。添加SeparableConv2D643,3, padding=“相同”))
型。add激活“relu”))
型。addBatchNormalizationaxis=channelDim))
型。添加SeparableConv2D643,3, padding=“相同”))
型。add激活“relu”))
型。addBatchNormalizationaxis=channelDim))
型。添加MaxPooling2Dpool_size=2,2)))
型。add辍学0.25)

型。addSeparableConv2D1283,3, padding=“相同”))

型。add激活“relu”))
型。addBatchNormalizationaxis=channelDim))
型。addSeparableConv2D1283,3, padding=“相同”))
型。add激活“relu”))
型。addBatchNormalizationaxis=channelDim))
型。addSeparableConv2D1283,3, padding=“相同”))
型。add激活“relu”))
型。addBatchNormalizationaxis=channelDim))
型。添加MaxPooling2Dpool_size=2,2)))
型。add辍学0.25))
型。add扁平化())
型。密集256))
型。add激活“relu”))
型。addBatchNormalization())
型。add辍学0.5))
型。addDense))
型。add激活“softmax”))
返回模型

截图:

cancernet CNN python 迷你项目

截图:

cancernet CNN有趣的python项目

我们使用 Sequential API 来构建 CancerNet,并使用 SeparableConv2D 来实现深度卷积。类 CancerNet 有一个静态方法构建,它采用四个参数——图像的宽度和高度、深度(每张图像中的颜色通道数)以及网络将预测的类数,对我们来说,它是 2(0 和 1)。

在这种方法中,我们初始化模型和形状。使用 channels_first 时,我们会更新形状和通道尺寸。

现在,我们将定义三个 DEPTHWISE_CONV => RELU => POOL 层;每个都具有更高的堆叠和更多的过滤器。softmax 分类器输出每个类的预测百分比。最后,我们返回模型。

train_model.py:

这将训练和评估我们的模型。在这里,我们将从 keras、sklearn、cancernet、config、imutils、matplotlib、numpy 和 os 导入。

导入 matplotlib
matplotlib 中。use“Agg”)
来自Keras。预处理图像导入 ImageDataGenerator
来自Keras。回调导入 LearningRateScheduler
来自Keras。optimizers import Adagrad
来自Keras。utils 导入np_utils
来自 Sklearn。指标导入classification_report
来自 Sklearn。指标导入confusion_matrix
来自 cancernet。cancernet 导入 CancerNet
从 cancernet 导入配置
从 imutils 导入路径
导入 matplotlib。pyplot 作为 plt
导入 numpy 作为 np
导入操作系统
NUM_EPOCHS=40;INIT_LR=1e-2;BS=32
trainPaths=listpaths.list_imagesconfig.TRAIN_PATH))
lenTrain=lentrainPaths)
lenVal=lenlistpaths.list_imagesconfig.VAL_PATH)))
lenTest=lenlistpaths.list_imagesconfig.TEST_PATH)))
trainLabels=[intp.splitos.路径sep)[-2]) for p in trainPaths]
trainLabels=np_utils。to_categoricaltrainLabels)
classTotals=trainLabels。轴=0)
classWeight=classTotals。max()/classTotals
trainAug = 图像数据生成器(
重新缩放=1/255.0
rotation_range=20
zoom_range=0.05
width_shift_range=0.1
height_shift_range=0.1
shear_range=0.05
horizontal_flip=
vertical_flip=

fill_mode=“最

valAug=ImageDataGeneratorrescale=1 / 255.0)
trainGen = 火车Aug。flow_from_directory(
配置。TRAIN_PATH
class_mode=“分类”
target_size=48,48
color_mode=“rgb”
shuffle=True
batch_size=BS)
valGen = valAug。flow_from_directory(
配置。VAL_PATH
class_mode=“分类”
target_size=48,48
color_mode=“rgb”
shuffle=False
batch_size=BS)
testGen = valAug。flow_from_directory(
配置。TEST_PATH
class_mode=“分类”
target_size=48,48
color_mode=“rgb”
shuffle=False
batch_size=BS)
model=CancerNet。构建宽度=48,高度=48,深度=3,类=2)
opt=阿达格勒lr=INIT_LR,衰变=INIT_LR/NUM_EPOCHS)
型。compileloss=“binary_crossentropy”,optimizer=opt,metrics=[“accuracy”])
M=模型。fit_generator(
trainGen,
steps_per_epoch=lenTrainBS,
validation_data=valGen,
validation_steps=lenValBS,
class_weight=classWeight,
纪元=NUM_EPOCHS)
print“正在评估模型”)
测试生成。重置()
pred_indices=模型。predict_generatortestGen,steps=lenTestBS)+1)
pred_indices=np。argmaxpred_indices,轴=1)
printclassification_reporttestGen.、pred_indices、target_names=testGen。class_indices钥匙()))
cm=confusion_matrixtestGen.,pred_indices)

总计=sumsumcm))

精度=cm[0,0]+cm[1,1])/总计
特异性=cm[1,1]/cm[1,0]+cm[1,1])
灵敏度=cm[0,0]/cm[0,0]+cm[0,1])
打印cm)
printf'精度: {accuracy}')
printf'特异性: {特异性}')
printf'灵敏度: {sensitivity}')
N = NUM_EPOCHS
PLT。风格use“ggplot”)
PLT。数字()
PLT。plotnp.arange0,N, M.history[“损失”], label=“train_loss”)
PLT。plotnp.arange0,N, M.历史[“val_loss”], label=“val_loss”)
PLT。plotnp.arange0,N, M.history[“acc”], label=“train_acc”)
PLT。plotnp.arange0,N, M.历史[“val_acc”], label=“val_acc”)
PLT。title“IDC 数据集上的训练损失和准确性”)
PLT。xlabel“纪元号”)
PLT。ylabel“损失/精度”)
PLT。legendloc=“左下角”)
PLT。savefig'plot.png')

截图:

Python 开源项目

截图:

中级 Python 项目

截图:

Python 项目示例

在此脚本中,首先,我们设置了 epoch 数、学习率和批处理大小的初始值。我们将获取三个目录中用于训练、验证和测试的路径数。然后,我们将获得训练数据的类权重,以便我们处理不平衡。

现在,我们初始化训练数据增强对象。这是一个有助于泛化模型的正则化过程。在这里,我们稍微修改了训练示例,以避免需要更多的训练数据。我们将初始化验证和测试数据增强对象。

我们将初始化训练、验证和测试生成器,以便它们可以生成大小为 batch_size 的批量图像。然后,我们将使用 Adagrad 优化器初始化模型,并使用 binary_crossentropy 损失函数对其进行编译。现在,为了拟合模型,我们调用 fit_generator()。

我们已经成功地训练了我们的模型。现在,让我们根据测试数据评估模型。我们将重置生成器并对数据进行预测。然后,对于来自测试集的图像,我们得到具有相应最大预测概率的标签的索引。我们将显示分类报告。

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

输出截图:

学习 Python 项目

输出截图:

高级 Python 项目

输出:

带有源代码的 Python 项目

总结

在这个 python 项目中,我们学会了在 IDC 数据集上构建乳腺癌分类器(带有浸润性导管癌的组织学图像),并为其创建了网络 CancerNet。我们使用 Keras 来实现相同的结果。希望你喜欢这个 Python 项目。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/49405.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【数据结构】二叉树——顺序结构——堆及其实现

一、树 1.1、树的概念和结构 树是一种非线性的数据结构,它是由n(n>0)个有限节点组成的一个具有层次关系的集合。 树有一个特殊的节点,称为根节点,根节点没有前驱结点。 除根节点外,其余部分被分为M&…

海康视频WEB插件

引入相关依赖 index.html <script src"/video/web-control_1.2.5.min.js"></script> <script src"/video/jquery-1.12.4.min.js" type"text/javascript"></script> <script src"/video/jsencrypt.min.js" …

[UE 虚幻引擎] DTHmacSha 蓝图HMACSHA加密算法插件说明

本插件可以在虚幻引擎中使用蓝图对字符串和文件进行HMACSHA加密。 1.节点说明 HMACSHA一共有5种加密方式&#xff0c;分辨是 HMAC SHA-1&#xff0c; HMAC SHA-224&#xff0c;HMAC SHA-256&#xff0c;HMAC SHA-384&#xff0c;HMAC SHA-512。 本插件对每种加密方式提供3个节点…

快自查一下,你的手机有没有被乱扣费吧!查询方法都告诉你了!

不知道你有没有这种困扰&#xff0c;明明办的是29元的套餐&#xff0c;但是每月扣费的时候总是莫名其妙的被多收&#xff0c;如果你也有这种情况&#xff0c;那么有可能是被乱扣费了&#xff0c;下面这篇文章教你如何自查是否被乱扣费以及解决方法&#xff0c;大家可以参考。 ​…

webpack配置报错:Invalid options object.

前言&#xff1a; 今天在使用webpack进行项目配置的时候&#xff0c;运行之后终端报错&#xff1a;Invalid options object. Dev Server has been initialized using an options object that does not match the API schema. - options has an unknown property inline. Thes…

vscode插件开发笔记——大模型应用之AI编程助手

系列文章目录 文章目录 系列文章目录前言一、代码补全 前言 最近在开发vscode插件相关的项目&#xff0c;网上很少有关于大模型作为AI 编程助手这方面的教程。因此&#xff0c;借此机会把最近写的几个demo分享记录一下。 一、代码补全 思路&#xff1a; 读取vscode插件上鼠…

npm上传自己的包以及发布过程遇到的问题

大家好&#xff0c;我是前端追寻路上的【酱酱仔】 作为在前端领域不断探索的一员&#xff0c;在此记录开发中遇到的问题&#xff0c;如果你也遇到了相同的问题&#xff0c;希望本文对你有帮助。 前提&#xff1a;本文涉及的命令都是在要发布的包的根目录下执行的&#xff0c;在…

vue 实现对图片的某个区域点选, 并在该区域上方显示该部分内容

目录 1、通义灵码实现&#xff1a; 2、csdn的C知道&#xff1a; 3、百度comate&#xff1a; 1、通义灵码实现&#xff1a; 在 Vue 中实现对图片某个区域的点选并显示该区域属于哪一部分&#xff0c;通常涉及到几个关键步骤&#xff1a; 图片区域划分&#xff1a; 首先&#…

unity文字||图片模糊

一.文字模糊 1、增大字体大小后等比缩放 快捷键R 2、更改字体渲染模式 二.图片模糊 1、更改过滤模式 2、更改格式或者压缩 3、如果只是图片边缘看不清&#xff0c;可以增加canvas/图片的每单位参考像素

Winform上位机TCP客户端/服务端、串口通信

Winform上位机TCP客户端/服务端、串口通信 背景 日常练习&#xff0c;着急换工作&#xff0c;心态都快乱了。 工具 串口调试助手 网络调试助手 代码 客户端 using Microsoft.VisualBasic.Logging; using System.Net.Sockets; using System.Text;namespace TcpClientDem…

nginx漏洞修复 ngx_http_mp4_module漏洞(CVE-2022-41742)【低可信】 nginx版本升级

风险描述&#xff1a; Nginx 是一款轻量级的Web服务器、反向代理服务器。 Nginx 的受影响版本中的ngx _http_mp4_module模块存在内存越界写入漏洞&#xff0c;当在配置中使用 mp4 directive时&#xff0c;攻击者可利用此漏洞使用使用ngx_http_mp4_module模块处理特制的音频或视…

WARNING: The Nouveau kernel driver is currently in use by your system. 处理方法

实践系统&#xff1a; 安装NVIDIA驱动时&#xff0c;提示&#xff1a; WARNING: The Nouveau kernel driver is currently in use by your system. This driver is incompatible with the NVIDIA driver&#xff0c;and must be disabled before proceeding.警告&#xff1…

Meta发布Llama 3.1开源大语言模型;谷歌发布NeuralGCM AI天气预测模型

&#x1f989; AI新闻 &#x1f680; Meta发布Llama 3.1开源大语言模型 摘要&#xff1a;Meta正式发布了开源大语言模型Llama 3.1&#xff0c;包括8B、70B和405B参数版本。Llama 3.1在推理能力和多语言支持方面有所改进&#xff0c;上下文长度提升至128K&#xff0c;405B参数…

node和npm安装;electron、 electron-builder安装

1、node和npm安装 参考&#xff1a; https://blog.csdn.net/sw150811426/article/details/137147783 下载&#xff1a; https://nodejs.org/dist/v20.15.1/ 安装&#xff1a; 点击下载msi直接运行安装 安装完直接cmd打开可以&#xff0c;默认安装就已经添加了环境变量&…

vcpkg或者命令行需要设置代理时如何设置

当使用命令行或者vcpkg时&#xff0c;有时候需要设置代理来下载一些代码&#xff0c;那么可以这样&#xff1a; 本地先起一个http或者socks5的代理服务器。监听127.0.0.1:10808如果本地是http代理服务器&#xff0c;在命令行执行&#xff1a; set http_proxyhttp://127.0.0.1:…

Vue的模板编译:深入理解渲染函数与预编译模板

引言 Vue.js 是一个用于构建用户界面的渐进式框架,它的核心特性之一是其响应式和声明式的模板语法。Vue 的模板不仅仅是简单的字符串插值,它们会被编译成渲染函数,这个过程涉及到将模板字符串转换成 JavaScript 代码。本文将深入探讨 Vue 的模板编译过程,并讨论如何使用预…

初级java每日一道面试题-2024年7月23日-Iterator和ListIterator有什么区别?

面试官: Iterator和ListIterator有什么区别? 我回答: Iterator和ListIterator都是Java集合框架中用于遍历集合元素的接口&#xff0c;但它们之间存在一些关键的区别&#xff0c;主要体现在功能和使用场景上。下面我将详细解释这两种迭代器的不同之处&#xff1a; 1. Iterat…

科技引领水资源管理新篇章:深入剖析智慧水利解决方案,展现其在提升水资源利用效率、优化水环境管理方面的创新实践

本文关键词&#xff1a;智慧水利、智慧水利工程、智慧水利发展前景、智慧水利技术、智慧水利信息化系统、智慧水利解决方案、数字水利和智慧水利、数字水利工程、数字水利建设、数字水利概念、人水和协、智慧水库、智慧水库管理平台、智慧水库建设方案、智慧水库解决方案、智慧…

C++ STL inplace_merge 用法

一&#xff1a;功能 将一个无序序列分成两部分&#xff0c;然后将其合并成有序序列。 二&#xff1a;用法 #include <vector> #include <algorithm> #include <iostream>int main() {std::vector<int> range{1, 3, 5, 2, 4, 6};std::inplace_merge(r…

JavaDS —— 排序

排序的概念 排序&#xff1a;所谓排序&#xff0c;就是使一串记录&#xff0c;按照其中的某个或某些关键字的大小&#xff0c;递增或递减的排列起来的操作。 稳定性&#xff1a;假定在待排序的记录序列中&#xff0c;存在多个具有相同的关键字的记录&#xff0c;若经过排序&a…