应该算是完结啦~再次感谢土堆老师!

模型训练

模型训练基本可以分为以下几个步骤按序执行:
引入数据集-使用dataloader加载数据集-建立模型-设置损失函数-设置优化器-进行训练-训练中计算损失,并使用优化器更新参数-模型测试-模型存储

习惯上会将model和train代码分开写,当然一开始混合写也没啥问题,直接给出一个例程:

# train.py
import torch
from torchvision import transforms, datasets
from torch.utils.data import DataLoader
import torch.nn as nn
from model import *
import timefrom torch.utils.tensorboard import SummaryWriterdata_transforms = transforms.Compose([transforms.ToTensor()
])#引入数据集
train_data = datasets.CIFAR10("./dataset",train=True,transform=data_transforms,download=True)test_data = datasets.CIFAR10("./dataset",train=False,transform=data_transforms,download=True)#加载数据
train_dataloader = DataLoader(train_data,batch_size=64)
test_dataloader = DataLoader(test_data,batch_size=64)start_time = time.time()#建立模型
my_module = MyModule()#设置损失函数
cross_loss = nn.CrossEntropyLoss()#设置优化器
#设置学习率
learning_rate = 1e-2
optimizer = torch.optim.SGD(my_module.parameters(),lr=learning_rate)#进行训练
#设置迭代次数
epoch = 10total_train_steps = 0writer = SummaryWriter("train_logs")for i in range(epoch):print("第{}轮训练".format(i+1))#训练my_module.train() #只对某些层起作用for data in train_dataloader:imgs, targets = dataoutputs = my_module(imgs)#计算损失loss = cross_loss(outputs, targets)#优化模型optimizer.zero_grad()loss.backward()optimizer.step()total_train_steps +=1if total_train_steps % 100 ==0:print("训练次数:{},Loss:{}".format(total_train_steps,loss.item()))writer.add_scalar("train_loss",loss.item(),total_train_steps)#测试,不再梯度下降my_module.eval() #同样只对某些层起作用 total_test_loss = 0# total_test_steps = 0total_accuracy = 0test_data_size = len(test_data)with torch.no_grad():for data in test_dataloader:imgs, targets = dataoutputs = my_module(imgs)loss = cross_loss(outputs,targets)total_test_loss += loss.item()##对于分类任务可以求一下准确的个数,非必须#argmax(1)按行取最大的下标 argmax(0)按列取最大的下标accuracy = (outputs.argmax(1)==targets).sum()total_accuracy += accuracyprint("第{}轮的测试集Loss:{}".format(i+1,total_test_loss))print("测试集准确率:{}".format(total_accuracy/test_data_size))writer.add_scalar("test_loss",total_test_loss,i)end_time = time.time()print("time:{}".format(end_time-start_time))#存储模型if i % 5 == 0:torch.save(my_module,"my_module_{}.pth".format(i))print("模型存储成功")writer.close()

使用GPU加速训练(方式一)

上述写法默认是采用cpu进行训练的,会比较慢,为了加速训练过程,我们需要用GPU进行加速训练。对应有两种方式,推荐方式二(大部分例程也都是采用方式二的)
需要用到GPU加速的主要有如图中的三个部分:
在这里插入图片描述
对应有.cuda()的参数,只要在原始位置后面加上.cuda()就可以,考虑到有些设备没有GPU,建议加上.cuda.is_avaliable的判断。同样给出完整例程:

# train_gpu1.py
import torch
from torchvision import transforms, datasets
from torch.utils.data import DataLoader
import torch.nn as nn
from model import *
import timefrom torch.utils.tensorboard import SummaryWriterdata_transforms = transforms.Compose([transforms.ToTensor()
])#引入数据集
train_data = datasets.CIFAR10("./dataset",train=True,transform=data_transforms,download=True)test_data = datasets.CIFAR10("./dataset",train=False,transform=data_transforms,download=True)#加载数据
train_dataloader = DataLoader(train_data,batch_size=64)
test_dataloader = DataLoader(test_data,batch_size=64)start_time = time.time()#建立模型
my_module = MyModule()
if torch.cuda.is_available():my_module.cuda()#设置损失函数
cross_loss = nn.CrossEntropyLoss()
if torch.cuda.is_available():cross_loss.cuda()#设置优化器
#设置学习率
learning_rate = 1e-2
optimizer = torch.optim.SGD(my_module.parameters(),lr=learning_rate)#进行训练
#设置迭代次数
epoch = 10total_train_steps = 0writer = SummaryWriter("train_logs")for i in range(epoch):print("第{}轮训练".format(i+1))#训练my_module.train() #只对某些层起作用for data in train_dataloader:imgs, targets = dataif torch.cuda.is_available():imgs = imgs.cuda()targets = targets.cuda()outputs = my_module(imgs)#计算损失loss = cross_loss(outputs, targets)#优化模型optimizer.zero_grad()loss.backward()optimizer.step()total_train_steps +=1if total_train_steps % 100 ==0:print("训练次数:{},Loss:{}".format(total_train_steps,loss.item()))writer.add_scalar("train_loss",loss.item(),total_train_steps)#测试,不再梯度下降my_module.eval() #同样只对某些层起作用 total_test_loss = 0# total_test_steps = 0total_accuracy = 0test_data_size = len(test_data)with torch.no_grad():for data in test_dataloader:imgs, targets = dataif torch.cuda.is_available():imgs = imgs.cuda()targets = targets.cuda()outputs = my_module(imgs)loss = cross_loss(outputs,targets)total_test_loss += loss.item()##对于分类任务可以求一下准确的个数,非必须#argmax(1)按行取最大的下标 argmax(0)按列取最大的下标accuracy = (outputs.argmax(1)==targets).sum()total_accuracy += accuracyprint("第{}轮的测试集Loss:{}".format(i+1,total_test_loss))print("测试集准确率:{}".format(total_accuracy/test_data_size))writer.add_scalar("test_loss",total_test_loss,i)end_time = time.time()print("time:{}".format(end_time-start_time))#存储模型if i % 5 == 0:torch.save(my_module.state_dict(),"my_module_{}.pth".format(i))print("模型存储成功")writer.close()

使用GPU加速训练(方式二)

现在更常见的写法是用device+.to(device)的搭配,需要引入的位置和方式一提到的没有任何差异,主要就是使用上的语法会有一点点不一样,所以直接给出一个例程,大家看完就知道怎么用了:

# train_gpu2.py
import torch
from torchvision import transforms, datasets
from torch.utils.data import DataLoader
import torch.nn as nn
from model import *from torch.utils.tensorboard import SummaryWriterdata_transforms = transforms.Compose([transforms.ToTensor()
])#引入数据集
train_data = datasets.CIFAR10("./dataset",train=True,transform=data_transforms,download=True)test_data = datasets.CIFAR10("./dataset",train=False,transform=data_transforms,download=True)#加载数据
train_dataloader = DataLoader(train_data,batch_size=64)
test_dataloader = DataLoader(test_data,batch_size=64)#确定设备
device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
print(device)#建立模型
my_module = MyModule()
my_module.to(device)#设置损失函数
cross_loss = nn.CrossEntropyLoss()
cross_loss.to(device)#设置优化器
#设置学习率
learning_rate = 1e-2
optimizer = torch.optim.SGD(my_module.parameters(),lr=learning_rate)#进行训练
#设置迭代次数
epoch = 10total_train_steps = 0writer = SummaryWriter("train_logs")for i in range(epoch):print("第{}轮训练".format(i+1))#训练my_module.train() #只对某些层起作用for data in train_dataloader:imgs, targets = dataimgs, targets = imgs.to(device), targets.to(device)outputs = my_module(imgs)#计算损失loss = cross_loss(outputs, targets)#优化模型optimizer.zero_grad()loss.backward()optimizer.step()total_train_steps +=1if total_train_steps % 100 ==0:print("训练次数:{},Loss:{}".format(total_train_steps,loss.item()))writer.add_scalar("train_loss",loss.item(),total_train_steps)#测试,不再梯度下降my_module.eval() #同样只对某些层起作用 total_test_loss = 0# total_test_steps = 0total_accuracy = 0test_data_size = len(test_data)with torch.no_grad():for data in test_dataloader:imgs, targets = dataimgs, targets = imgs.to(device), targets.to(device)outputs = my_module(imgs)loss = cross_loss(outputs,targets)total_test_loss += loss.item()##对于分类任务可以求一下准确的个数,非必须#argmax(1)按行取最大的下标 argmax(0)按列取最大的下标accuracy = (outputs.argmax(1)==targets).sum()total_accuracy += accuracyprint("第{}轮的测试集Loss:{}".format(i+1,total_test_loss))print("测试集准确率:{}".format(total_accuracy/test_data_size))writer.add_scalar("test_loss",total_test_loss,i)#存储模型if i % 5 == 0:torch.save(my_module.state_dict(),"my_module_{}.pth".format(i))print("模型存储成功")writer.close()

