深度学习-利用预训练的 ResNet 和 DenseNet 模型进行医学影像诊断

server/2025/2/13 23:38:41/

下面将分别展示基于 PyTorch 框架,利用预训练的 ResNet 和 DenseNet 模型进行医学影像诊断以提高准确率的代码实现。以肺炎 X 光影像诊断为例,假设数据集已经按照训练集和测试集划分好,每个类别存放在不同文件夹中。

1. 安装必要的库

pip install torch torchvision numpy matplotlib pandas

2. 使用 ResNet 实现医学影像诊断

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)# 加载预训练的 ResNet 模型
model = models.resnet18(pretrained=True)
num_ftrs = model.fc.in_features
# 修改最后一层全连接层以适应二分类任务
model.fc = nn.Linear(num_ftrs, 2)# 定义设备
device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
model = model.to(device)# 定义损失函数和优化器
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.0model.train()for i, (images, labels) in enumerate(train_loader):images, labels = images.to(device), labels.to(device)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:images, labels = images.to(device), labels.to(device)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. 使用 DenseNet 实现医学影像诊断

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)# 加载预训练的 DenseNet 模型
model = models.densenet121(pretrained=True)
num_ftrs = model.classifier.in_features
# 修改最后一层全连接层以适应二分类任务
model.classifier = nn.Linear(num_ftrs, 2)# 定义设备
device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
model = model.to(device)# 定义损失函数和优化器
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.0model.train()for i, (images, labels) in enumerate(train_loader):images, labels = images.to(device), labels.to(device)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:images, labels = images.to(device), labels.to(device)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}%')

4. 代码解释

数据预处理

使用 transforms.Compose 定义了数据预处理操作,包括调整图像大小、转换为张量和归一化。

数据集加载

使用 datasets.ImageFolder 加载训练集和测试集,DataLoader 用于批量加载数据。

模型加载与修改
  • ResNet:加载预训练的 resnet18 模型,获取最后一层全连接层的输入特征数,将其替换为适应二分类任务的全连接层。
  • DenseNet:加载预训练的 densenet121 模型,获取分类器层的输入特征数,将其替换为适应二分类任务的全连接层。
训练与评估
  • 将模型移动到 GPU(如果可用)上进行训练和评估。
  • 使用交叉熵损失函数和 Adam 优化器进行训练。
  • 在每个 epoch 中记录训练损失,并绘制训练损失曲线。
  • 在测试集上评估模型的准确率。

5. 注意事项

  • 请将 path/to/train_datapath/to/test_data 替换为实际的数据集路径。
  • 训练过程可能需要较长时间,尤其是在 CPU 上运行时。建议使用 GPU 加速训练。
  • 可以根据实际情况调整超参数,如学习率、训练轮数等,以获得更好的诊断准确率。

http://www.ppmy.cn/server/167459.html

相关文章

Ai无限免费生成高质量ppt教程(deepseek+kimi)

第一步:打开deepseek官网(DeepSeek) 1.如果deepseek官网网络繁忙,解决方案如下: (1)超算互联网:超算互联网 (2)秘塔AI搜索:https://metaso.cn/(开启长思考) (3)纳米ai:https://bot.n.cn/ (4)使用easychat官网&#xff…

蓝桥杯算法日记|贪心、双指针

3412 545 2928 2128 贪心学习总结: 1、一般经常用到sort(a,an);【a[n]】排序,可以给整数排,也可以给字符串按照字典序排序 2、每次选最优 双指针 有序数组、字符串、二分查找、数字之和、反转字…

Docker与容器交互——attach和exec

阅读《Docker 从入门到实践》时,读到“进入容器”这一章节,有两个主要 的命令,分别是: docker attach docker exec 其中提到一句话: 注意: 如果从这个 stdin 中 exit,会导致容器的停止。 …

[MFC] 使用控件

介绍如何使用控件,以及如何获取控件中的数值 check Box 添加点击事件,即选中和取消选中触发的事件 第一种方式是按照如下方式第二种方式是直接双击点击进去 void CMFCApplication1Dlg::OnBnClickedCheckSun() {// TODO: 在此添加控件通知处理程序代…

蓝桥杯备考:贪心算法简介

贪心算法就是企图用局部最优的策略找出全局最优步骤就是1,把解决问题的过程分成若干步。2,每一步都选择当前看起来最优的解法 。 3,希望得到全局最优的结果 比较经典的例题一个就是 找零问题 钞票种类[20,10,5,1]用最小的张数找零46的时候…

Android10 音频参数导出合并

A10 设备录音时底噪过大,让音频同事校准了下,然后把校准好的参数需要导出来,集成到项目中,然后出包,导出方式在此记录 设备安装debug系统版本调试好后, adb root adb remount adb shell 进入设备目录 导…

HTML 链接

HTML 链接 引言 HTML(超文本标记语言)是构建网页的基础,而链接是网页中不可或缺的元素。链接不仅能够连接到其他网页,还能实现网页内部内容的跳转。本文将详细介绍HTML链接的用法、属性以及如何实现链接的优化。 HTML链接的基本…

win11+mac键盘+PowerToys 重映射热键

在win11系统中,使用mac的蓝牙键盘,键盘本身没有PrintScreen键。这时可以借助PowerToys来将其他键映射到系统的PrintScreen. 1.下载安装PowerToys 地址https://learn.microsoft.com/zh-cn/windows/powertoys/ 2.打开PowerToys,选中【键盘管理器…