基于Pytorch深度学习的脑肿瘤分类识别

简介: 基于Pytorch深度学习的脑肿瘤分类识别

实验背景


       脑肿瘤是一种严重的疾病,对患者的生命和健康造成了威胁。在脑肿瘤的治疗过程中,准确地识别和分类不同类型的脑肿瘤对于制定个性化的治疗方案和预测患者的病情发展非常重要。


       传统的脑肿瘤分类方法通常依赖于医学专家对影像学图像的视觉解读和分析,但这种方法受限于主观性、经验依赖性和人力成本较高等问题。随着深度学习技术的快速发展,特别是在计算机视觉领域的应用,基于深度学习的脑肿瘤图片识别分类成为了一种有潜力的解决方案。深度学习模型,尤其是卷积神经网络(Convolutional Neural Networks,简称CNN),具备从大规模数据中自动学习特征和进行高度抽象的能力。这使得它们在图像分类和分割任务中具有出色的表现。通过使用深度学习方法,可以将医学影像图像作为输入,训练一个分类器来自动识别和分类不同类型的脑肿瘤,从而为医生提供辅助诊断和治疗决策的依据。基于深度学习的脑肿瘤图片识别分类实验具有重要的研究意义和应用前景。通过该实验,可以评估深度学习模型在脑肿瘤分类任务中的准确性、鲁棒性和可解释性。同时,还可以探索不同深度学习架构、数据增强技术和迁移学习方法对脑肿瘤分类性能的影响。这些研究成果有望为脑肿瘤的早期检测、治疗规划和病情预测提供有力的支持,提高医疗诊断的精确性和效率,最终改善患者的治疗结果和生存率。


实验目的


       本实验旨在利用深度学习方法,特别是卷积神经网络(CNN),进行脑肿瘤图片的识别和分类,以实现以下目标:


1.提高脑肿瘤识别的准确性:通过训练深度学习模型,使其能够准确地识别不同类型的脑肿瘤,包括恶性和良性肿瘤。通过提高准确性,可以辅助医生进行更精确的诊断和制定个性化的治疗方案。

2.探索深度学习模型的鲁棒性:在面对不同的脑肿瘤图像数据集时,评估深度学习模型的鲁棒性和泛化能力。通过研究模型的鲁棒性,可以提高在实际应用中的可靠性,并应对不同来源、不同质量和不同噪声水平的脑肿瘤图像数据。

3.比较不同深度学习架构的性能:尝试使用不同的深度学习架构,如常见的卷积神经网络(CNN)模型和一些最新的架构,比较它们在脑肿瘤分类任务上的性能和效果。通过对比不同模型的表现,可以确定最适合该任务的模型架构,为后续的研究和应用提供参考。

4.评估深度学习模型在临床实践中的应用价值:将深度学习模型应用到真实世界的脑肿瘤影像数据中,并与传统的医学影像诊断方法进行对比。通过评估深度学习模型在临床实践中的准确性和效率,可以为医生提供辅助诊断的工具,并改善脑肿瘤患者的治疗结果和预后。


实验环境


Python3.9


Jupyter notebook


实验过程


1.加载数据


首先导入本次实验用到的第三方库


定义数据集的路径


计算该图像数据集的均值和STD


创建数据加载器,为训练和验证数据集组合转换


使用采样器在训练和验证之间分割数据


配置数据集定义加载器


将数据进行展示


2.训练模型


训练模型配置,初始化模型


开始训练模型


3.模型评估


绘制训练和验证损失


绘制验证精度图


源代码


import numpy as np
from pathlib import Path
import random
import torch
import torchvision
from torchvision import transforms
import tqdm
data_dir = Path("./brain_tumor_dataset")
list(data_dir.iterdir())
# 计算该图像数据集的均值和STD
def calculate_dataset_mean(dataloader): 
    images, labels = next(iter(dataloader))
    return images.mean([0,2,3])
def calculate_dataset_std(dataloader):
    images, labels = next(iter(dataloader))
    return images.std([0,2,3])
raw_dataset_transforms = transforms.Compose([
        transforms.Resize(255), 
        transforms.CenterCrop(225), 
        transforms.ToTensor()
    ])