使用模型完成任务

这个标题我想了很久应该叫什么才能和内容对应上…土堆老师原来名字叫模型验证我没看之前一直以为是evaluate的过程啊啊啊结果是test的过程

实际上我们训练完模型得到一堆准确率啊或者什么的时候并不代表我们完成了整个事情,说人话就是没啥用,所以这部分其实就是教我们怎么用得到的模型在其他数据上使用,这一部分还蛮简单的,和训练中的evaluate部分使用差不多,注意点就是别忘了给图片reshape成含有batch_size的形状(特别是单张的情况下),当然,如果有报错也可以先考虑是不是形状不太对的原因…

# test.py
from PIL import Image
import torchvision
from torchvision import transforms
from model import *image_path = "./test_imgs/cat.jpg"
image = Image.open(image_path)
# image = image.convert('RGB') # 对于png图片要加上这一句data_transforms = torchvision.transforms.Compose([transforms.Resize((32, 32)),transforms.ToTensor()])image = data_transforms(image)
print(image.shape)model = MyModule()
model.load_state_dict(torch.load("my_module_5.pth"))image = torch.reshape(image,(1,3,32,32))
model.eval()
with torch.no_grad():output = model(image)print(output)
print(output.argmax(1))# torch.Size([3, 32, 32])
# tensor([[-1.5852, -1.3985,  1.0891,  2.5762,  0.1534,  2.0844,  0.6164,  1.7049,#  -4.7464, -1.4447]])
# tensor([3])

其实我的模型准确率没有很高,但是对于这张图片竟然惊人的分对了(第3类-cat)

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

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

相关文章

深度卷积神经网络AlexNet

在提出LeNet后卷积神经网络在计算机视觉和机器学习领域中报有名气,但是卷积神经网络并没有主导这些领域,因为LeNet在小数据集上取得了很好的效果,在更大,更真实的数据集上训练卷积神经网络的性能 和可行性有待研究,20世…

数据结构-HashSet

在 Java 编程的世界里,集合框架是极为重要的一部分,而 HashSet 作为 Set 接口的典型实现类,在处理不允许重复元素的场景中频繁亮相。今天,我们就一同深入探究 HashSet,梳理它的特点、常用方法,以及和其他相…

心意行药号 · 慈心方的八种用法

心意行药号 慈心方的八种用法慈心方是心意行药号589个珍贵秘方中的一个养生茶方,配伍比例科学严谨,君臣佐使堪称经典,自古就有“小小慈心方,转动大乾坤”之说。自清代光绪年间传承至今,慈心方受益者逾百万计&#xff…

Spring面试宝典:Spring IOC的执行流程解析

在准备Spring框架的面试时,“Spring IOC的工作流程是什么?” 是一个非常经典的问题。虽然网上有很多详细的教程,但它们往往过于复杂,对于没有深入研究过源码的人来说理解起来确实有些困难。今天我们就来简化这个概念,从…

学习日志39 python

1 fromkeys()函数是什么在 Python 中,fromkeys() 是字典(dict)的一个类方法,用于创建一个新字典。它的作用是:根据指定的可迭代对象(如列表、元组等)中的元素作为键(key)…

SpringBoot + MyBatis-Plus 使用 listObjs 报 ClassCastException 的原因与解决办法

在项目中我们经常会遇到这种需求: 根据一组 ID 查询数据库,并返回指定字段列表。 我在写代码的时候,遇到了一个典型的坑,分享出来给大家。一、问题背景我的代码是这样写的(查询项目表的负责人信息)&#xf…

WT2606B 驱屏语音芯片新增蓝牙功能:功能集成一体化,产品升级自动化,语音交互无线化,场景应用普适化!

小伙伴们,欢迎来到我们的 #唯创芯片小讲堂!今天我们要为大家介绍一位多才多艺的"芯片全能手"——WT2606B驱屏语音芯片。这颗芯片将在今年8月的I0TE物联网展及ELEXCON 2025深圳国际电子展上大放异彩。在智能设备满天飞的今天&#x…

ORA-16331: container is not open ORA-06512: at “SYS.DBMS_LOGMNR“

使用Flink CDC、Debezium等CDC工具对Oracle进行基于log的实时数据同步时遇到异常ORA-16331: container is not open的解决方案。 1. 异常信息 异常信息通常如下: at oracle.jdbc.driver.OracleStatement.executeInternal(OracleStatement.java:1823) at oracle.jdbc…

