Pytorch深度学习-----完整神经网络模型训练套路

news2024/11/24 3:29:30

系列文章目录

PyTorch深度学习——Anaconda和PyTorch安装
Pytorch深度学习-----数据模块Dataset类
Pytorch深度学习------TensorBoard的使用
Pytorch深度学习------Torchvision中Transforms的使用(ToTensor,Normalize,Resize ,Compose,RandomCrop)
Pytorch深度学习------torchvision中dataset数据集的使用(CIFAR10)
Pytorch深度学习-----DataLoader的用法
Pytorch深度学习-----神经网络的基本骨架-nn.Module的使用
Pytorch深度学习-----神经网络的卷积操作
Pytorch深度学习-----神经网络之卷积层用法详解
Pytorch深度学习-----神经网络之池化层用法详解及其最大池化的使用
Pytorch深度学习-----神经网络之非线性激活的使用(ReLu、Sigmoid)
Pytorch深度学习-----神经网络之线性层用法
Pytorch深度学习-----神经网络之Sequential的详细使用及实战详解
Pytorch深度学习-----损失函数(L1Loss、MSELoss、CrossEntropyLoss)
Pytorch深度学习-----优化器详解(SGD、Adam、RMSprop)
Pytorch深度学习-----现有网络模型的使用及修改(VGG16模型)
Pytorch深度学习-----神经网络模型的保存与加载(VGG16模型)


文章目录

  • 系列文章目录
  • 一、完整神经网络训练一般步骤
    • 1.数据集加载步骤
    • 2.模型创建步骤
    • 3.损失函数和优化器定义步骤
    • 4.训练循环步骤
    • 5.测试循环步骤
    • 6.训练和测试过程的记录和输出步骤
    • 7.结束训练步骤
  • 二、代码演示
  • 三、对上面代码进一步总结


一、完整神经网络训练一般步骤

1.数据集加载步骤

  • 使用适当的库加载数据集,例如torchvision、TensorFlow的tf.data等。
  • 将数据集分为训练集和测试集,并进行必要的预处理,如归一化、数据增强等。

2.模型创建步骤

  • 创建机器学习模型,可以是深度神经网络、传统机器学习模型或其它模型类型。
  • 定义模型架构,包括输入层、隐藏层和输出层的结构、激活函数、损失函数等。

3.损失函数和优化器定义步骤

  • 定义适当的损失函数来计算模型预测结果于真实标签之间的差异。
  • 选择适当的优化器算法来更新模型参数,如随机梯度下降(SGD)、Adam等。

4.训练循环步骤

  • 从训练集中获取一批样本数据,并将其输入模型进行前向传播。
  • 计算损失函数,并根据损失函数进行反向传播和参数更新。
  • 重复以上步骤,直到达到预定的训练次数或达到收敛条件。

5.测试循环步骤

  • 从测试集中获取一批样本数据,并将其输入模型进行前向传播。
  • 计算损失函数或评估指标,用于评估模型在测试集上的性能。

6.训练和测试过程的记录和输出步骤

  • 使用适当的工具或库记录训练过程中的损失值、准确率、评估指标等。
  • 可以使用TensorBoard、matplotlib、CSV文件等方式记录和可视化训练和测试结果。

7.结束训练步骤

  • 根据训练结束条件、例如达到预定的训练次数或收敛条件,结束训练。
  • 可以保存模型参数或整个模型,以便日后部署和使用。

二、代码演示

创建model.py代码如下

import torch
from torch import nn

# 搭建神经网络
class Lgl(nn.Module):
    def __init__(self):
        super(Lgl, self).__init__()
        self.model = nn.Sequential(
            nn.Conv2d(in_channels=3, out_channels=32, kernel_size=5, stride=1, padding=2),
            nn.MaxPool2d(kernel_size=2),
            nn.Conv2d(in_channels=32, out_channels=32, kernel_size=5, stride=1, padding=2),
            nn.MaxPool2d(kernel_size=2),
            nn.Conv2d(in_channels=32, out_channels=64, kernel_size=5, stride=1, padding=2),
            nn.MaxPool2d(kernel_size=2),
            nn.Flatten(),
            nn.Linear(in_features=64*4*4, out_features=64),
            nn.Linear(in_features=64, out_features=10)
        )
    def forward(self, x):
        x = self.model(x)
        return x

上述模型的原图如下所示
在这里插入图片描述

trains.py文件开始对模型按步骤进行训练代码如下