raw_dataset = torchvision.datasets.ImageFolder(root = str(data_dir), transform=raw_dataset_transforms)
raw_dataloader = torch.utils.data.DataLoader(raw_dataset, batch_size=len(raw_dataset))
print(f"mean = {calculate_dataset_mean(raw_dataloader)} and std = {calculate_dataset_std(raw_dataloader)}")
'''
创建数据加载器
为训练和验证数据集组合转换
创建应用了适当转换的数据集
使用数据集创建数据加载程序
'''
# 数据集配置
CLASSES = ["no","yes"]
NUMBER_OF_CLASSES = len(CLASSES)
SHUFFLE = True
VALIDATION_SIZE = 0.2
RESIZE = 64
# 为训练和验证数据集组合图像转换
normalize = transforms.Normalize(
        mean=calculate_dataset_mean(raw_dataloader),
        std=calculate_dataset_std(raw_dataloader),
    )
training_transform = transforms.Compose([
        transforms.RandomRotation(30),
        transforms.Resize(RESIZE),
        transforms.CenterCrop(RESIZE),
        transforms.RandomHorizontalFlip(),
        transforms.ToTensor(),
        normalize,
] )
validation_transform = transforms.Compose(
    [transforms.Resize(RESIZE),
     transforms.CenterCrop(RESIZE),         
     transforms.ToTensor(),
     normalize,
    ])
# 创建数据集并应用相关转换
training_dataset = torchvision.datasets.ImageFolder(
    root = str(data_dir),
    transform = training_transform,
)
validation_dataset = torchvision.datasets.ImageFolder(
    root = str(data_dir),
    transform = validation_transform
)
# 检查数据集规范化
# 归一化后,均值应接近0,std应接近1
normalized_dataloader = torch.utils.data.DataLoader(
    validation_dataset, 
    batch_size=len(validation_dataset),
    )
print(f"mean = {calculate_dataset_mean(normalized_dataloader)}",
      f"std = {calculate_dataset_std(normalized_dataloader)}")
# 使用采样器在训练和验证之间分割数据
split = int(np.floor(len(training_dataset) * VALIDATION_SIZE))
indices = list(range(len(training_dataset)))
if SHUFFLE:
    random.shuffle(indices)
validation_indices, training_indices = indices[: split], indices[split :]
training_sampler = torch.utils.data.sampler.SubsetRandomSampler(training_indices)
validation_sampler = torch.utils.data.sampler.SubsetRandomSampler(validation_indices)
# 数据加载器配置
BATCH_SIZE = 4
NUMBER_OF_WORKERS = 2
PIN_MEMORY = False
# 创建数据加载器
training_dataloader = torch.utils.data.DataLoader(
    training_dataset, 
    batch_size=BATCH_SIZE, 
    sampler=training_sampler,
    num_workers=NUMBER_OF_WORKERS, 
    pin_memory=PIN_MEMORY,
    )
validation_dataloader = torch.utils.data.DataLoader(
    training_dataset, 
    batch_size=BATCH_SIZE, 
    sampler=validation_sampler,
    num_workers=NUMBER_OF_WORKERS, 
    pin_memory=PIN_MEMORY,
    )
import matplotlib.pyplot as plt
%matplotlib inline
# 展示图片
for images, labels in training_dataloader:
    fig = plt.figure(figsize = (14, 7))
    for i in range(BATCH_SIZE):
        ax = fig.add_subplot(2, 4, i + 1, xticks = [], yticks = [])
        ax.set_xlabel(f"cancer = {CLASSES[labels[i]]}")
        image = images[i][0, :, :]
        plt.imshow(image)
    break
