血细胞分类项目

血细胞分类项目

    • 数据集:血细胞分类数据集
    • 数据处理 dataset.py
    • 网络 net.py
    • 训练 train.py
    • 拿训练集的几张图进行预测

数据集:血细胞分类数据集

https://aistudio.baidu.com/datasetdetail/10278
在这里插入图片描述
在这里插入图片描述

数据处理 dataset.py

from torchvision import transforms
import torchvision
import torch
import matplotlib.pyplot as plt
from PIL import Image
#一、数据转换
train_transformer=transforms.Compose(
[transforms.RandomHorizontalFlip(0.2),transforms.RandomRotation(68),transforms.RandomGrayscale(0.2),transforms.Resize((256,256)),transforms.ToTensor(),transforms.Normalize(mean=[0.5,0.5,0.5],std=[0.5,0.5,0.5])
]
)
test_transformer=transforms.Compose(
[transforms.Resize((256,256)),transforms.ToTensor(),transforms.Normalize(mean=[0.5,0.5,0.5],std=[0.5,0.5,0.5])
]
)
#二、读入数据
train_dataset=torchvision.datasets.ImageFolder('E:/Jupytercode/血细胞分类/数据/blood-cells/dataset2-master/dataset2-master/images/TRAIN',transform=train_transformer
)test_dataset=torchvision.datasets.ImageFolder('E:/Jupytercode/血细胞分类/数据/blood-cells/dataset2-master/dataset2-master/images/TEST',transform=test_transformer
)#进行编码
#原      {'EOSINOPHIL': 0, 'LYMPHOCYTE': 1, 'MONOCYTE': 2, 'NEUTROPHIL': 3}
#转换后  {0: 'EOSINOPHIL', 1: 'LYMPHOCYTE', 2: 'MONOCYTE', 3: 'NEUTROPHIL'}
id_to_class={}
for k,v in train_dataset.class_to_idx.items():#print(k,v)id_to_class[v]=k
#id_to_class #查看转换后的格式#三、批次读入数据,可以作为神经网络的输入  一次性拿多少张图片进行训练
Batch_size=64#一次性训练64张
dl_train=torch.utils.data.DataLoader(train_dataset,batch_size=Batch_size,shuffle=True
)
dl_test=torch.utils.data.DataLoader(test_dataset,batch_size=Batch_size,shuffle=True
)
#取一个批次的数据
# img,label=next(iter(dl_train))
# plt.figure(figsize=(12,8))
# for i,(img,label) in enumerate(zip(img[:8],label[:8])):
#     img=(img.permute(1,2,0).numpy()+1)/2
#     plt.subplot(2,4,i+1)
#     plt.title(id_to_class.get(label.item())) #0: 'EOSINOPHIL', 1: 'LYMPHOCYTE', 2: 'MONOCYTE', 3: 'NEUTROPHIL'
#     plt.imshow(img)
# plt.show() #查看图片print("数据处理已完成")

网络 net.py

import torch.nn as nn
import torch
#建立神经网络
class Net(nn.Module):  # 模仿VGGdef __init__(self):super(Net, self).__init__()self.layer1 = nn.Sequential(nn.Conv2d(3, 32, kernel_size=3),nn.ReLU(),nn.MaxPool2d(2, 2))self.layer2 = nn.Sequential(nn.Conv2d(32, 64, kernel_size=3),nn.ReLU(),nn.MaxPool2d(2, 2))self.layer3 = nn.Sequential(nn.Conv2d(64, 128, kernel_size=3),nn.ReLU(),nn.MaxPool2d(2, 2))self.layer4 = nn.Sequential(nn.Conv2d(128, 256, kernel_size=3),nn.ReLU(),nn.MaxPool2d(2, 2))self.fc = nn.Sequential(nn.Linear(256 * 14 * 14, 1024),nn.ReLU(),nn.Linear(1024, 4))def forward(self, x):x = self.layer1(x)x = self.layer2(x)x = self.layer3(x)x = self.layer4(x)#print(x.shape)# 将原来的张量 x (四维)重新塑造为一个二维张量。第一个维度的大小由 PyTorch 自动计算,而第二个维度的大小被设置为 256 * 14 * 14x = x.view(-1, 256 * 14 * 14)x = self.fc(x)return x
if __name__ == '__main__':x = torch.rand([8, 3, 256, 256])model = Net()y = model(x)

在这里插入图片描述

训练 train.py