import torch
import torchvision
from torch import nn
from torch.utils.data import DataLoader
from torch.utils.tensorboard import SummaryWriter

# 加载自己搭建的神经网络
from model import *
"""
1.数据集加载
"""
# 准备训练数据集
train_data = torchvision.datasets.CIFAR10(root="dataset", train=True, transform=torchvision.transforms.ToTensor(), download=True)
# 准备测试数据集
test_data = torchvision.datasets.CIFAR10(root="dataset", train=False, transform=torchvision.transforms.ToTensor(), download=True)
# 训练数据集的长度
train_data_sise = len(train_data)
print("训练数据集的长度为:{}".format(train_data_sise))
# 测试数据集的长度
test_data_sise = len(test_data)
print("测试数据集的长度:".format(test_data_sise))
# 加载数据集
train_dataloader = DataLoader(test_data, batch_size=64)
test_dataloader = DataLoader(test_data, batch_size=64)
"""
2.模型的创建,这里直接from model import * 故下面直接调用
"""
# 实例化网络模型
lgl = Lgl()
"""
3.损失函数和优化器
"""
# 定义交叉熵损失函数
loss_fn = nn.CrossEntropyLoss()
# 进行优化器
learning_rate = 1e-2
optimizer = torch.optim.SGD(lgl.parameters(), lr=learning_rate)
"""
4.训练循环步骤
4.1 为训练做的参数准备工作
"""
# 开始设置训练神经网络的一些参数
# 记录训练的次数
total_train_step = 0
# 记录测试的次数
total_test_step = 0
# 记录是第几轮训练
epoch = 10
# 添加Tensorboard
writer = SummaryWriter("logs")
for i in range(epoch):
    print("----第{}轮训练开始----".format(i))
    """
    4.2 训练循环
    """
    # 训练步骤
    for data in train_dataloader:
        imgs, targets = data
        outputs = lgl(imgs)
        loos_result = loss_fn(outputs, targets)
        # 优化器优化模型
        # 将上一轮的梯度清零
        optimizer.zero_grad()
        # 借助梯度进行反向传播
        loos_result.backward()
        optimizer.step()

        total_train_step = total_train_step + 1
        if total_train_step % 100 == 0:
            print("训练次数:{}, loss:{}".format(total_train_step, loos_result.item()))
            writer.add_scalar("train_loos", loos_result.item(), total_train_step)
    """
    5.测试循环
    """
    # 测试步骤开始
    total_test_loos = 0
    with torch.no_grad():
        for imgs, targets in test_dataloader:
            outputs = lgl(imgs)
            loos_result = loss_fn(outputs, targets)
            total_test_loos = total_test_loos + loos_result.item()
    """
    6.测试过程的记录和输出
    """
    print("整体测试集上损失函数loos:{}".format(total_test_loos))
    writer.add_scalar("test_loos", total_test_loos, total_test_step)
    total_test_step = total_test_step + 1
    torch.save(lgl, "test_{}.pth".format(i))
    print("模型已保存")
"""
7.结束训练步骤
"""
writer.close()

运行结果

训练数据集的长度为:50000
测试数据集的长度:
----0轮训练开始----
训练次数:100, loss:2.2938857078552246
整体测试集上损失函数loos:359.07741928100586
模型已保存
----1轮训练开始----
训练次数:200, loss:2.2591800689697266
训练次数:300, loss:2.263899087905884
整体测试集上损失函数loos:351.34613394737244
模型已保存
----2轮训练开始----
训练次数:400, loss:2.175294876098633
整体测试集上损失函数loos:340.2291133403778
模型已保存
----3轮训练开始----
训练次数:500, loss:2.096158981323242
训练次数:600, loss:1.9759657382965088
整体测试集上损失函数loos:344.92591202259064
模型已保存
----4轮训练开始----
训练次数:700, loss:2.043778896331787
整体测试集上损失函数loos:333.33667516708374
模型已保存
----5轮训练开始----
训练次数:800, loss:1.9719760417938232
训练次数:900, loss:1.8361881971359253
整体测试集上损失函数loos:318.2255847454071
模型已保存
----6轮训练开始----
训练次数:1000, loss:1.832183599472046
整体测试集上损失函数loos:303.4973853826523
模型已保存
----7轮训练开始----
训练次数:1100, loss:1.8691924810409546
训练次数:1200, loss:2.0134520530700684
整体测试集上损失函数loos:292.21254682540894
模型已保存
----8轮训练开始----
训练次数:1300, loss:1.7631018161773682
训练次数:1400, loss:1.6039265394210815
整体测试集上损失函数loos:283.98761427402496
模型已保存
----9轮训练开始----
训练次数:1500, loss:1.7172112464904785
整体测试集上损失函数loos:276.9621036052704
模型已保存