# 训练模型配置
MODEL_NAME = "resnet18"
WEIGHTS = "DEFAULT"
LEARNING_RATE = 0.0001
MOMENTUM = 0.9
NUMBER_OF_EPOCHS = 10
MODEL_SAVE_PATH = "model.pt"
# 初始化模型
model = torchvision.models.get_model(MODEL_NAME, weights=WEIGHTS)
model.fc = torch.nn.Linear(512, 2)
# 选择一个损失函数和一个优化函数
criterion = torch.nn.CrossEntropyLoss()
optimizer = torch.optim.SGD(model.parameters(), lr=LEARNING_RATE, momentum=MOMENTUM)
# 开始训练模型
# 存储训练过程状态的地方
training_loss_history = []
validation_loss_history = []
validation_accuracy_history = []
# 训练和验证循环
for epoch in range(NUMBER_OF_EPOCHS):
    model.train()
    training_step_loss = []
    print(f"Epoch {epoch + 1}/{NUMBER_OF_EPOCHS}")
    for data in tqdm.tqdm(training_dataloader, desc="training"):
        features, labels = data
        optimizer.zero_grad()
        outputs = model(features)
        training_loss = criterion(outputs, labels)
        training_loss.backward()
        optimizer.step()
        training_step_loss.append(training_loss.item())
    training_epoch_loss = sum(training_step_loss)/len(training_step_loss)
    training_loss_history.append(training_epoch_loss)
    model.eval()
    validation_step_loss = []
    correct_predictions = 0 
    for data in tqdm.tqdm(validation_dataloader, desc="validating"):
        features, labels = data
        outputs = model(features)
        correct_predictions += torch.sum(torch.argmax(outputs, axis=1)==labels)
        validation_loss = criterion(outputs, labels)
        validation_step_loss.append(validation_loss.item())
    validation_epoch_loss = sum(validation_step_loss)/len(validation_step_loss)
    validation_loss_history.append(validation_epoch_loss)
    validation_epoch_accuracy = correct_predictions / (len(validation_dataloader) * BATCH_SIZE)
    print(f"Training Loss: {training_epoch_loss:.4f},"
          f"Validation Loss: {validation_epoch_loss:.4f}," 
          f"Validation Acc: {validation_epoch_accuracy:.4f}")
    # 保存模型
    if epoch==0 or validation_epoch_accuracy > max(validation_accuracy_history):
        print("Validation loss improved, saving checkpoint.")
        torch.save({
                'epoch': epoch,
                'model_state_dict': model.state_dict(),
                'optimizer_state_dict': optimizer.state_dict(),
                'loss': validation_epoch_loss,
                }, MODEL_SAVE_PATH)
        print("Checkpoint saved")
    validation_accuracy_history.append(validation_epoch_accuracy)
