青岛黄岛区做网站设计的,网站建设企业的市场分析,网站设计建设 公司,设计一个logo大家好#xff0c;我是带我去滑雪#xff01; 肺炎是全球范围内致死率较高的疾病之一#xff0c;尤其是在老年人、免疫系统较弱的患者群体中#xff0c;更容易引发严重并发症。传统上#xff0c;肺炎的诊断依赖于医生的临床经验以及影像学检查#xff0c;尤其是X光片我是带我去滑雪 肺炎是全球范围内致死率较高的疾病之一尤其是在老年人、免疫系统较弱的患者群体中更容易引发严重并发症。传统上肺炎的诊断依赖于医生的临床经验以及影像学检查尤其是X光片它在肺炎的早期筛查和诊断中扮演了至关重要的角色。然而X光片的读取不仅需要专业的放射科医生而且受到经验和疲劳等因素的影响导致诊断结果的准确性存在一定的偏差。近年来人工智能AI技术尤其是深度学习在医学影像领域取得了显著进展。通过深度学习模型计算机能够高效地从大量影像数据中学习到复杂的模式并实现对疾病的自动识别和分类极大地提高了诊断的速度和准确性。迁移学习作为深度学习的一种重要方法能够通过在已有的、大规模的医学图像数据上预训练模型并迁移到肺炎X光片的分类任务上减少对大量标注数据的需求这对资源有限、标注困难的医学领域尤为重要。 基于迁移学习的肺炎X光片诊断分类研究不仅可以缓解医生在实际工作中因繁重工作负担导致的诊断错误问题还能够通过高效、准确的自动化诊断方法在早期筛查中提供帮助尤其是在偏远地区或医疗资源匮乏的环境中为患者提供及时的诊疗建议极大地促进了医疗资源的合理分配。此外该研究的成功实现还可以为其他疾病的X光片图像诊断提供借鉴推动人工智能技术在医学领域的广泛应用。下面开始代码实战。
目录
1导入相关模块
2构建数据集
3加载训练的网络
4调整模型
5设置测试集加载参数 1导入相关模块
import os
from PIL import Image
from glob import globimport torch
import torch.nn as nn
import torch.optim as optim
from torch.utils.data import Dataset, DataLoaderfrom torchvision import transforms
from torchvision.models import resnet50, ResNet50_Weights2构建数据集
class ChestXRayDataset(Dataset):def __init__(self,dataset_dir,transformNone) - None:self.dataset_dir dataset_dirself.transform transform# 获取文件夹下所有图片路径self.dataset_images glob(f{self.dataset_dir}/**/*.jpeg, recursiveTrue)# 获取数据集大小def __len__(self):return len(self.dataset_images)# 读取图像获取类别def __getitem__(self, idx):image_path self.dataset_images[idx]image_name os.path.basename(image_path)image Image.open(image_path)if NORMAL in image_name:category 0else:category 1if self.transform:image self.transform(image)return image, category3加载训练的网络
def prepare_model():# 加载预训练的模型resnet50_weight ResNet50_Weights.DEFAULTresnet50_mdl resnet50(weightsresnet50_weight)# 替换模型最后的全连接层num_ftrs resnet50_mdl.fc.in_featuresresnet50_mdl.fc nn.Linear(num_ftrs, 2)return resnet50_mdldef train_model():# 确定使用CPU还是GPUif torch.cuda.is_available():device cuda:0else:device cpu# 加载模型model prepare_model()model model.to(device)model.train()# 设置loss函数和optimizercriterion nn.CrossEntropyLoss()optimizer optim.SGD(model.parameters(), lr0.001, momentum0.9)# 设置训练集数据加载相关变量batch_size 32chest_xray rE:\工作\硕士\博客\博客99-深度学习医学特征提取\deeplea test\deeplea test\archive\chest_xraytrain_dataset_dir os.path.join(chest_xray, train)train_transforms transforms.Compose([transforms.ToTensor(),transforms.Lambda(lambda x: x.repeat(3, 1, 1) if x.size(0) 1 else x),transforms.Resize((224, 224)),transforms.RandomHorizontalFlip(),transforms.RandomVerticalFlip(),transforms.Normalize([0.485, 0.456, 0.406], [0.229, 0.224, 0.225])])train_dataset ChestXRayDataset(train_dataset_dir, train_transforms)train_dataloader DataLoader(train_dataset,batch_sizebatch_size,shuffleTrue)
4调整模型 for epoch in range(5):print_batch 50running_loss 0running_corrects 0for i, data in enumerate(train_dataloader):inputs, labels datainputs inputs.to(device)labels labels.to(device)optimizer.zero_grad()outputs model(inputs)_, preds torch.max(outputs, 1)loss criterion(outputs, labels)loss.backward()optimizer.step()running_loss (loss.item() * batch_size)running_corrects torch.sum(preds labels.data)if i % print_batch (print_batch - 1): # print every 100 mini-batchesaccuracy running_corrects / (print_batch * batch_size)print(fEpoch: {epoch 1}, Batch: {i 1:5d} Running Loss: {running_loss / 50:.3f} Accuracy: {accuracy:.3f})running_loss 0.0running_corrects 0checkpoint_name fepoch_{epoch}.pthtorch.save(model.state_dict(), checkpoint_name)def test_model():if torch.cuda.is_available():device cuda:0else:device cpu# 加载模型checkpoint_name epoch_4.pthmodel prepare_model()model.load_state_dict(torch.load(checkpoint_name, map_locationdevice))model model.to(device)model.eval()5设置测试集加载参数 batch_size 32chest_xray rE:\工作\硕士\博客\博客99-深度学习医学特征提取\deeplea test\deeplea test\archive\chest_xraytest_dataset_dir os.path.join(chest_xray, test)test_transforms transforms.Compose([transforms.ToTensor(),transforms.Lambda(lambda x: x.repeat(3, 1, 1) if x.size(0) 1 else x),transforms.Resize((224, 224)),transforms.Normalize([0.485, 0.456, 0.406], [0.229, 0.224, 0.225])])test_dataset ChestXRayDataset(test_dataset_dir, test_transforms)test_dataloader DataLoader(test_dataset,batch_sizebatch_size,shuffleFalse)# 在测试集测试模型with torch.no_grad():preds_list []labels_list []for i, data in enumerate(test_dataloader):inputs, labels datainputs inputs.to(device)labels labels.to(device)outputs model(inputs)_, preds torch.max(outputs, 1)preds_list.append(preds)labels_list.append(labels)preds torch.cat(preds_list)labels torch.cat(labels_list)# 计算评价指标corrects_num torch.sum(preds labels.data)accuracy corrects_num / labels.shape[0]# 输出评价指标print(fAccuracy on test dataset: {accuracy:.2%})if __name__ __main__:train_model()test_model()输出结果 更多优质内容持续发布中请移步主页查看。 若有问题可邮箱联系1736732074qq.com
博主的WeChat:TCB1736732074 点赞关注,下次不迷路