完整的模型训练套路(一、二、三)

搭建神经网络

在这里插入图片描述

model

import torch
from torch import nn#搭建神经网络
class Tudui(nn.Module):def __init__(self):super(Tudui, self).__init__()self.model = nn.Sequential(nn.Conv2d(3, 32, 5, 1, 2),nn.MaxPool2d(2),nn.Conv2d(32, 32, 5, 1, 2),nn.MaxPool2d(2),nn.Conv2d(32, 64, 5, 1, 2),nn.MaxPool2d(2),nn.Flatten(),nn.Linear(64 * 4 * 4, 64),nn.Linear(64, 10))def forward(self, x):x = self.model(x)return xif __name__ == '__main__':tudui = Tudui()input = torch.ones((64, 3, 32, 32))output = tudui(input)print(output.size())  # torch.Size([64, 10])

train

import torchvision
from model import *
from torch.utils.data import DataLoader#准备数据集
train_data = torchvision.datasets.CIFAR10(root='./data', train=True, download=True, transform=torchvision.transforms.ToTensor())
test_data = torchvision.datasets.CIFAR10(root='./data', train=False, download=True, transform=torchvision.transforms.ToTensor())
train_data_size = len(train_data)
test_data_size = len(test_data)
print("训练数据集的长度为:{}".format(train_data_size))  # 50000
print("测试数据集的长度为:{}".format(test_data_size))  # 10000
#利用Dataloader来加载数据集
train_dataloader = DataLoader(train_data, batch_size=64)
test_dataloader = DataLoader(test_data, batch_size=64)#创建网络模型
tudui = Tudui()
#损失函数
loss_fn = nn.CrossEntropyLoss()
#优化器
learning_rate = 1e-2
optimizer = torch.optim.SGD(tudui.parameters(), lr=learning_rate)#设置训练网络的一些参数
#记录训练的次数
total_train_step = 0
#记录测试的次数
total_test_step = 0
#训练的轮数
epochs = 10for epoch in range(epochs):print("------第{}轮训练开始------".format(epoch+1))#训练步骤开始for data in train_dataloader:imgs, targets = dataoutputs = tudui(imgs)loss = loss_fn(outputs, targets)#优化器优化模型optimizer.zero_grad()loss.backward()optimizer.step()total_train_step += 1if total_train_step % 100 == 0:print("训练次数: {}, Loss: {}".format(total_train_step, loss))  # loss.item()#测试步骤开始total_test_loss = 0with torch.no_grad():for data in test_dataloader:imgs, targets = dataoutputs = tudui(imgs)loss = loss_fn(outputs, targets)total_test_loss += lossprint("整体测试集上的Loss: {}".format(total_test_loss))

确实每轮有所提升
在这里插入图片描述

添加tensorboard

writer = SummaryWriter(log_dir='./logs_train')
writer.add_scalar('train_loss', loss, total_train_step)
writer.add_scalar('test_loss', total_test_loss, total_test_step)
total_test_step += 1
writer.close()

test_loss train_loss

在这里插入图片描述

保存模型

torch.save(tudui, "tudui_{}.pth".format(epoch+1))
print('模型已保存')

整体代码

import torch
import torchvision
from torch.utils.tensorboard import SummaryWriterfrom model import *
from torch.utils.data import DataLoader#准备数据集
train_data = torchvision.datasets.CIFAR10(root='./data', train=True, download=True, transform=torchvision.transforms.ToTensor())
test_data = torchvision.datasets.CIFAR10(root='./data', train=False, download=True, transform=torchvision.transforms.ToTensor())
train_data_size = len(train_data)
test_data_size = len(test_data)
print("训练数据集的长度为:{}".format(train_data_size))  # 50000
print("测试数据集的长度为:{}".format(test_data_size))  # 10000
#利用Dataloader来加载数据集
train_dataloader = DataLoader(train_data, batch_size=64)
test_dataloader = DataLoader(test_data, batch_size=64)#创建网络模型
tudui = Tudui()
#损失函数
loss_fn = nn.CrossEntropyLoss()
#优化器
learning_rate = 1e-2
optimizer = torch.optim.SGD(tudui.parameters(), lr=learning_rate)#设置训练网络的一些参数
#记录训练的次数
total_train_step = 0
#记录测试的次数
total_test_step = 0
#训练的轮数
epochs = 10#添加tensorboard
writer = SummaryWriter(log_dir='./logs_train')for epoch in range(epochs):print("------第{}轮训练开始------".format(epoch+1))#训练步骤开始for data in train_dataloader:imgs, targets = dataoutputs = tudui(imgs)loss = loss_fn(outputs, targets)#优化器优化模型optimizer.zero_grad()loss.backward()optimizer.step()total_train_step += 1if total_train_step % 100 == 0:print("训练次数: {}, Loss: {}".format(total_train_step, loss))  # loss.item()writer.add_scalar('train_loss', loss, total_train_step)#测试步骤开始total_test_loss = 0with torch.no_grad():for data in test_dataloader:imgs, targets = dataoutputs = tudui(imgs)loss = loss_fn(outputs, targets)total_test_loss += lossprint("整体测试集上的Loss: {}".format(total_test_loss))writer.add_scalar('test_loss', total_test_loss, total_test_step)total_test_step += 1torch.save(tudui, "tudui_{}.pth".format(epoch+1))print('模型已保存')writer.close()