「三维共振」:重构实体零售的破局模式

在电商冲击与消费升级的双重浪潮下,传统零售模式正面临前所未有的挑战。wo店首创的 “三维共振” 运营模式,以场景体验为根基、数据驱动为引擎、社群共生为纽带,构建起线上线下深度融合的新型零售生态,至今已实现连续 18 个月客流…

将集合拆分成若干个batch,并将batch存于新的集合

在使用saveAll()等方法时,为了防止集合元素过大,使用splitList将原集合,分割成若干个小集合 import java.util.ArrayList; import java.util.List;public class ListUtils {/*** 将集合拆分成若干个batch,并将batch存于新的集合** param list…

Java主流框架全解析:从企业级开发到云原生

Java作为一门历史悠久且应用广泛的编程语言,其强大的生态系统离不开各种优秀的框架支持。无论是传统的企业级应用开发,还是现代的微服务、云原生架构,Java都提供了丰富的框架选择。本文将全面解析当前主流的Java框架,涵盖Web开发、…

机器学习——网格搜索(GridSearchCV)超参数优化

网格搜索(Grid Search)详细教学1. 什么是网格搜索?在机器学习模型中,算法的**超参数(Hyperparameters)**对模型的表现起着决定性作用。比如:KNN 的邻居数量 n_neighborsSVM 的惩罚系数 C 和核函…

【LeetCode】18. 四数之和

文章目录18. 四数之和题目描述示例 1:示例 2:提示:解题思路算法一:排序 双指针(推荐)算法二:通用 kSum(含 2Sum 双指针)复杂度关键细节代码实现要点完整题解代码18. 四数…

Go语言入门(10)-数组

访问数组元素:数组中的每个元素都可以通过“[]”和一个从0开始的索引进行访问数组的长度可由内置函数len来确定。在声明数组时,未被赋值元素的值是对应类型的零值。下面看一个例子package mainfunc main(){var planets [8]stringplanets[0] "Mercu…

为什么经过IPSec隧道后HTTPS会访问不通?一次隧道环境下的实战分析

在运维圈子里,大家可能都遇到过这种奇怪的问题:浏览器能打开 HTTP 网站,但一换成 HTTPS,页面就死活打不开。前段时间,我们就碰到这么一个典型案例。故障现象某公司系统在 VPN 隧道里访问 HTTPS 服务,结果就…

【Linux系统】进程信号:信号的产生和保存

上篇文章我们介绍了Syetem V IPC的消息队列和信号量,那么信号量和我们下面要介绍的信号有什么关系吗?其实没有关系,就相当于我们日常生活中常说的老婆和老婆饼,二者并没有关系1. 认识信号1.1 生活角度的信号解释(快递比…

WEB服务器(静态/动态网站搭建)

简介 名词:HTML(超文本标记语言),网站(多个网页组成一台网站),主页,网页,URL(统一资源定位符) 网站架构:LAMP(linux(系统)+apache(服务器程序)+mysql(数据库管理软件)+php(中间软件)) 静态站点 Apache基础 Apache官网:www.apache.org 软件包名称:…

开发避坑指南(29):微信昵称特殊字符存储异常修复方案

异常信息 Cause: java.sql.SQLException: Incorrect string value: \xF0\x9F\x8D\x8B\xE5\xBB... for column nick_name at row 1异常背景 抽奖大转盘,抽奖后需要保存用户抽奖记录,用户再次进入游戏时根据抽奖记录判断剩余抽奖机会。保存抽奖记录时需要…

leetcode-python-242有效的字母异位词

题目&#xff1a; 给定两个字符串 s 和 t &#xff0c;编写一个函数来判断 t 是否是 s 的 字母异位词。 示例 1: 输入: s “anagram”, t “nagaram” 输出: true 示例 2: 输入: s “rat”, t “car” 输出: false 提示: 1 < s.length, t.length < 5 * 104 s 和 t 仅…

【ARM】Keil MDK如何指定单文件的优化等级

1、 文档目标解决在MDK中如何对于单个源文件去设置优化等级。2、 问题场景在正常的项目开发中&#xff0c;我们通常都是针对整个工程去做优化&#xff0c;相当于整个工程都是使用一个编译器优化等级去进行的工程构建。那么在一些特定的情况下&#xff0c;工程师需要保证我的部分…