import torch as t
import torch.nn as nn
from tqdm import tqdm  #进度条
import net
from dataset import *device = t.device("cuda") if t.cuda.is_available() else t.device("cpu")
train_dataset=torchvision.datasets.ImageFolder('E:/Jupytercode/血细胞分类/数据/blood-cells/dataset2-master/dataset2-master/images/TRAIN',transform=train_transformer
)
test_dataset=torchvision.datasets.ImageFolder('E:/Jupytercode/血细胞分类/数据/blood-cells/dataset2-master/dataset2-master/images/TEST',transform=test_transformer
)id_to_class={}
for k,v in train_dataset.class_to_idx.items():#print(k,v)id_to_class[v]=kBatch_size=64#一次性训练64张
dl_train=torch.utils.data.DataLoader(train_dataset,batch_size=Batch_size,shuffle=True
)
dl_test=torch.utils.data.DataLoader(test_dataset,batch_size=Batch_size,shuffle=True
)
model=net.Net()
model = model.to(device)
optim=torch.optim.Adam(model.parameters(),lr=0.001)
loss_fn=nn.CrossEntropyLoss()def fit(epoch, model, trainloader, testloader):correct = 0total = 0running_loss = 0model.train()  # 训练模式下  识别normalize层for x, y in tqdm(trainloader):x, y = x.to('cuda'), y.to('cuda')y_pred = model(x)loss = loss_fn(y_pred, y)optim.zero_grad()loss.backward()optim.step()with torch.no_grad():y_pred = torch.argmax(y_pred, dim=1)correct += (y_pred == y).sum().item()total += y.size(0)running_loss += loss.item()epoch_loss = running_loss / len(trainloader.dataset)epoch_acc = correct / totaltest_correct = 0test_total = 0test_running_loss = 0model.eval()  # 验证模式下   不识别normalize层with torch.no_grad():for x, y in tqdm(testloader):x, y = x.to('cuda'), y.to('cuda')y_pred = model(x)loss = loss_fn(y_pred, y)y_pred = torch.argmax(y_pred, dim=1)test_correct += (y_pred == y).sum().item()test_total += y.size(0)test_running_loss += loss.item()epoch_test_loss = test_running_loss / len(testloader.dataset)epoch_test_acc = test_correct / test_totalif epoch_acc > 0.95:model_state_dict = model.state_dict()torch.save(model_state_dict, './{}{}.pth'.format(epoch_acc, epoch_test_acc))print('epoch: ', epoch,'loss: ', round(epoch_loss, 3),'accuracy:', round(epoch_acc, 3),'test_loss: ', round(epoch_test_loss, 3),'test_accuracy:', round(epoch_test_acc, 3))return epoch_loss, epoch_acc, epoch_test_loss, epoch_test_acc
if __name__ == '__main__':epochs = 20train_loss = []train_acc = []test_loss = []test_acc = []for epoch in range(epochs):epoch_loss, epoch_acc, epoch_test_loss, epoch_test_acc = fit(epoch,model,dl_train,dl_test)train_loss.append(epoch_loss)train_acc.append(epoch_acc)test_loss.append(epoch_test_loss)test_acc.append(epoch_test_acc)plt.plot(range(1, epochs + 1), train_loss, label='train_loss')# 绘制训练损失曲线,使用range(1, epochs+1)生成横坐标轴上的点,train_loss为纵坐标轴上的点plt.plot(range(1, epochs + 1), test_loss, label='test_loss')# 绘制验证损失曲线,使用range(1, epochs+1)生成横坐标轴上的点,val_loss为纵坐标轴上的点plt.legend()# 添加图例,label参数在前面的plot中设置,用于区分不同曲线plt.xlabel('Epochs')  # 设置横坐标轴的标签为'Epochs'plt.ylabel('Loss')  # 设置纵坐标轴的标签为'Loss'plt.savefig('loss.png')plt.show()plt.plot(range(1, epochs + 1), train_acc, label='train_acc')plt.plot(range(1, epochs + 1), test_acc, label='test_acc')plt.title('Training and Validation Accuracy')  # 可以添加标题plt.xlabel('Epochs')  # 为x轴添加标签plt.ylabel('Accuracy')plt.legend()plt.savefig('acc.png')plt.show()torch.save(model,'Bloodcell.pkl') #保存模型训练权重

在这里插入图片描述
在深度学习中,模型通常具有两种运行模式:训练模式和验证/测试模式。这两种模式的主要区别在于模型的行为和参数更新方式。

  1. 训练模式(Training Mode):
    在训练模式下,模型会执行以下操作:
    ①梯度计算: 计算模型参数关于损失函数的梯度,以便进行反向传播。
    ②参数更新: 根据梯度和优化算法,更新模型的参数以最小化损失函数。
    ③Dropout生效: 如果模型中使用了 Dropout 层,那么在训练模式下,Dropout 会生效,即在前向传播过程中会随机舍弃一些神经元,以防止过拟合。
    在 PyTorch 中,通过 model.train() 将模型设置为训练模式:
