当前位置: 首页 > news >正文

深度学习-医学影像诊断

以下以使用深度学习进行医学影像(如 X 光片)的肺炎诊断为例,为你展示基于 PyTorch 框架的代码实现。我们将构建一个简单的卷积神经网络(CNN)模型,使用公开的肺炎 X 光影像数据集进行训练和评估。

1. 安装必要的库

pip install torch torchvision numpy matplotlib pandas

2. 代码实现

import torch
import torch.nn as nn
import torch.optim as optim
from torchvision import datasets, transforms, models
from torch.utils.data import DataLoader
import matplotlib.pyplot as plt
import numpy as np# 数据预处理
transform = transforms.Compose([transforms.Resize((224, 224)),transforms.ToTensor(),transforms.Normalize(mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225])
])# 加载数据集
train_dataset = datasets.ImageFolder(root='path/to/train_data', transform=transform)
test_dataset = datasets.ImageFolder(root='path/to/test_data', transform=transform)# 创建数据加载器
train_loader = DataLoader(train_dataset, batch_size=32, shuffle=True)
test_loader = DataLoader(test_dataset, batch_size=32, shuffle=False)# 定义简单的 CNN 模型
class SimpleCNN(nn.Module):def __init__(self):super(SimpleCNN, self).__init__()self.conv1 = nn.Conv2d(3, 16, kernel_size=3, padding=1)self.relu1 = nn.ReLU()self.pool1 = nn.MaxPool2d(2)self.conv2 = nn.Conv2d(16, 32, kernel_size=3, padding=1)self.relu2 = nn.ReLU()self.pool2 = nn.MaxPool2d(2)self.fc1 = nn.Linear(32 * 56 * 56, 128)self.relu3 = nn.ReLU()self.fc2 = nn.Linear(128, 2)def forward(self, x):x = self.pool1(self.relu1(self.conv1(x)))x = self.pool2(self.relu2(self.conv2(x)))x = x.view(-1, 32 * 56 * 56)x = self.relu3(self.fc1(x))x = self.fc2(x)return x# 初始化模型、损失函数和优化器
model = SimpleCNN()
criterion = nn.CrossEntropyLoss()
optimizer = optim.Adam(model.parameters(), lr=0.001)# 训练模型
num_epochs = 10
train_losses = []
for epoch in range(num_epochs):running_loss = 0.0for i, (images, labels) in enumerate(train_loader):optimizer.zero_grad()outputs = model(images)loss = criterion(outputs, labels)loss.backward()optimizer.step()running_loss += loss.item()epoch_loss = running_loss / len(train_loader)train_losses.append(epoch_loss)print(f'Epoch {epoch + 1}/{num_epochs}, Loss: {epoch_loss:.4f}')# 绘制训练损失曲线
plt.plot(train_losses)
plt.xlabel('Epoch')
plt.ylabel('Loss')
plt.title('Training Loss')
plt.show()# 评估模型
model.eval()
correct = 0
total = 0
with torch.no_grad():for images, labels in test_loader:outputs = model(images)_, predicted = torch.max(outputs.data, 1)total += labels.size(0)correct += (predicted == labels).sum().item()accuracy = 100 * correct / total
print(f'Test Accuracy: {accuracy:.2f}%')

3. 代码解释

  • 数据预处理

    • 使用 transforms.Compose 定义了一系列的数据预处理操作,包括调整图像大小、转换为张量和归一化。
    • transforms.Resize((224, 224)) 将图像调整为 224x224 大小。
    • transforms.ToTensor() 将图像转换为张量。
    • transforms.Normalize 对图像进行归一化处理。
  • 数据集加载

    • 使用 datasets.ImageFolder 加载训练集和测试集,需要将 path/to/train_datapath/to/test_data 替换为实际的数据集路径。
    • DataLoader 用于创建数据加载器,方便批量加载数据。
  • 模型定义

    • SimpleCNN 类定义了一个简单的卷积神经网络模型,包含两个卷积层、两个池化层和两个全连接层。
  • 训练过程

    • 使用 nn.CrossEntropyLoss 作为损失函数,optim.Adam 作为优化器。
    • 在每个 epoch 中,遍历训练数据,计算损失并进行反向传播和参数更新。
  • 模型评估

    • 将模型设置为评估模式(model.eval()),在测试集上进行预测,并计算准确率。

4. 注意事项

  • 数据集:你需要准备合适的医学影像数据集,并将其按照训练集和测试集进行划分,每个类别放在不同的文件夹中。
  • 模型复杂度:这里的 SimpleCNN 是一个简单的模型,在实际应用中,可能需要使用更复杂的预训练模型(如 ResNet、DenseNet 等)来提高诊断准确率。
  • 计算资源:训练深度学习模型需要一定的计算资源,建议在 GPU 上运行以提高训练速度。可以使用 torch.cuda.is_available() 检查是否有可用的 GPU,并将模型和数据移动到 GPU 上进行训练。例如:
device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
model = model.to(device)
images, labels = images.to(device), labels.to(device)

如果你有其他具体需求,如使用不同的模型架构、处理不同类型的医学影像等,可以进一步调整代码。

http://www.lryc.cn/news/534194.html

相关文章:

  • 备战蓝桥杯:双指针(滑动窗口)算法之逛花展
  • Linux如何设置软件开机启动呢?
  • Vue(3)
  • 11vue3实战-----封装缓存工具
  • 第16章 Single Thread Execution设计模式(Java高并发编程详解:多线程与系统设计)
  • MySQL 8.0.41 终端修改root密码
  • 微信小程序案例2——天气微信小程序(学会绑定数据)
  • android的Compose 简介
  • 缓存实战:Redis 与本地缓存
  • apisix的real-ip插件使用说明
  • 音视频协议
  • 第一财经对话东土科技 | 探索工业科技新边界
  • Maven 与企业项目的集成
  • 激活函数篇 01 —— 激活函数在神经网络的作用
  • 22.2、Apache安全分析与增强
  • Day.23
  • CentOS虚机在线扩容系统盘数据盘
  • 动手写ORM框架 - GeeORM第一天 database/sql 基础
  • 绘制中国平安股价的交互式 K 线图
  • [渗透测试]热门搜索引擎推荐— — shodan篇
  • JavaScript 在 VSCode 中的优势与应用
  • 深度学习之StyleGAN算法解析
  • 数据结构之排序
  • Vue.js 与第三方插件的集成
  • 基于Docker搭建ES集群,并设置冷热数据节点
  • MyBatis常见知识点
  • Redis --- 使用GEO实现经纬度距离计算
  • 【0403】Postgres内核 检查(procArray )给定 db 是否有其他 backend process 正在运行
  • [数据结构] Set的使用与注意事项
  • amis组件crud使用踩坑