tensorboard中显示
在这里插入图片描述

三、对上面代码进一步总结

数据集加载步骤:

使用torchvision库加载CIFAR10数据集。
将训练集和测试集分别存放在train_data和test_data中。

模型创建步骤:

引用model.py文件,在其中创建名为"Lgl"的模型。

损失函数和优化器定义步骤:

定义损失函数为交叉熵损失(nn.CrossEntropyLoss)。
定义优化器为随机梯度下降(SGD)优化器,并将模型参数传递给优化器。

训练循环步骤:

从训练数据(train_dataloader)中迭代获取一个批次的图像和目标标签。
执行模型的前向传播,计算损失,执行反向传播,更新模型参数。
记录训练过程中的损失值。
每100个训练步骤后,打印当前的训练次数和损失值。

测试循环步骤:

使用torch.no_grad()上下文环境。
从测试数据(test_dataloader)中迭代获取一个批次的图像和目标标签。
执行模型的前向传播和损失计算,并累加测试集上的损失值。

损失记录和输出步骤:

使用SummaryWriter创建一个TensorBoard的日志写入器。
将训练过程中的损失值写入TensorBoard文件中。
在整个测试集上打印损失值。

结束训练步骤:

关闭TensorBoard写入器。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【mysql】—— 表的约束

目录 序言 (一)空属性 (二)默认值 (三)列描述 (四)zerofill (五)主键 (六)自增长 (七)唯一键 &#…

git命令使用

君子拙于不知己,而信于知己。——司马迁 清屏:clear 查看当前面板的路径:pwd 查看当前面板的文件:ls 创建文件夹:mkdir 文件夹名 创建文件:touch 文件名 删除文件夹:rm -rf 文件夹名 删除文件:r…

【双指针_盛最多水的容器_C++】

题目解析 盛最多水的容器 算法原理 向内枚举: weight一定会减小 height不是不变就是减小要求的是盛水最多的容器,那么这些枚举情况就不需要。 拿比较小的数去向内枚举,v一直在减小,所以说直接排除 编写代码 class Soluti…

【rust/egui】(一)从编译运行template开始

说在前面 rust新手,egui没啥找到啥教程,这里自己记录下学习过程环境:windows11 22H2rust版本:rustc 1.71.1egui版本:rust windows安装参考:这里本文默认读者已安装相关环境(git、vscode等) 关于egui egui …

[数据集][目标检测]钢材表面缺陷目标检测数据集VOC格式2279张10类别

