Pytorch关于CIFAR-10测试

下载 CIFAR-10数据集:

官网:https://www.cs.toronto.edu/~kriz/cifar.html

  CIFAR-10的网络结构:

import torch
from torch import nn
from torch.nn import Conv2d, MaxPool2d, Flatten, Linear, Sequential#定义网络结构
class Model(nn.Module):def __init__(self):super().__init__()self.model1 = Sequential(Conv2d(3,32,5,stride=1,padding=2),MaxPool2d(2),Conv2d(32,32,5,padding=2),MaxPool2d(2),Conv2d(32,64,5,padding=2),MaxPool2d(2),Flatten(),Linear(64*4*4,64),Linear(64,10))def forward(self,x):x = self.model1(x)return xmodel = Model()
print(model)input = torch.ones((64,3,32,32))
print(input.shape)
output = model(input)
print(output.shape)

早起模型和现在比较:和上面的是等价的

import torch
from torch import nn
from torch.nn import Conv2d, MaxPool2d, Flatten, Linear, Sequential
from torch.utils.tensorboard import SummaryWriter#步长的计算方法:
# 例:一个尺寸 a*a 的特征图,经过 b*b 的卷积层,步幅(stride)=c,填充(padding)=d,请计算出输出的特征图尺寸?
# 特征图的尺寸=(a-b+2d)/c+1
#定义模型结构
class Model(nn.Module):def __init__(self) -> None:super().__init__()  # 初始化父类属性# self.conv1 = Conv2d(in_channels=3, out_channels=32,#                     kernel_size=5, padding=2)# self.maxpool1 = MaxPool2d(kernel_size=2)# self.conv2 = Conv2d(in_channels=32,out_channels=32,#                     kernel_size=5, padding=2)# self.maxpool2 = MaxPool2d(kernel_size=2)# self.conv3 = Conv2d(in_channels=32, out_channels=64,#                     kernel_size=5, padding=2)# self.maxpool3 = MaxPool2d(kernel_size=2)# self.flatten = Flatten()  # 展平为1维向量,torch.reshape()一样效果# # 若是想检验1024是否正确,可以先写前面的层,看样例的输出大小,即可得到1024# self.linear1 = Linear(in_features=1024, out_features=64)# self.linear2 = Linear(in_features=64, out_features=10)# sequential可以替代前面备注掉的代码段self.model1 = Sequential(Conv2d(3, 32, 5, stride=1, padding=2), #输入3张图片,也就是三通道,生成32张,卷积核5*5,不常是1,padding是2MaxPool2d(2), #对输出进行池化2*2Conv2d(32, 32, 5, padding=2), #输入32张,输出32张,卷积核是5*5,padding是2MaxPool2d(2), #池化2*2Conv2d(32, 64, 5, padding=2), #输入是32,输出是64,卷积核是5*5,padding是5*5MaxPool2d(2), #池化2*2Flatten(), #扁平化Linear(1024, 64), #全连接输入1024,输出64Linear(64, 10) #输入64,输出10(表示10个分类))def forward(self, x):# x = self.conv1(x)# x = self.maxpool1(x)# x = self.conv2(x)# x = self.maxpool2(x)# x = self.conv3(x)# x = self.maxpool3(x)# x = self.flatten(x)# x = self.linear1(x)# x = self.linear2(x)#代替以上代码段x = self.model1(x) #将x传入模型,进行前向网络return xmodel = Model()  # 创建一个实例
print(model)  # 打印模型结构# 测试模型样例(也可以测试各层的输出是否正确)
input = torch.ones((64, 3, 32, 32))  #输入64张图片,3通道,32*32
print(input.shape)  # torch.Size([64, 3, 32, 32])
output = model(input) #模型的输出
print(output.shape)  # torch.Size([64, 10]),batch_size=64,10个参数writer = SummaryWriter("./logs_seq")  # 创建一个实例
writer.add_graph(model, input)  # 显示模型结构
writer.close()# tensorboard命令:tensorboard --logdir=logs_seq --port=6007'''
torch.nn.functional.conv2d 和 torch.nn.Conv2d的区别?
nn.Conv2d是一个类,而F.conv2d()是一个函数,而nn.Conv2d的forward()函数实现是用F.conv2d()实现的(在Module类里的__call__实现了forward()函数的调用,所以当实例化nn.Conv2d类时,forward()函数也被执行了,详细可阅读torch源码),所以两者功能并无区别,那么为什么要有这样的两种实现方式同时存在呢?原因其实在于,为了兼顾灵活性和便利性。在建图过程中,往往有两种层,一种如全连接层,卷积层等,当中有Variable,另一种如Pooling层,Relu层等,当中没有Variable。如果所有的层都用nn.functional来定义,那么所有的Variable,如weights,bias等,都需要用户来手动定义,非常不方便。而如果所有的层都换成nn来定义,那么即便是简单的计算都需要建类来做,而这些可以用更为简单的函数来代替的。
所以在定义网络的时候,如果层内有Variable,那么用nn定义,反之,则用nn.functional定义。'''

 

本地加载数据:

 

 

CPU下训练:

import time
import torch.optim.optimizer
import torchvision
from torch import nn, optim
from torch.nn import Conv2d, MaxPool2d, Flatten, Linear
from torch.utils.data import DataLoader
from torch.utils.tensorboard import SummaryWriter
from 练习 import Model  # 导入CIFAR_model.py里的Model类定义# 1.创建 CIFAR10 数据集的训练和测试实例
#实现本地加载
train_data = torchvision.datasets.CIFAR10(root="../data/CIFAR-10/", train=True,transform=torchvision.transforms.ToTensor(),download=False)
test_data = torchvision.datasets.CIFAR10(root="../data/CIFAR-10/", train=False,transform=torchvision.transforms.ToTensor(),download=False)# 2.利用 DataLoader 加载数据集
train_dataloader = DataLoader(train_data, batch_size=64)
test_dataloader = DataLoader(test_data, batch_size=64)# 3.搭建神经网络:CIFAR-10
model = Model()  # 创建实例# 4.损失函数
loss = nn.CrossEntropyLoss()# 5.优化器
learning_rate = 0.01
optimizer = torch.optim.SGD(model.parameters(), learning_rate)# 6.设置训练网络的一些参数
total_train_step = 0  # 记录训练的次数
total_test_step = 0  # 记录测试的次数
epoch = 10  # 训练的轮数for i in range(epoch):print(f"--------第{i}轮训练开始--------")# 训练步骤开始model.train()  # 模型进入训练模式for data in train_dataloader: #获取图片和对应的标签imgs, targets = dataoutputs = model(imgs) #模型输入图片result_loss = loss(outputs, targets)  # 计算每个参数对应的损失# 优化器优化模型optimizer.zero_grad()  # 每个参数对应的梯度清零result_loss.backward()  # 反向传播,计算每个参数对应的梯度optimizer.step()  # 每个参数根据上一步得到的梯度进行优化total_train_step += 1if total_train_step % 100 == 0:end_time = time.time()  # 结束时间print(f"训练次数:{total_train_step},Loss:{result_loss.item()}")# 测试步骤开始(每轮训练好、但不进行优化的模型)model.eval()  # 模型进入测试模式(仅针对有Dropout,BatchNorm层的网络结构)total_test_loss = 0  #计算总的梯度损失total_accuracy = 0   #将准确度加起来,计算平均准确度with torch.no_grad():  # 不需要计算梯度,直接将数据放入网络进行测试for data in test_dataloader:imgs, targets = dataoutputs = model(imgs)result_loss = loss(outputs, targets)total_test_loss += result_loss  # 损失累加# 计算标签正确数(取得在 1 方向,概率最大的索引,即得标签输出值;对比标签输出值与目标值+求和:True=1,False=0)accuracy = (outputs.argmax(1) == targets).sum()total_accuracy += accuracyprint(f"整体测试集上的Loss:{total_test_loss}")print(f"整体测试集上的正确率:{total_accuracy / len(test_data)}")total_test_step += 1torch.save(model, f"CIFAR_model_{i}.pth")print("模型已保存!")

 添加GPU测试:

GPU版本a:网络模型、数据(输入、标签)、损失函数添加 .cuda()。

搭建神经网络:CIFAR-10模型
model = Model()  # 创建实例
if torch.cuda.is_available():  # GPU是否可用print("使用GPU训练")model = model.cuda()  # GPU(非必须重赋值)# model.cuda()  # 与上一句效果一样,不用重赋值损失函数
loss_fn = nn.CrossEntropyLoss()
if torch.cuda.is_available():  # GPU是否可用loss_fn = loss_fn.cuda()  # GPU(非必须重赋值)for data in train_dataloader:imgs, targets = dataif torch.cuda.is_available():  # GPU是否可用imgs = imgs.cuda()  # GPU(必须重赋值)targets = targets.cuda()  # GPU(必须重赋值)outputs = model(imgs)with torch.no_grad():  # 不进行优化的for data in test_dataloader:imgs, targets = dataif torch.cuda.is_available():  # GPU是否可用imgs = imgs.cuda()  # GPU(必须重赋值)targets = targets.cuda()  # GPU(必须重赋值)outputs = model(imgs)

GPU版本b:网络模型、数据(输入、标签)、损失函数添加.to(device)。

device = torch.device("cuda:0" if torch.cuda.is_available() else "cpu")

# 定义训练的设备GPU
device = torch.device("cuda:0" if torch.cuda.is_available() else "cpu")  # ”cuda:0“ 等效 ”cuda“
print(device)搭建神经网络:CIFAR-10模型
model = Model()  # 创建实例
model = model.to(device)  # GPU(非必须重赋值)
# model.to(device)  # 与上一句效果一样,不用重赋值损失函数
loss_fn = nn.CrossEntropyLoss()
loss_fn = loss_fn.to(device)  # GPU(非必须重赋值)for data in train_dataloader:imgs, targets = dataimgs = imgs.to(device)  # GPUtargets = targets.to(device)  # GPUoutputs = model(imgs)with torch.no_grad():  # 不进行优化的for data in test_dataloader:imgs, targets = dataimgs = imgs.to(device)  # GPUtargets = targets.to(device)  # GPUoutputs = model(imgs)

 加载模型进行预测结果:

import torch
import torchvision
from PIL import Image
from CIFAR_model import Model  # 导入CIFAR_model.py里的Model类定义image_path = "./boss.png"
image = Image.open(image_path)  # 加载3通道的图片数据,3阶张量
print(image)  # <PIL.Image.Image image mode=RGB size=352x261 at 0x1E61DE1FE50># 将图片 Resize(缩放) 到32x32尺寸,适合模型输入,最后在转化为Tensor实例
transform = torchvision.transforms.Compose([torchvision.transforms.Resize((32, 32)),torchvision.transforms.ToTensor()])
image = transform(image)
# 转化为4阶张量(模型网络的输入要求张量的阶数为4)
image = torch.reshape(image, (1, 3, 32, 32))
print(image.shape)  # torch.Size([1, 3, 32, 32])# -----------------1.测试方式a(常用,CPU上测试)-----------------
print("\nCPU上测试:")
# 加载训练好的模型
# 采用GPU训练的模型,要想在CPU上测试,必须映射到CPU上(或者模型不用映射到CPU上,而图片映射到GPU上)
model = torch.load("CIFAR_model_9.pth", map_location=torch.device("cpu"))
# print(model)model.eval()   # 模型进入测试模式(仅针对有Dropout,BatchNorm层的网络结构)
with torch.no_grad():  # 有利于节约内存和性能output = model(image)
print(output)
print(output.argmax(1))  # 方向1最大值的索引值# -----------------2.测试方式b(GPU上测试)-----------------
print("\nGPU上测试:")
# 加载训练好的模型
model = torch.load("CIFAR_model_9.pth")
# print(model)model.eval()   # 模型进入测试模式(仅针对有Dropout,BatchNorm层的网络结构)
with torch.no_grad():  # 有利于节约内存和性能# 将图片放到GPU上运行(采用GPU训练的模型,图片应该放到GPU上)output = model(image.cuda())# output = model(image.to("cuda:0"))  # 等效于上一句
print(output)
print(output.argmax(1))  # 方向1最大值的索引值

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

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

相关文章

【社区投稿】Rust登陆华为鸿蒙操作系统之Native模块开发

Rust登陆【华为鸿蒙】操作系统之Native模块开发 名词解释 【鸿蒙操作系统】的英文全名是Open Harmony Operation System。正文将以其首字母缩写词ohos引用该词条。【鸿蒙软件开发工具包】的英文全名是Open Harmony Software Development Kit。正文也将以它的首字母缩写词ohsdk引…

C++-带你初步走进继承(1)

1.继承的概念及定义 1.1继承的概念 继承 (inheritance) 机制是面向对象程序设计 使代码可以复用 的最重要的手段&#xff0c;它允许程序员在 保 持原有类特性的基础上进行扩展 &#xff0c;增加功能&#xff0c;这样产生新的类&#xff0c;称派生类。继承 呈现了面向对象 …

如何在IDEA中使用固定公网地址SSH远程连接服务器开发环境

文章目录 1. 检查Linux SSH服务2. 本地连接测试3. Linux 安装Cpolar4. 创建远程连接公网地址5. 公网远程连接测试6. 固定连接公网地址7. 固定地址连接测试 本文主要介绍如何在IDEA中设置远程连接服务器开发环境&#xff0c;并结合Cpolar内网穿透工具实现无公网远程连接&#xf…

Compose 1.6 发布:性能大升级、拖放新功能、文本新变化...

翻译自&#xff1a; https://android-developers.googleblog.com/2024/01/whats-new-in-jetpack-compose-january-24-release.html 基于 1 月 24 号的 Compose 发行计划&#xff0c;我们正式推出了 Jetpack Compose 1.6 版本。 作为 Android 平台备受推崇的原生 UI 工具包&…

P4447 [AHOI2018初中组] 分组题解

题目 小可可的学校信息组总共有n个队员&#xff0c;每个人都有一个实力值。现在&#xff0c;一年一度的编程大赛就要到了&#xff0c;小可可的学校获得了若干个参赛名额&#xff0c;教练决定把学校信息组的n个队员分成若干个小组去参加这场比赛。 但是每个队员都不会愿意与实…

安全测试工具安装指南:在统信UOS上部署Burp Suite

原文链接&#xff1a;安全测试工具安装指南&#xff1a;在统信UOS上部署Burp Suite 大家好&#xff01;在网络安全领域&#xff0c;Burp Suite是一款不可或缺的工具&#xff0c;它提供了从初级映射和分析应用程序攻击面到查找和利用安全漏洞的一系列功能。今天&#xff0c;我将…

Shiro-05-shiro 基础知识补充密码学+哈希散列

密码学 密码术是隐藏或混淆数据的过程&#xff0c;因此窥探眼睛无法理解它。 Shiro的加密目标是简化JDK的加密支持并使之可用。 需要特别注意的是&#xff0c;密码通常不是特定于主题的&#xff0c;因此Shiro API的其中一个领域不是特定于主题的。 即使未使用“主题”&…

【elk查日志 elastic(kibana)】

文章目录 概要具体的使用方式一&#xff1a;查找接口调用历史二&#xff1a;查找自己的打印日志三&#xff1a;查找错误日志 概要 每次查日志&#xff0c;我都需要别人帮我&#xff0c;时间长了总觉得不好意思&#xff0c;所以这次下定决心好好的梳理一下&#xff0c;怎么查日…

spellman电源维修X3635系列CCM5P4X3635

Spellman高压发生器维修Perkin Elmer分析仪电源维修CCM5P4X3635 Perkin Elmer W102266 X射线高压发生器spellman电源维修X4297系列CT机高压电源维修CT42&#xff1b;CT70系列。SPELLMAN高压发生器应用于东芝CT机XVISION/EX、AUKLET系列、ASTEION系列、以及多排系列&#xff0c…

一文概括|CSC访问学者/博士后/联培申请及派出流程详解

为帮助申请者了解国家留学基金委&#xff08;CSC&#xff09;的政策&#xff0c;以及申报及派出的全过程&#xff0c;知识人网小编利用本文简略介绍并提出规划建议。 公派留学包括国家、地方&#xff08;含省市、行业、学校医院等单位&#xff09;资助派出。而国家公派则由留学…

HarmonyOS开发篇—数据管理(分布式数据服务)

分布式数据服务概述 分布式数据服务&#xff08;Distributed Data Service&#xff0c;DDS&#xff09; 为应用程序提供不同设备间数据库数据分布式的能力。通过调用分布式数据接口&#xff0c;应用程序将数据保存到分布式数据库中。通过结合帐号、应用和数据库三元组&#xf…

软件测试实训系统建设方案2024

软件测试实训室解决方案 一 、方案概述 软件测试实训解决方案是一个复杂且至关重要的过程&#xff0c;它确保了软件在开发过程中的各个模块能够正确地集成和交互。通过这一系列的测试步骤&#xff0c;开发团队能够及时发现并修复潜在的问题&#xff0c;从而提高软件的整体质量…

【漏洞复现-通达OA】通达OA share存在前台SQL注入漏洞

一、漏洞简介 通达OA&#xff08;Office Anywhere网络智能办公系统&#xff09;是由北京通达信科科技有限公司自主研发的协同办公自动化软件&#xff0c;是与中国企业管理实践相结合形成的综合管理办公平台。通达OA为各行业不同规模的众多用户提供信息化管理能力&#xff0c;包…

【Java EE初阶十五】网络编程TCP/IP协议(二)

1. 关于TCP 1.1 TCP 的socket api tcp的socket api和U大片的socket api差异很大&#xff0c;但是和前面所讲的文件操作很密切的联系 下面主要讲解两个关键的类&#xff1a; 1、ServerSocket&#xff1a;给服务器使用的类&#xff0c;使用这个类来绑定端口号 2、Socket&#xf…

全网最容易理解的KMP算法讲解

引言 其实网上有很多讲解KMP算法的文章&#xff0c;详略不一&#xff0c;我认为有两点没有解释清楚&#xff1a; 第一点&#xff1a;匹配失败以后&#xff0c;模式串的位移 第二点&#xff1a;next数组的生成算法 希望本篇文章能将KMP算法清晰易懂的拆解开来。 暴力匹配 …

网络同步—帧同步和状态同步解析

概述 同步就是要多个客户端表现效果是一致的&#xff0c;而且对于大多数的游戏&#xff0c;不仅仅要表现一致&#xff0c;还要客户端和服务器的数据也是一致的。所以同步是个网络游戏概念&#xff0c;只有网络游戏才需要同步&#xff0c;而单机游戏是不需要同步的。 帧同步和…

算法-3-基本的数据结构

单双链表 1.单链表双链表如何反转 import java.util.ArrayList; import java.util.List;public class Code01_ReverseList {public static class Node {public int value;public Node next;public Node(int data) {value data;}}public static class DoubleNode {public int…

掘根宝典之C++深复制与浅复制(复制构造函数,默认复制构造函数)

到目前为止我们已经学了构造函数&#xff0c;默认构造函数&#xff0c;析构函数&#xff1a;http://t.csdnimg.cn/EOQxx 转换函数&#xff0c;转换构造函数&#xff1a;http://t.csdnimg.cn/kiHo6 友元函数&#xff1a;http://t.csdnimg.cn/To8Tj 接下来我们来学习一个新函数…

python毕设选题 - 大数据全国疫情数据分析与3D可视化 - python 大数据

文章目录 0 前言1 课题背景2 实现效果3 设计原理4 部分代码5 最后 0 前言 &#x1f525; 这两年开始毕业设计和毕业答辩的要求和难度不断提升&#xff0c;传统的毕设题目缺少创新和亮点&#xff0c;往往达不到毕业答辩的要求&#xff0c;这两年不断有学弟学妹告诉学长自己做的…

2024阿里云云服务器ECS价格表出炉

2024年最新阿里云服务器租用费用优惠价格表&#xff0c;轻量2核2G3M带宽轻量服务器一年61元&#xff0c;折合5元1个月&#xff0c;新老用户同享99元一年服务器&#xff0c;2核4G5M服务器ECS优惠价199元一年&#xff0c;2核4G4M轻量服务器165元一年&#xff0c;2核4G服务器30元3…