预测

在这里插入图片描述

import torch
outputs = torch.tensor([[0.1, 0.2],[0.3, 0.4]])
print(outputs.argmax(dim=1))  # 取最大值的位置;1横着看, 0竖着看

在这里插入图片描述

预测的正确率

import torchoutputs = torch.tensor([[0.1, 0.2],[0.3, 0.4]])
print(outputs.argmax(dim=1))  # 取最大值的位置;1横着看, 0竖着看
preds = outputs.argmax(1)
targets = torch.tensor([0, 1])
print((preds == targets).sum())  # 对应位置相等的个数

在这里插入图片描述

对源代码的进行修改(增正确取率)

主要加了这一句,看分类的正确率

total_accuracy += (outputs.argmax(1) == targets).sum()

完整

import torch
import torchvision
from torch.utils.tensorboard import SummaryWriterfrom model import *
from torch.utils.data import DataLoader#准备数据集
train_data = torchvision.datasets.CIFAR10(root='./data', train=True, download=True, transform=torchvision.transforms.ToTensor())
test_data = torchvision.datasets.CIFAR10(root='./data', train=False, download=True, transform=torchvision.transforms.ToTensor())
train_data_size = len(train_data)
test_data_size = len(test_data)
print("训练数据集的长度为:{}".format(train_data_size))  # 50000
print("测试数据集的长度为:{}".format(test_data_size))  # 10000
#利用Dataloader来加载数据集
train_dataloader = DataLoader(train_data, batch_size=64)
test_dataloader = DataLoader(test_data, batch_size=64)#创建网络模型
tudui = Tudui()
#损失函数
loss_fn = nn.CrossEntropyLoss()
#优化器
learning_rate = 1e-2
optimizer = torch.optim.SGD(tudui.parameters(), lr=learning_rate)#设置训练网络的一些参数
#记录训练的次数
total_train_step = 0
#记录测试的次数
total_test_step = 0
#训练的轮数
epochs = 10#添加tensorboard
writer = SummaryWriter(log_dir='./logs_train')for epoch in range(epochs):print("------第{}轮训练开始------".format(epoch+1))#训练步骤开始for data in train_dataloader:imgs, targets = dataoutputs = tudui(imgs)loss = loss_fn(outputs, targets)#优化器优化模型optimizer.zero_grad()loss.backward()optimizer.step()total_train_step += 1if total_train_step % 100 == 0:print("训练次数: {}, Loss: {}".format(total_train_step, loss))  # loss.item()writer.add_scalar('train_loss', loss, total_train_step)#测试步骤开始total_test_loss = 0total_accuracy = 0with torch.no_grad():for data in test_dataloader:imgs, targets = dataoutputs = tudui(imgs)loss = loss_fn(outputs, targets)total_test_loss += losstotal_accuracy += (outputs.argmax(1) == targets).sum()print("整体测试集上的Loss: {}".format(total_test_loss))print("整体测试集上的正确率: {}".format(total_accuracy/test_data_size))writer.add_scalar('test_loss', total_test_loss, total_test_step)writer.add_scalar('test_accuracy', total_accuracy/test_data_size, total_test_step)total_test_step += 1torch.save(tudui, "tudui_{}.pth".format(epoch+1))print('模型已保存')writer.close()

正确率是有提升的
在这里插入图片描述
在这里插入图片描述

(三)细节

tudui.train()
tudui.eval()

并不是这样才能开始,仅对部分层有用,比如Dropout

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

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