model.train()
  1. 验证/测试模式(Validation/Testing Mode):
    在验证/测试模式下,模型会执行以下操作:
    ①梯度计算: 不计算梯度,因为在验证/测试过程中不需要更新模型参数。
    ②Dropout不生效: 如果使用了 Dropout 层,那么在验证/测试模式下,Dropout 不生效,所有神经元都参与前向传播。
    ③评估模型性能: 使用模型进行预测,并评估模型在验证集或测试集上的性能。
    在 PyTorch 中,通过 model.eval() 将模型设置为验证/测试模式:
model.eval()

切换模型的运行模式是为了确保在不同阶段使用正确的行为。在训练模式下,模型需要进行梯度计算和参数更新,而在验证/测试模式下,模型不需要进行参数更新,而是专注于性能评估。

拿训练集的几张图进行预测

预测pred.py

from dataset import *model=torch.load('Bloodcell.pkl')
img,label=next(iter(dl_test)) #选取一些图片进行预测
img=img.to('cuda')
model.eval()
pred=model(img)
pred_re=torch.argmax(pred, dim=1)pred_re=pred_re.cpu().numpy()
pred_re=pred_re.tolist()for i in pred_re[0:8]:print(id_to_class[i])
id_to_class[pred_re[0:8][1]]plt.figure(figsize=(16,8))
img=img.cpu()#把图片重新放到CPU上
for i,(img,label) in enumerate(zip(img[:8],label[:8])):img=(img.permute(1,2,0).numpy()+1)/2plt.subplot(2,4,i+1)pred_title=id_to_class[pred_re[0:8][i]]plt.title('R:{},P:{}'.format(id_to_class.get(label.item()),pred_title))plt.imshow(img)
plt.show()

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/655468.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

记mac 不可访问 github 或慢的问题解决 windows也可

1、将这个文件追加github的ip地址/etc/hosts 2、参考修改文章 GitHub520: 让你“爱”上 GitHub,解决访问时图裂、加载慢的问题。(无需安装) github地址:https://github.com/521xueweihan/GitHub520

2024-01-29 ubuntu 用脚本设置安装交叉编译工具链路径方法,设置PATH环境变量

一、设置PATH环境变量的方法,建议用~/.bash_profile的方法,不然在ssh登录的时候可能没有设置PATH. 二、下面的完整的脚本,里面的echo "export PATH$build_toolchain_path:\$PATH" >> $HOME/.bashrc 就是把交叉编译路径写写到.bashrc设置…

Netty源码二:服务端创建NioEventLoopGroup

示例 还是拿之前启动源码的示例,来分析NioEventLoopGroup源码 NioEventLoopGroup构造函数 这里能看到会调到父类的MultiThread EventLoopGroup的构造方法 MultiThreadEventLoopGroup 这里我们能看到,如果传入的线程数目为0,那么就会设置2倍…

/etc/profile错误,命令失效

source /etc/profile后所有命令失效 执行 export PATH/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin 修改后 执行:wq! 执行:w !sudo tee %

TCP_拥塞控制