数据集格式:Pascal VOC格式(不包含分割路径的txt文件和yolo格式的txt文件,仅仅包含jpg图片和对应的xml) 图片数量(jpg文件个数):2279 标注数量(xml文件个数):2279 标注类别数:10 标注类别名称:["yueyawan",&…

【变形金刚02】注意机制以及BERT 和 GPT

一、说明 我已经解释了什么是注意力机制,以及与转换器相关的一些重要关键字和块,例如自我注意、查询、键和值以及多头注意力。在这一部分中,我将解释这些注意力块如何帮助创建转换器网络,注意、自我注意、多头注意、蒙面多头注意力…

Mysql中如果建立了索引,索引所占的空间随着数据量增长而变大,这样无论写入还是查询,性能都会有所下降,怎么处理?

索引所占空间的增长确实会对MySQL数据库的写入性能和查询性能造成影响,这主要是由于索引数据过多时会导致磁盘I/O操作变得非常频繁,从而使性能下降。为此,可以采取以下几种方式来减缓这种影响: 1. 限制索引的大小:可以…

【已成功解决】使用vpn/代理后无法正常上网/无法正常访问网站

文章目录 一、问题描述二、解决步骤三、原因分析 一、问题描述 很多同学在学习访问学校提供的资源时或者一些小伙伴在公司办公时需要使用VPN。但是当我们关闭VPN后,却发现没有办法正常连接到互联网了。 可以尝试以下方法解决,至于导致这种情况发生的原可…

SpringBoot携带Jdk绿色部署项目

文章目录 SpringBoot携带Jdk绿色部署运行项目1. 实现步骤2. 自测项目文件目录及bat文件内容,截图如下:2-1 项目文件夹列表:2-2. bat内容 SpringBoot携带Jdk绿色部署运行项目 说明: 实际应用的不方便场景:1. 实际项目…

Vue.js2+Cesium1.103.0 十、加载 Three.js

Vue.js2Cesium1.103.0 十、加载 Three.js Demo ThreeModel.vue <template><divid"three_container"class"three_container"/> </template><script> /* eslint-disable eqeqeq */ /* eslint-disable no-unused-vars */ /* eslint…

Python爬虫-抓取的目标数据为#x开头,怎么解决?

前言 本文是该专栏的第4篇,后面会持续分享python爬虫案例干货,记得关注。 在做爬虫项目的时候,有时候抓取的平台目标数据为&#x开头,如下图所示: 浏览器显示的正常数据,但通过爬虫协议获取到的网页源码数据却是以&#x开头的隐藏数据,遇到这种情况,爬虫需要怎么处…

基于扩频的数字视频水印嵌入和检测算法matlab仿真

目录 1.算法运行效果图预览 2.算法运行软件版本 3.部分核心程序 4.算法理论概述 5.算法完整程序工程 1.算法运行效果图预览 2.算法运行软件版本 matlab2022a 3.部分核心程序 ................................................................. for j 1:length(attens…

Google FixMatch:SOTA 在半监督学习基准测试中的性能

作为当前计算机视觉应用的首选&#xff0c;深度网络通常通过监督学习&#xff08;一种需要标记数据集的方法&#xff09;来实现其强大的性能。尽管人工智能多年来取得了许多成就和进步&#xff0c;但标记数据的关键任务仍然落在人类专家身上。他们很难满足那些数据饥渴的深度网…

智慧工地管理平台源码,Spring Cloud +Vue+UniApp框架开发

智慧工地源码 智慧工地云平台源码 智慧建筑源码 互联网建筑工地&#xff0c;是将互联网的理念和技术引入建筑工地&#xff0c;从施工现场源头抓起&#xff0c;最大程度的收集人员、安全、环境、材料等关键业务数据&#xff0c;依托物联网、互联网&#xff0c;建立云端大数据管…

【C++】透过STL源码深度剖析及模拟实现vector

鉴于读者的响应&#xff0c;打算将文章拆分一下&#xff0c;方便观看&#xff0c;基本接口可看 深入浅出STL之vector类 一、源码引入 以下我所介绍的都是基于【SGI】版本的STL&#xff0c;对源码有兴趣的同学可以去看看 侯捷老师的《STL源码剖析》 然后呢我们就去调出【vector…

引用.so库,JNI使用方法

1、先将.so库放在libs下&#xff1a; 2、在工程模块下 的build.gradle配置&#xff1a; android的defaultConfig配置 不同的系统平台看项目需要 3、生成与so库中c文件的jni方法的一样包名的实体类以及方法 如C文件暴露的方法&#xff1a; 生成的类和包名对应为&#xff1a; …

Python-OpenCV中的图像处理-模板匹配

Python-OpenCV中的图像处理-模板匹配 模板匹配单对象的模板匹配多对象的模板匹配 模板匹配 使用模板匹配可以在一幅图像中查找目标函数&#xff1a; cv2.matchTemplate()&#xff0c; cv2.minMaxLoc()模板匹配是用来在一副大图中搜寻查找模版图像位置的方法。 OpenCV 为我们提…

Fast SAM与YOLOV8检测模型一起使用实现实例分割

Fast SAM与YOLOV8检测模型一起使用 部分源代码在结尾处可获取 晓理紫 1 使用场景 实例分割数据集的获取要比检测数据的获取更加困难&#xff0c;在已有检测模型不想从新标注分割数据进行训练但是又想获取相关物体的mask信息以便从像素级别对物体进行操作&#xff0c;这时就可以…

【JavaEE进阶】SpringBoot项目的创建

文章目录 一. SpringBoot简介1. 什么是SpringBoot?2. SpringBoot的优点 二. SpringBoot项目创建1. 使用IDEA创建2. 使用网页创建SpringBoot项目 三. 运行SpringBoot项目 一. SpringBoot简介 1. 什么是SpringBoot? Spring Boot 是一个用于快速构建基于 Spring 框架的应用程序…

使用 PyTorch 逐步检测单个对象

一、说明 在对象检测任务中&#xff0c;我们希望找到图像中对象的位置。我们可以搜索一种类型的对象&#xff08;单对象检测&#xff0c;如本教程所示&#xff09;或多个对象&#xff08;多对象检测&#xff09;。通常&#xff0c;我们使用边界框定义对象的位置。有几种方法可以…