print('Finished Training')
# 绘制训练和验证损失
plt.plot(training_loss_history, label='training_loss')
plt.plot(validation_loss_history,label='validation_loss')
plt.legend()
plt.show
# 绘制验证精度图
plt.plot(validation_accuracy_history, label='validation accuracy')
plt.legend()
plt.show
目录
相关文章
|
2天前
|
机器学习/深度学习 算法 PyTorch
昇腾910-PyTorch 实现 ResNet50图像分类
本实验基于PyTorch,在昇腾平台上使用ResNet50对CIFAR10数据集进行图像分类训练。内容涵盖ResNet50的网络架构、残差模块分析及训练代码详解。通过端到端的实战讲解,帮助读者理解如何在深度学习中应用ResNet50模型,并实现高效的图像分类任务。实验包括数据预处理、模型搭建、训练与测试等环节,旨在提升模型的准确率和训练效率。
90 54
|
2天前
|
机器学习/深度学习 算法 PyTorch
PyTorch 实现MobileNetV1用于图像分类
本实验基于PyTorch和昇腾平台,详细讲解了如何使用MobileNetV1模型对CIFAR10数据集进行图像分类。内容涵盖MobileNetV1的特点、网络架构剖析(尤其是深度可分离卷积)、代码实现及训练过程。通过该实验,读者可以掌握轻量级CNN模型在移动端或嵌入式设备中的应用,并了解其在资源受限环境下的高效表现。实验包括数据预处理、模型训练与测试等环节,帮助用户快速上手并优化模型性能。
80 53
|
7天前
|
机器学习/深度学习 算法 PyTorch
昇腾910-PyTorch 实现 GoogleNet图像分类
本实验基于PyTorch在昇腾平台上实现GoogleNet模型,针对CIFAR-10数据集进行图像分类。内容涵盖GoogleNet的创新点(如Inception模块、1x1卷积、全局平均池化等)、网络架构解析及代码实战分析。通过详细讲解模型搭建、数据预处理、训练与测试过程,帮助读者掌握如何使用经典CNN模型进行高效图像分类。实验中还介绍了辅助分类器、梯度传播优化等技术细节,并提供了完整的训练和测试代码示例。
|
7天前
|
机器学习/深度学习 算法 PyTorch
昇腾910-PyTorch 实现 Alexnet图像分类
本文介绍了在昇腾平台上使用PyTorch实现AlexNet对CIFAR-10数据集进行图像分类的实战。内容涵盖AlexNet的创新点、网络架构解析及代码实现,包括ReLU激活函数、Dropout、重叠最大池化等技术的应用。实验中详细展示了如何构建模型、加载数据集、定义训练和测试模块,并通过60个epoch的训练验证模型性能。
|
2月前
|
机器学习/深度学习 人工智能 算法
基于深度学习的地面垃圾识别分类技术
AI垃圾分类系统结合深度学习和计算机视觉技术,实现高效、精准的垃圾识别与自动分类。系统集成高精度图像识别、多模态数据分析和实时处理技术,适用于市政环卫、垃圾处理厂和智能回收设备,显著提升管理效率,降低人工成本。
基于深度学习的地面垃圾识别分类技术
|
2月前
|
机器学习/深度学习 监控 PyTorch
深度学习工程实践:PyTorch Lightning与Ignite框架的技术特性对比分析
在深度学习框架的选择上,PyTorch Lightning和Ignite代表了两种不同的技术路线。本文将从技术实现的角度,深入分析这两个框架在实际应用中的差异,为开发者提供客观的技术参考。
65 7
|
3月前
|
机器学习/深度学习 数据处理 数据库
基于Django的深度学习视频分类Web系统
基于Django的深度学习视频分类Web系统
79 4
基于Django的深度学习视频分类Web系统
|
3月前
|
机器学习/深度学习 算法 PyTorch
深度学习笔记(十三):IOU、GIOU、DIOU、CIOU、EIOU、Focal EIOU、alpha IOU、SIOU、WIOU损失函数分析及Pytorch实现
这篇文章详细介绍了多种用于目标检测任务中的边界框回归损失函数,包括IOU、GIOU、DIOU、CIOU、EIOU、Focal EIOU、alpha IOU、SIOU和WIOU,并提供了它们的Pytorch实现代码。
558 1
深度学习笔记(十三):IOU、GIOU、DIOU、CIOU、EIOU、Focal EIOU、alpha IOU、SIOU、WIOU损失函数分析及Pytorch实现
|
4月前
|
机器学习/深度学习 PyTorch 调度
在Pytorch中为不同层设置不同学习率来提升性能,优化深度学习模型
在深度学习中,学习率作为关键超参数对模型收敛速度和性能至关重要。传统方法采用统一学习率,但研究表明为不同层设置差异化学习率能显著提升性能。本文探讨了这一策略的理论基础及PyTorch实现方法,包括模型定义、参数分组、优化器配置及训练流程。通过示例展示了如何为ResNet18设置不同层的学习率,并介绍了渐进式解冻和层适应学习率等高级技巧,帮助研究者更好地优化模型训练。
347 4
在Pytorch中为不同层设置不同学习率来提升性能,优化深度学习模型
|
4月前
|
机器学习/深度学习 人工智能 算法
【新闻文本分类识别系统】Python+卷积神经网络算法+人工智能+深度学习+计算机毕设项目+Django网页界面平台
文本分类识别系统。本系统使用Python作为主要开发语言,首先收集了10种中文文本数据集("体育类", "财经类", "房产类", "家居类", "教育类", "科技类", "时尚类", "时政类", "游戏类", "娱乐类"),然后基于TensorFlow搭建CNN卷积神经网络算法模型。通过对数据集进行多轮迭代训练,最后得到一个识别精度较高的模型,并保存为本地的h5格式。然后使用Django开发Web网页端操作界面,实现用户上传一段文本识别其所属的类别。
143 1
【新闻文本分类识别系统】Python+卷积神经网络算法+人工智能+深度学习+计算机毕设项目+Django网页界面平台