当前位置: 首页 > news >正文

pytorch学习笔记-模型训练、利用GPU加速训练(两种方法)、使用模型完成任务

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

模型训练

模型训练基本可以分为以下几个步骤按序执行:
引入数据集-使用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.dtcms.com/a/339280.html

相关文章:

  • 常见的软件图片缩放,算法如何选择?
  • 深入解析Spring MVC运行流程:从请求到响应的完整旅程
  • 完整的训练与测试套路 小土堆pytorch记录
  • PyTorch自动求导
  • PID调节
  • Go 进阶学习路线
  • 传统艾灸VS七彩喜艾灸机器人:同样的艾香,多了4分“巧”
  • 电脑出现‘无法启动此程序,因为计算机中丢失dll’要怎么办?2025最新的解决方法分析
  • 家庭健康能量站:微高压氧舱结合艾灸机器人,智享双重养生SPA
  • 大模型基础:Foundamentals of LLM
  • 关于物理世界、感知世界、认知世界与符号世界统一信息结构的跨领域探索
  • 最近常问的70道vue相关面试题
  • 豆包1.5 Vision Lite 对比 GPT-5-min,谁更适合你?实测AI模型选型利器 | AIBase
  • 【Langchain系列七】Langchain+FastAPI(字符串输出与OpenAI规范流式输出)+FastGPT
  • 《若依》项目结构分析
  • 温故而知新 再看设计模式
  • 2025.8.19总结
  • 防抖技术(一)——OIS光学防抖技术详解
  • 块存储 对象存储 文件存储的区别与联系
  • plantsimulation知识点25.8.19 工件不在RGV中心怎么办?
  • 技术详解及案例汇总|JY-V620半导体RFID读写器在晶圆盒追踪中的使用
  • Aiseesoft iPhone Unlocker:轻松解决iPhone锁屏问题
  • 量子计算和超级计算机将彻底改变技术
  • 重置iPhone会删除所有内容吗? 详细回答
  • 【Cocos】2D关节组件
  • canoe发送接收报文不通到底是接口问题还是配置问题如何处理
  • Codeforces 斐波那契立方体
  • 【Pycharm虚拟环境中安装Homebrew,会到系统中去吗】
  • k8sday11服务发现(2/2)
  • 机器学习(决策树2)