引言 24年春节马上就要到了,作为开车党,最大的期盼就是顺利回家过年不要堵车。梦想是美好的,但现实是骨感的,拥堵的道路让人苦不堪言。 在网络世界中,类似于堵车的问题也存在,而TCP(Transmissi…

(一)Spring 核心之控制反转(IoC)—— 配置及使用

目录 一. 前言 二. IoC 基础 2.1. IoC 是什么 2.2. IoC 能做什么 2.3. IoC 和 DI 是什么关系 三. IoC 配置的三种方式 3.1. XML 配置 3.2. Java 配置 3.3. 注解配置 四. 依赖注入的三种方式 4.1. 属性注入(setter 注入) 4.2. 构造方法注入&a…

【更新】人工智能-55个工具变量汇总(2024年更新)

一、引言 工具变量是一种在统计学和计量经济学中常用的技术,用于处理因果关系研究中的内生性问题。内生性问题通常是由于遗漏变量、双向因果关系或测量误差等原因造成的,这会导致估计结果出现偏误。工具变量的使用可以帮助解决这一问题 整理收集了CSSC…

Android MediaCodec 简明教程(四):使用 MediaCodec 将视频解码到 Surface,并使用 SurfaceView 播放视频

系列文章目录 Android MediaCodec 简明教程(一):使用 MediaCodecList 查询 Codec 信息,并创建 MediaCodec 编解码器Android MediaCodec 简明教程(二):使用 MediaCodecInfo.CodecCapabilities 查…

【大数据】Flink SQL 语法篇(二):WITH、SELECT WHERE、SELECT DISTINCT

Flink SQL 语法篇(二) 1.WITH 子句2.SELECT & WHERE 子句3.SELECT DISTINCT 子句 1.WITH 子句 应用场景(支持 Batch / Streaming):With 语句和离线 Hive SQL With 语句一样的,语法糖 1,使用…

python运行报错_AttributeError: module ‘tensorflow‘ has no attribute ‘contrib‘

问题描述&#xff1a; File "/data/Code/resnet.py", line 23, in <module> initializertf.contrib.layers.xavier_initializer_conv2d() AttributeError: module tensorflow has no attribute contrib 问题分析&#xff1a; 这个错误是因为代码中使用…

安装Hive

主要使用远程模式部署hive的metastore服务。在node1机器上安装。 注意&#xff1a;以下两件事在启动hive之前必须确保正常完成。 1、提前安装mysql,确保具有远程访问的权限 2、启动hadoop集群,确保集群正常能够访问 1.上传软件 使用CRT等客户端远程上传 apache-hive-3.1.2-bin.…

糊涂工具包使用 记录

hutool 工具包 配置 引入依赖 <dependency><groupId>cn.hutool</groupId><artifactId>hutool-all</artifactId><version>5.8.16</version> </dependency>BeanUtil bean复制 Orders orders BeanUtil.copyProperties(order…

inode生命周期

1.添加inode到inode cache链表 当inode的引用计数器i_count为0后&#xff0c;会调用iput_final去释放 static void iput_final(struct inode *inode) {struct super_block *sb inode->i_sb;const struct super_operations *op inode->i_sb->s_op;unsigned long sta…

PaddleNLP的简单使用

1 介绍 PaddleNLP是一个基于PaddlePaddle深度学习平台的自然语言处理&#xff08;NLP&#xff09;工具库。 它提供了一系列用于文本处理、文本分类、情感分析、文本生成等任务的预训练模型、模型组件和工具函数。 PaddleNLP有统一的应用范式&#xff1a;通过 paddlenlp.Task…

数据结构-数组(详细讲解)

文章目录 数组数组的概述数组的图示一维数组二维数组 数组的定义一维数组的定义二维数组的定义 数组的取值赋值一维数组二维数组 数组的操作一维数组的操作索引实现指针实现 二位数组的操作矩阵转三元组矩阵的乘法 数组 数组的概述 概述&#xff1a;数组是一种线性数据结构&a…

代码随想录算法训练营第三十三天|860. 柠檬水找零

860. 柠檬水找零 public static boolean lemonadeChange(int[] bills) {if (bills.length 0) {return true;}if (bills[0] > 5) {return false;}int fiveNum 0;int tenNum 0;for (int i 0; i < bills.length; i) {if (bills[i] 5) {fiveNum;continue;}if (bills[i]…

导入表注入(iathook)

头文件&#xff08;hookMain.h&#xff09;内容 #pragma once #include<Windows.h>DWORD* g_iatAddr NULL; DWORD* g_unHookAddr NULL;BOOL InstallHook(); //安装钩子 BOOL UninstallHook(); //卸载钩子 DWORD* GetIatAddr(const char* dllName, const char* dllFunc…

【webrtc】m98 : vs2019 直接构建webrtc及unitest工程 1

还是换用了vs2019 构建官方的m98代码打开gn生成的sln 工程 随便点击一个工程turnserver 构建,结果会触发全部构建turnserver构建日志 :构建了整个webrtc ts(1665,8): note: result_of<webrtc::TimeDelta ((lambda at ../../video/adaptation/overuse_frame_detector.cc:55…

C#设置程序开机启动

1&#xff1a;获取当前用户&#xff1a; System.Security.Principal.WindowsIdentity identity System.Security.Principal.WindowsIdentity.GetCurrent();System.Security.Principal.WindowsPrincipal principal new System.Security.Principal.WindowsPrincipal(identity);…

C# 使用WMI监听进程的启动和关闭

写在前面 Windows Management Instrumentation&#xff08;WMI&#xff09;是用于管理基于 Windows 操作系统的数据和操作的基础结构。具体的API可以查看 WMI编程手册。 WMIC 是WMI的命令行管理工具&#xff0c;使用 WMIC&#xff0c;不但可以管理本地计算机&#xff0c;还可…