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

模型保存与读取

完整模型训练套路

c 复制代码
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 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)
#搭建神经网络

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=data
        outputs=XKK(imgs)
        loss=loss_fn(outputs,targets)
        #优化器调优,优化模型
        optimizer.zero_grad()
        loss.backward()
        optimizer.step()
        total_test_step=total_test_step+1
        if 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=0
    with torch.no_grad():
        for data in test_dataloader:
            imgs,targets=data
            outputs=XKK(imgs)
            loss=loss_fn(outputs,targets)
            total_test_loss=total_test_loss+loss
    print("整体测试集上的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训练

c 复制代码
import time

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 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=data
        imgs=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+1
        if 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=0
    with torch.no_grad():
        for data in test_dataloader:
            imgs,targets=data
            imgs = 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+1
    torch.save(XKK,"XKK_{}.pth".format(i))
    print("模型已保存")
writer.close()

CPU训练时间如下

使用GPU训练时间如下

对比可知GPU训练速度提升5倍左右

GPU代码区CPU区别如下

只需要改动网络模型、数据、损失函数,调用它们对应的.cuda()。

方式2

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

.....

测试

c 复制代码
import torch
import torchvision.transforms
from PIL import Image
from torch.nn import Conv2d, MaxPool2d, Flatten, Linear

image_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))

输入一张小狗图片

c 复制代码
image_path="imgs/dog.png"

结果
tensor([5])

输入一张飞机图片

c 复制代码
image_path="imgs/airplane.png"
结果
tensor([0])

可以看出预测准确

相关推荐
小徐Chao努力几秒前
Spring AI Alibaba A2A 使用指南
java·人工智能·spring boot·spring·spring cloud·agent·a2a
啊阿狸不会拉杆几秒前
《数字图像处理》第7章:小波变换和其他图像变换
图像处理·人工智能·python·算法·机器学习·计算机视觉·数字图像处理
yiersansiwu123d1 分钟前
生成式AI重构内容生态,人机协同定义创作新范式
大数据·人工智能·重构
老蒋新思维3 分钟前
创客匠人:从个人IP到知识变现,如何构建可持续的内容生态?
大数据·网络·人工智能·网络协议·tcp/ip·创客匠人·知识变现
HyperAI超神经8 分钟前
GPT-5全面领先,OpenAI发布FrontierScience,「推理+科研」双轨检验大模型能力
人工智能·gpt·ai·openai·benchmark·基准测试·gpt5.2
老蒋新思维13 分钟前
创客匠人洞察:从“个人品牌”到“系统物种”——知识IP的终极进化之路
网络·人工智能·网络协议·tcp/ip·重构·创客匠人·知识变现
阿杰学AI15 分钟前
AI核心知识57——大语言模型之MoE(简洁且通俗易懂版)
人工智能·ai·语言模型·aigc·ai-native·moe·混合专家模型
珠海西格电力19 分钟前
零碳园区边缘计算节点规划:数字底座的硬件部署与能耗控制方案
运维·人工智能·物联网·能源·边缘计算
臼犀23 分钟前
孩子,那不是说明书,那是祈祷文
人工智能·程序员·markdown
黑客思维者24 分钟前
《关于深入实施 “人工智能 +“ 行动的意见》深度解读
人工智能