Advertisement

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

阅读量:
3f6a7ab0347a4af1a75e6ebadee63fc1.gif

个人简介

个人主页

个人简介


目录

实验背景

实验目的

实验环境

实验过程

1.加载数据

2.训练模型

3.模型评估

源代码

文末福利


实验背景

脑肿瘤是一种致命性疾病,在患者的生命周期中对生命与健康构成严重影响。在手术干预中正确识别并分类不同类型的脑肿瘤对于制定个性化的治疗方案以及预测病情发展具有重要意义。

传统的分类方法往往依赖于医学专家对影像学图像的主观分析。
然而,该方法存在主观性、经验依赖性和人力成本高等局限性。
近年来深度学习技术取得了显著进展。
基于深度学习的方法被认为是解决这一问题的一种创新途径。
卷积神经网络(Convolutional Neural Networks,简称CNN)能够从大量数据中自动生成特征并实现高度抽象的能力。
这些特性使其在图像分类与分割任务中展现出卓越的表现。
通过将医学影像作为输入数据训练模型,
可以实现自动识别与分类不同类型的脑肿瘤,
从而为临床医生提供辅助诊断与治疗决策依据。
本研究探讨基于深度学习的脑肿瘤识别分类方案具有重要的研究价值与应用潜力。
通过实验评估模型在准确率、稳定性以及透明度等方面的性能,
可以深入分析不同架构设计、数据增强策略以及迁移学习技术对模型效果的影响。
这些研究成果有望推动脑肿瘤早期预警系统的建设,
为精准治疗与个性化诊疗提供理论支持,
最终提升医疗服务质量并延长患者生存期。

实验目的

本次研究主要致力于使用深度学习技术,特别是基于卷积神经网络架构的模型,在医学图像分析领域开展脑肿瘤图像的自动识别与分类研究。为了完成这一探索性研究的目的

  1. 提高脑肿瘤识别的精度:采用深度学习技术训练模型, 使其能够精确地识别不同类型脑肿瘤(恶性和良性)。提升该精度后有助于医生更精准地诊断并制定个性化治疗方案

深入探究深度学习模型的抗干扰能力,在面对多种多样化的脑肿瘤图像数据集时,系统性地考察其抗干扰能力和适应多样性。深入研究抗干扰能力的表现后可知,在实际应用中能够提升其稳定性和可靠性,并以应对来自不同来源、质量各异且含有不同噪声水平的数据。

为了全面分析不同深度学习架构的效果,在脑肿瘤分类任务中采用常用的CNN模型以及较新的架构来评估它们在该任务中的表现。

4.深入评估其在临床实践中的应用价值:将其应用于真实医疗环境中广泛使用的脑肿瘤影像数据集,并与传统医学影像诊断手段进行系统比较研究。通过对该方法准确率与效率的深入分析可为其提供科学依据以辅助临床医生完成影像诊断工作并显著提升患者治疗效果及预后结果

实验环境

Python3.9

Jupyter notebook

实验过程

1.加载数据

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

1c94e2dbb05143cd98d0ea18f1d2169b.png

定义数据集的路径

ec0697d4cd484e77b99b301766b3575e.png

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

0d25d10914ce477281b300df3a5940d0.png

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

df5bb015156043f2892a9f127c34af77.png

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

68051678c9b944f083f13127de03a747.png

配置数据集定义加载器

24b52728f52b45988b46578da2f81112.png

将数据进行展示

f4c8c9c72ef24046b9e479a6a65ada67.png

2.训练模型

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

70eb4a4d94c44e4fa72599315354e098.png

开始训练模型

30df6ddd05fc44fbb8c477b6cdbbd556.png
be264e8a6aa14df596fc34e65cc2530f.png

3.模型评估

绘制训练和验证损失

26b76c14c71646478368bf4c9d4ca2d6.png

绘制验证精度图

2c429bf0673644519c678fa62d8c2bec.png

源代码

复制代码
 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

文末福利

《人工智能与ChatGPT****》****免费包邮送出3本!

ff0a9db439cc4522911ef739410b0fc2.jpeg

内容简介:

人们相信人工智能可以为这个时代的技术带来突破,而ChatGPT则使这种希望成为现实。现在,许多人都渴望了解与ChatGPT相关的一切,包括技术的历史和背景,其神奇的功能以及如何使用它。虽然ChatGPT的使用方法很简单,但它具有无限的潜力。如果不去亲身体验,很难体会到它的强大之处。本书尽可能全面地介绍了与ChatGPT相关的内容,特别是许多应用示例,可以给读者带来启发。

希望读者通过这本书了解ChatGPT后,在自己的工作中也能充分利用它。本书适合希望了解和使用ChatGPT的人阅读。

编辑推荐:

ChatGPT的背景:从大语言模型到GPT

ChatGPT的技术:从Transformer模型到RLHF

ChatGPT的使用:从对话到OpanAI API

ChatGPT的应用:从编程到统计分析

ChatGPT的案例:从写专利到出试卷

  • 抽奖方式:在评论区进行随机抽取三位幸运儿赠送礼品!
  • 参与方式:

关注博主并点赞以增强参与度;
同时需在评论区发表三条以上优质内容,并附上对该博主的支持话语;
确保每个参与者每天仅可参与一次活动;
注意:所有参与者需确保完成以上步骤后方可被纳入抽奖池,并且抽中的名额有限。

名单公布时间:2023-07-10 21:00:00

36a8c5d95d0b4fc1aaccff2956271405.png

全部评论 (0)

还没有任何评论哟~