相关文章

海外市场调研为什么要用独享静态代理IP?

独享静态IP在海外市场调研中扮演着至关重要的角色,提供了一系列无可比拟的优势。独享静态代理IP的稳定性和可靠性对于长期的市场调研至关重要,它保证了连接的持续性和数据的准确性。通过这些方面的综合优势,独享静态代理IP成为海外市场调研中…

【JavaWeb学习笔记】19 - 网购家居项目开发(上)

一、项目开发流程 程序框架图 项目具体分层方案 MVC 1、说明是MVC MVC全称: Mode模型、View视图、Controller控制器。 MVC最早出现在JavaEE三层中的Web层,它可以有效的指导WEB层的代码如何有效分离,单独工作。 View视图:只负责数据和界面的显示&…

张驰咨询:集成产品开发(IPD)的原理和实践技巧

IPD,是集成产品开发(Integrated Product Development)的缩写,它是集成了众多管理模型和理论、众多企业最佳管理实践的一整套体系,可以帮助企业快速响应市场变化、缩短产品上市时间、减少资源浪费、提高生产力&#xff…

RK3399平台入门到精通系列讲解(基础篇)__LITTLE_ENDIAN_BITFIELD 宏的使用

🚀返回总目录 文章目录 一、什么是字节序二、小端模式(Little-Endian)三、大端模式(Big-Endian)四、__LITTLE_ENDIAN_BITFIELD 使用案例一、什么是字节序 在计算机中,数据是以最原始的二进制 0 和 1 的方式被存储的。在大多数现代计算机体系架构中,计算机的最小可寻址数…

【MATLAB源码-第107期】基于matlab的OFDM系统在瑞利信道下功率分配仿真,使用注水算法。

操作环境: MATLAB 2022a 1、算法描述 在瑞利衰落信道下,OFDM(正交频分复用)系统的功率分配可以通过“注水算法”(water-filling algorithm)的方法来优化。这种算法的目的是在不同的子载波上分配不同的功…

Hive数据库:嵌入、本地、远程全攻略(上)

Hive分布式数据仓库工具 关系型数据库 建立在关系模型之上的数据库称为关系型数据库(关系模型是由埃德加科德于1970年提出的),关系型数据库借助集合代数等数学概念处理数据库中的数据。数据查询语言SOL是基于关系型数据库的语言,能够对关系型数据库中的数据进行检…

CSS3中transform2D变形详解

CSS3变形 在CSS3中,动画效果包括3个部分: 变形(transform)过渡(transition)动画(animation) 在实际开发中,有时需要实现元素的各种变形效果,如平移,缩放,旋转,倾斜等。 在CSS3中&#xff0c…

Kafka的简介及架构

目录 消息队列 产生背景 消息队列介绍 常见的消息队列产品 应用场景 消息队列的消息模型 Kafka的基本介绍 简介 Kafka的架构 Kafka的使用 Kafka的shell命令 Kafka的Python API的操作 完成生产者代码 完成消费者代码 消息队列 产生背景 消息队列:指数据在一个容器…

PyCharm使用手册

配置文件和代码模板 文件注释模板: 注释项描述示例Project项目名称hello_pythonFile文件名称hello_python.pyAuthor作者Zhang SanDate创建时间2024-01-11 17:05:00PyVersionPython解释器版本Python3.7Description文件描述这是一个python语言入门文件 效果示例&am…

【阅读笔记】Chain of LoRA

一、论文信息 1 论文标题 Chain of LoRA: Efficient Fine-tuning of Language Models via Residual Learning 2 发表刊物 arXiv2023 3 作者团队 Department of Computer Science, Princeton University School of Computer Science and Engineering, Nanyang Technologic…

2023年人工智能的最新发展(下)

目录 1.MidJourney: 2.GAN: 3.Diffusion Model 4.DALLE、Disco Diffusion 5.Stable Diffusion 1.MidJourney: 2023年3月,一组中国小情侣的照片在网络上迅速走红。这组照片看起来普通,就像一对小情侣的合影,但实…

Go后端开发 -- 条件、循环语句 defer语句

Go后端开发 – 条件、循环语句 && defer语句 文章目录 Go后端开发 -- 条件、循环语句 && defer语句一、条件语句1.if ... else 语句2.switch语句3.select语句 二、循环语句1.for循环 三、defer语句1.defer语句的作用2.defer和return的先后顺序3.recover错误拦截…