动手学深度学习(pytorch土堆)-06损失函数与反向传播、模型训练、GPU训练

embedded/2024/11/14 15:02:29/

在这里插入图片描述

模型保存与读取

完整模型训练套路

import torch
import torchvision.datasets
from torch import nn
from torch.nn import Conv2d, MaxPool2d, Flatten, Linear
from torch.utils.data import DataLoader
from torch.utils.tensorboard import SummaryWriterfrom model import *train_data=torchvision.datasets.CIFAR10("data_nn",train=True,transform=torchvision.transforms.ToTensor(),download=True )
test_data=torchvision.datasets.CIFAR10("data_nn",train=False,transform=torchvision.transforms.ToTensor(),download=True )
train_data_size=len(train_data)
test_data_size=len(test_data)
print(test_data_size,train_data_size)train_dataloader=DataLoader(train_data,batch_size=64)
test_dataloader=DataLoader(test_data,batch_size=64)
#搭建神经网络XKK=xkkk()
#损失函数
loss_fn=nn.CrossEntropyLoss()
#优化器
learning_rate=0.01
optimizer=torch.optim.SGD(XKK.parameters(),lr=learning_rate)
#设置训练网络的一些参数
total_test_step=0
#训练的轮数
epoch=10
#添加tensorboard
writer=SummaryWriter("logs_train")
for i in range(epoch):print("----第{}轮训练开始----".format(i+1))for data in train_dataloader:imgs,targets=dataoutputs=XKK(imgs)loss=loss_fn(outputs,targets)#优化器调优,优化模型optimizer.zero_grad()loss.backward()optimizer.step()total_test_step=total_test_step+1if total_test_step%100==0:print("训练次数:{},loss:{}".format(total_test_step,loss))writer.add_scalar("train_loss",loss.item(),total_test_step)#测试步骤开始total_test_loss=0with torch.no_grad():for data in test_dataloader:imgs,targets=dataoutputs=XKK(imgs)loss=loss_fn(outputs,targets)total_test_loss=total_test_loss+lossprint("整体测试集上的Loss:{}".format(total_test_loss))writer.add_scalar("test_loss",total_test_loss,total_test_step)total_test_step=total_test_step+1
writer.close()

在这里插入图片描述

使用GPU训练

import timeimport torch
import torchvision.datasets
from torch import nn
from torch.nn import Conv2d, MaxPool2d, Flatten, Linear
from torch.utils.data import DataLoader
from torch.utils.tensorboard import SummaryWriter# from model import *train_data=torchvision.datasets.CIFAR10("data_nn",train=True,transform=torchvision.transforms.ToTensor(),download=True )
test_data=torchvision.datasets.CIFAR10("data_nn",train=False,transform=torchvision.transforms.ToTensor(),download=True )
train_data_size=len(train_data)
test_data_size=len(test_data)
print(test_data_size,train_data_size)train_dataloader=DataLoader(train_data,batch_size=64)
test_dataloader=DataLoader(test_data,batch_size=64)
#搭建神经网络class xkkk(torch.nn.Module):def __init__(self):super(xkkk,self).__init__()self.model1=torch.nn.Sequential(Conv2d(3, 32, 5,1, padding=2),MaxPool2d(kernel_size=2),Conv2d(32, 32, 5, 1,padding=2),MaxPool2d(kernel_size=2),Conv2d(32, 64, 5,stride=1, padding=2),MaxPool2d(kernel_size=2),Flatten(),Linear(in_features=64*4*4, out_features=64),  # 1024=64*4*4,Linear(64, 10))def forward(self, x):output=self.model1(x)return output
XKK=xkkk()
XKK=XKK.cuda()
#损失函数
loss_fn=nn.CrossEntropyLoss()
loss_fn=loss_fn.cuda()
#优化器
learning_rate=0.01
optimizer=torch.optim.SGD(XKK.parameters(),lr=learning_rate)
#设置训练网络的一些参数
total_test_step=0
#训练的轮数
epoch=10
#添加tensorboard
writer=SummaryWriter("logs_train")
start_time=time.time()
for i in range(epoch):print("----第{}轮训练开始----".format(i+1))for data in train_dataloader:imgs,targets=dataimgs=imgs.cuda()targets=targets.cuda()outputs=XKK(imgs)loss=loss_fn(outputs,targets)#优化器调优,优化模型optimizer.zero_grad()loss.backward()optimizer.step()total_test_step=total_test_step+1if total_test_step%100==0:end_time=time.time()print(end_time-start_time)print("训练次数:{},loss:{}".format(total_test_step,loss))writer.add_scalar("train_loss",loss.item(),total_test_step)#测试步骤开始total_test_loss=0with torch.no_grad():for data in test_dataloader:imgs,targets=dataimgs = imgs.cuda()targets = targets.cuda()outputs=XKK(imgs)loss=loss_fn(outputs,targets)total_test_loss=total_test_loss+loss.item()print("整体测试集上的Loss:{}".format(total_test_loss))writer.add_scalar("test_loss",total_test_loss,total_test_step)total_test_step=total_test_step+1torch.save(XKK,"XKK_{}.pth".format(i))print("模型已保存")
writer.close()

CPU训练时间如下
在这里插入图片描述

使用GPU训练时间如下
在这里插入图片描述
对比可知GPU训练速度提升5倍左右

GPU代码区CPU区别如下
在这里插入图片描述
只需要改动网络模型、数据、损失函数,调用它们对应的.cuda()。

方式2
在这里插入图片描述

#定义训练的设备
#device=torch.device("cpu")#使用cpu
device=torch.device("cuda")#使用GPU
....
XKK=xkkk()
XKK=XKK.to(device)
......imgs=imgs.to(device)targets=targets.to(device).....

测试

import torch
import torchvision.transforms
from PIL import Image
from torch.nn import Conv2d, MaxPool2d, Flatten, Linearimage_path="imgs/dog.png"image = (Image.open(image_path).convert("RGB"))
#image=Image.open(image_path)
transform=torchvision.transforms.Compose([torchvision.transforms.Resize((32,32)),torchvision.transforms.ToTensor()])
image=transform(image)class xkkk(torch.nn.Module):def __init__(self):super(xkkk,self).__init__()self.model1=torch.nn.Sequential(Conv2d(3, 32, 5,1, padding=2),MaxPool2d(kernel_size=2),Conv2d(32, 32, 5, 1,padding=2),MaxPool2d(kernel_size=2),Conv2d(32, 64, 5,stride=1, padding=2),MaxPool2d(kernel_size=2),Flatten(),Linear(in_features=64*4*4, out_features=64),  # 1024=64*4*4,Linear(64, 10))def forward(self, x):output=self.model1(x)return output
model=torch.load("XKK_9.pth",map_location=torch.device("cpu"))
print(model)
print(image.size())image=torch.reshape(image,(1,3,32,32))
model.eval()
with torch.no_grad():output=model(image)
print(output)
print(output.argmax(1))

输入一张小狗图片

image_path="imgs/dog.png"结果
tensor([5])

在这里插入图片描述

在这里插入图片描述
输入一张飞机图片
在这里插入图片描述

image_path="imgs/airplane.png"
结果
tensor([0])

可以看出预测准确


http://www.ppmy.cn/embedded/114491.html

相关文章

Zabbix中文乱码问题解决

目录 1、问题 2、解决办法 1、问题 2、解决办法 WinR打开运行,输入fonts,回车进入Windows字体目录,找到微软雅黑-常规字体,复制出来将文件名修改为msyh.ttf,注意后缀ttf 将msyh.ttf上传到服务器zabbix字体目录中&am…

Day4:杨辉三角

题目&#xff1a;给定一个非负整数numRows,生成杨辉三角的前numRows行。在杨辉三角中&#xff0c;每个数就是左上方和右上方数的和。 import java.util.ArrayList; import java.util.List;public class Test {public static List<List<Integer>> generate(int numR…

执行网络攻击模拟的 7 个步骤

在进攻和防守策略方面&#xff0c;我们可以从足球队和美式足球队身上学到很多东西。球员们会分析对方球队的策略&#xff0c;找出弱点&#xff0c;相应地调整进攻策略&#xff0c;最重要的是&#xff0c;练习、练习、再练习。作为最低要求&#xff0c;网络安全部门也应该这样做…

[论文笔记]MRRNET

这是一篇河大的论文 感觉跟SANET很像 摘要 摘要&#xff1a;随着物联网&#xff08;IoT&#xff09;的大规模部署&#xff0c;道路场景中实时感知和环境理解的需求变得越来越迫切。 同时&#xff0c;语义分割作为像素级场景解析得到了广泛的研究。 然而&#xff0c;资源有限…

AI服务器是什么?为什么要用AI服务器?

AI服务器的定义 AI服务器是一种专门为人工智能应用设计的服务器&#xff0c;它采用异构形式的硬件架构&#xff0c;通常搭载GPU、FPGA、ASIC等加速芯片&#xff0c;利用CPU与加速芯片的组合来满足高吞吐量互联的需求&#xff0c;为自然语言处理、计算机视觉、机器学习等人工智…

什么是 HTTP/3?下一代 Web 协议

毫无疑问&#xff0c;发展互联网底层的庞大协议基础设施是一项艰巨的任务。 HTTP 的下一个主要版本基于 QUIC 协议构建&#xff0c;并有望提供更好的性能和更高的安全性。 以下是 Web 应用程序开发人员需要了解的内容。 HTTP/3 的前景与风险 HTTP/3 致力于让互联网对每个人…

道路裂缝,坑洼,病害数据集-包括无人机视角,摩托车视角,车辆视角覆盖道路

道路裂缝&#xff0c;坑洼&#xff0c;病害数据集 包括无人机视角&#xff0c;摩托车视角&#xff0c;车辆视角 覆盖道路所有问题 一共有八类16000张 1到7依次为: [横向裂缝, 纵向裂缝, 块状裂缝, 龟裂, 坑槽, 修补网状裂缝, 修补裂缝, 修补坑槽] 道路病害&#xff08;如裂缝、…

【SpringCloud】服务注册与发现 - Eureka

目录 服务注册/服务发现-Eureka背景问题描述解决思路什么是注册中心CAP 理论常见的注册中心 Eureka 介绍搭建Eureka Server创建Eureka-server 子模块引入eureka-server依赖项目构建插件完善启动类编写配置文件启动服务 服务注册引入eureka-client依赖完善配置文件启动服务 服务…