【深度学习】(2)--PyTorch框架认识

news2025/2/23 7:26:21

文章目录

  • PyTorch框架认识
    • 1. Tensor张量
      • 定义与特性
      • 创建方式
    • 2. 下载数据集
      • 下载测试
      • 展现下载内容
    • 3. 创建DataLoader(数据加载器)
    • 4. 选择处理器
    • 5. 神经网络模型
      • 构建模型
    • 6. 训练数据
      • 训练集数据
      • 测试集数据
    • 7. 提高模型学习率
  • 总结

PyTorch框架认识

PyTorch是一个由Facebook人工智能研究院(FAIR)在2016年发布的开源深度学习框架,专为GPU加速的深度神经网络(DNN)编程而设计。它以其简洁、灵活和符合Python风格的特点,在科研和工业生产中得到了广泛应用。

1. Tensor张量

在PyTorch中,张量(Tensor)是核心数据结构,它是一个多维数组,用于存储和变换数据。张量类似于Numpy中的数组,但具有更丰富的功能和灵活性,特别是在支持GPU加速方面。

定义与特性

  • 多维数组:张量可以看作是一个n维数组,其中n可以是任意正整数。它可以是标量(零维数组)、向量(一维数组)、矩阵(二维数组)或具有更高维度的数组。
  • 数据类型统一:张量中的元素具有相同的数据类型,这有助于在GPU上进行高效的并行计算。
  • 支持GPU加速:PyTorch中的张量可以存储在CPU或GPU上,通过将张量转移到GPU上,可以利用GPU的强大计算能力来加速深度学习模型的训练和推理过程。

创建方式

  • 直接使用torch.tensor():根据提供的Python列表或Numpy数组创建张量。
  • 下载数据集时:transform=ToTensor()直接将数据转化为Tensor张量类型。

2. 下载数据集

在PyTorch中,有许多封装了很多与图像相关的模型、数据集,那么如何获取数据集呢?

导入datasets模块

from torchvision import datasets #封装了很多与图像相关的模型,数据集

以datasets模块中的MNIST数据集为例,包含70000张手写数字图像:60000张用于训练,10000张用于测试。图像是灰度的,28*28像素,并且居中的,以减少预处理和加快运行。

下载测试

我们来下载MNIST数据集

from torchvision.transforms import ToTensor # 数据转换,张量,将其他类型数据转换为tensor张量
"""-----下载训练集数据集-----"""
training_data = datasets.MNIST(
    root="data",
    train=True,# 取训练集
    download=True,
    transform=ToTensor(),# 张量,图片是不能直接传入神经网络模型的
) # 对于pytorch库能够识别的数据,一般是tensor张量

"""-----下载测试集数据集-----"""
test_data = datasets.MNIST(
    root="data",
    train=False,
    download=True,
    transform=ToTensor(),
)# numpy数组只能在CPU上运行,Tensor可以在GPU上运行,这在深度学习中可以显著提高计算速度

在这里插入图片描述

下载完成之后可在project栏查看。

展现下载内容

我们来查看部分图片(第59000张到第59009张):

"""-----展现手写字图片-----"""
# tensor -->numpy  矩阵类型数据
from matplotlib import pyplot as plt
figure = plt.figure() # 创建一个新的图形
for i in range(9):
    img,label = training_data[i+59000] #提取第59000张图片

    figure.add_subplot(3,3,i+1) #图像窗口中创建多个小窗口,小窗口用于显示图片
    plt.title(label)
    plt.axis("off")# 关闭当前轴的坐标轴
    plt.imshow(img.squeeze(),cmap="gray")
    a = img.squeeze()# squeeze()从张量img中去掉维度为1的。如果该维度不为1则张量不会改变
plt.show()

图片信息获取时,得到的张量数据类型是这样的:

在这里插入图片描述

我们通过squeeze()函数,去掉维度为1的。这样我们就可以得到图片的高宽大小,将它展现出来:

在这里插入图片描述

3. 创建DataLoader(数据加载器)

在PyTorch中,创建DataLoader的主要作用是将数据集(Dataset)加载到模型中,以便进行训练或推理。DataLoader通过封装数据集,提供了一个高效、灵活的方式来处理数据。

DataLoader通过batch_size参数将数据集自动划分为多个小批次(batch),每一批次的放入模型训练,减少内存的使用,提高训练速度。

import torch
from torch.utils.data import DataLoader
"""
创建数据DataLoader(数据加载器)
batch_size:将数据集分成多份,每一份为batch_size(指定数值)个数据。
优点:减少内存的使用,提高训练速度
"""
train_dataloder = DataLoader(training_data,batch_size=64)# 64张图片为一个包
test_datalodar = DataLoader(test_data,batch_size=64)
# 查看打包好的数据
for x,y in test_datalodar: #x是表示打包好的每一个数据包
    print(f"Shape of x [N, C, H, W]:{x.shape}")
    print(f"Shape of y:{y.shape} {y.dtype}")
    break
-----------------------
Shape of x [N, C, H, W]:torch.Size([64, 1, 28, 28])
Shape of y:torch.Size([64]) torch.int64

4. 选择处理器

我们知道,电脑中的处理器有CPU和GPU两种,CPU擅长执行复杂的指令和逻辑操作,而GPU则擅长处理大量并行计算任务。

所以,在可以的条件下,我们选择使用GPU处理器来学习深度学习,因为计算量比较大:

"""---判断当前设备是否支持GPU,其中mps是苹果m系列芯片的GPU"""
device = "cuda" if torch.cuda.is_available() else "mps" if torch.backends.mps.is_available() else "cpu"
print(f"Using {device} device")
----------------
Using cuda device

5. 神经网络模型

通过调用类的形式来使用神经网络,神经网络的模型:nn.module。

构建模型

我们在构建时,得明确神经网络模型的结构:输入层–隐藏层–输出层,而在每一个隐藏层进入下一层时,都会有一个激活函数计算,所以我们也按着这个架构层次定义函数:

class NeuralNetwork(nn.Module): #通过调用类的形式来使用神经网络,神经网络的模型:nn.module
    def __init__(self): # self类自己本身
        super().__init__() #继承的父类初始化
        self.flatten = nn.Flatten()# 输入层,展开一个对象flatten
        self.hidden1 = nn.Linear(28*28,256)# 隐藏层,第1个参数:有多少神经元传入进来;第二个参数,有多少数据传出去
        self.hidden2 = nn.Linear(256,128)
        self.hidden3 = nn.Linear(128,64)
        self.hidden4 = nn.Linear(64,32)
        self.out = nn.Linear(32,10)#输出层,输出必须与类别数量相同,输入必须是上一层的个数
    def forward(self,x): #前向传播(该名字不要轻易改),告诉它数据的流向
        x = self.flatten(x)
        x = self.hidden1(x)
        x = torch.sigmoid(x) #激活函数
        x = self.hidden2(x)
        x = torch.sigmoid(x)
        x = self.hidden3(x)
        x = torch.sigmoid(x)
        x = self.hidden4(x)
        x = torch.sigmoid(x)
        x = self.out(x)
        return x
model = NeuralNetwork().to(device) #将刚刚创建的模型传入到GPU
print(model)
-----------------------
NeuralNetwork(
  (flatten): Flatten(start_dim=1, end_dim=-1)
  (hidden1): Linear(in_features=784, out_features=256, bias=True)
  (hidden2): Linear(in_features=256, out_features=128, bias=True)
  (hidden3): Linear(in_features=128, out_features=64, bias=True)
  (hidden4): Linear(in_features=64, out_features=32, bias=True)
  (out): Linear(in_features=32, out_features=10, bias=True)
)

6. 训练数据

训练数据时,需要注意的参数:

  • optimizer优化器

在PyTorch中,创建Optimizer的主要作用是管理并更新模型中可学习参数(即权重和偏置)的值,以便最小化某个损失函数(loss function)。

  1. 梯度清零:在每次迭代开始时,Optimizer会调用**.zero_grad()**方法来清除之前累积的梯度,这是因为在PyTorch中,梯度是累加的,如果不清零,则下一次的梯度计算会包含前一次的梯度,导致错误的更新。
  2. 梯度计算:在模型进行前向传播(forward pass)和损失计算之后,Optimizer并不直接参与梯度的计算。梯度的计算是通过调用损失函数的**.backward()**方法完成的,该方法会计算损失函数关于模型中所有可学习参数的梯度,并将这些梯度存储在相应的参数对象中。
  3. 参数更新:在梯度计算完成后,Optimizer会调用**.step()**方法来根据计算得到的梯度以及选择的优化算法(如SGD、Adam等)来更新模型的参数。这一步骤是优化过程中最关键的部分,它决定了模型学习的方向和速度。
optimizer = torch.optim.Adam(model.parameters(),lr=0.001)
  • loss_fn损失函数

在PyTorch中,**nn.CrossEntropyLoss()**是一个常用的损失函数,它结合了 nn.LogSoftmax()nn.NLLLoss()(负对数似然损失)在一个单独的类中。

loss_fn = nn.CrossEntropyLoss()

训练集数据

from torch import nn #导入神经网络模块
def train(dataloader,model,loss_fn,optimizer):
    model.train()# 设置模型为训练模式

    batch_size_num =1# 迭代次数 
    for x,y in dataloader:
        x,y = x.to(device),y.to(device)  # 将数据和标签发送到指定设备  
        pred = model.forward(x)  # 前向传播  
        loss = loss_fn(pred,y)  # 计算损失  

        optimizer.zero_grad()  # 清除之前的梯度  
        loss.backward()  # 反向传播  
        optimizer.step()  # 更新模型参数  

        loss_value = loss.item()  # 获取损失值
        if batch_size_num %200 == 0:  # 每200次迭代打印一次损失  
            print(f"loss:{loss_value:>7f} [number:{batch_size_num}]")
        batch_size_num += 1
------------------------
loss:1.039446 [number:200]
loss:0.754774 [number:400]
loss:0.553383 [number:600]
loss:0.573400 [number:800]

测试集数据

def test(dataloader,model,loss_fn):
    size = len(dataloader.dataset) # 获取测试集的总大小。
    num_batches = len(dataloader) # 计算数据加载器中的批次数量。
    model.eval() # 将模型设置为评估模式。
    test_loss,correct = 0,0 # 初始化总损失和正确预测的数量。
    with torch.no_grad():
        for x,y in dataloader:
            x,y = x.to(device),y.to(device)
            pred = model.forward(x)
            test_loss += loss_fn(pred,y).item()
            correct += (pred.argmax(1) == y).type(torch.float).sum().item()
            a = (pred.argmax(1) == y)
            b = (pred.argmax(1) == y).type(torch.float)
    test_loss /= num_batches
    correct /= size
    correct = round(correct, 4)
    print(f"Test result: \n Accuracy:{(100*correct)}%,Avg loss:{test_loss}")
 ---------------------
Test result: 
 Accuracy:89.96%,Avg loss:0.36642977581092506

我们可以看到,这个模型的正确率不是特别的高,那么接下来我们来提高模型的学习率。

7. 提高模型学习率

遍历了指定的训练周期(epochs)数,并在每个周期中调用 train 函数来训练模型。

"""-----调整学习率-----"""
epochs = 10
for t in range(epochs):
    print(f"Epoch {t+1} \n-------------------------")
    train(train_dataloder,model,loss_fn,optimizer)
print("Done!")
test(test_datalodar,model,loss_fn)
---------------
仅展示优化后的结果:
Test result: 
 Accuracy:97.33000000000001%,Avg loss:0.10455594740913303

总结

本篇介绍了:

  1. PyTorch的框架
  2. 数据类型张量,数据集的获取
  3. 如何构建对应神经网络的模型
  4. 如何优化算法:一、修改optimizer优化器的算法;二、遍历合适的训练周期(epochs)数

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

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

相关文章

【STL】vector 基础,应用与操作

vector 是 C 标准库中最常用的顺序容器之一,提供了动态数组的功能。与普通数组相比,vector 能够根据需求自动扩展或收缩,为程序员提供了更灵活的数据存储方案。本文将详细介绍 vector 的相关操作,并结合实例代码帮助读者深入理解。…

MindShare PCIE 3.0 笔记-第一二章

MindShare 官网,地址如下: MindShare Chapter 1:PCIE 背景介绍 - PCI 总线模型 1. 以 PCI 总线作为外设总线的 SOC 芯片架构 下图展示了一个以 PCI 总线作为外设总线的 SOC 芯片架构(PCI 总线类似 AXI 下的 AHB?): 由上图可知…

Django Auth组件

文章目录 前言一、使用场景二、使用步骤1.验证用户( authenticate() 方法)2.注册用户3.退出登陆4.装饰器 前言 Django 的用户认证组件基于以下几个核心概念: 1.用户认证:处理用户的登录、注销和密码管理,提供了一个User模型和相关的视图、表…

技术美术一百问(02)

问题 前向渲染和延迟渲染的流程 前向渲染和延迟渲染的区别 G-Buffer是什么 前向渲染和延迟渲染各自擅长的方向总结 GPU pipeline是怎么样的 Tessellation的三个阶段 什么是图形渲染API? 常见的图形渲染API有哪些? 答案 1.前向渲染和延迟渲染的流程 【例图…

图神经网络池化方法

图神经网络池化方法 提示:写完文章后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 图神经网络池化方法前言一、扁平图池化二、分层图池化1.节点聚类池化2.节点丢弃池化 参考文献 前言 图池化操作根据其池化策略的差异&#xff…

软考(中级-软件设计师)(0919)

软考 一、软件设计师-历年考试考点分布情况-上午-计算机与软件工程知识 知识点分数说明比例软件工程基础知识11开发模型、设计原则、测试方法、质量特性、CMM、Pert图、风险管理14.67%面向对象12面向对象基本概念、面向对象分析与设计、UML、常见算法16.00%数据结构与算法10…

代码随想录算法day37 | 动态规划算法part10 |

今天开始正式子序列系列!!!!! 300.最长递增子序列 本题是比较简单的,感受感受一下子序列题目的思路。 力扣题目链接(opens new window) 给你一个整数数组 nums ,找到其中最长严格递增子序列的长…

读mamba有感,自然而然产生的问题及答案。

原文链接:https://arxiv.org/abs/2312.00752 Q:为什么说Mamba可以比肩甚至超越transformer?各自有什么优劣? A:Transformer在处理长序列时,存在着计算效率低下的问题,无法对有限窗口之外的任何…

查询中的行选择

用WHERE子句限制从查询返回的行。一个WHERE子句包含一个必须满足的条件,WHERE子句紧跟着FROM子句。如果条件是true,返回满足条件的行。 在语法中: WHERE 限制查询满足条件的行 condition 由列名、表达式、常数和比较操作组成…

bootstrap application nacos环境配置失效

tmd 环境配置 是yaml ,yml 后缀配置不生效 (不,看你取得文件名是什么) 如果 file-extension 配置的是yaml 就读取不到 yml 中的配置 2 . 如果还不行,、nacos 配置只能卸载bootstrap.yml 中,application.yml 不生效 bootstrap.yml…

c/c++语言中extern的用法(VS编译)

c/c语言中extern的用法 前言:1. 声明外部变量2. 声明外部函数3. 在头文件中使用注意事项 效果展示: 前言: extern 关键字不仅在 C 语言中使用,在 C 语言中也同样适用。它主要用于声明一个变量或者函数是在别的文件或翻译单元中定…

怎么操作使http变成https访问?

获取SSL证书 选择证书颁发机构:可以选择受信任的免费或付费证书颁发机构(CA)如JoySSL 申请和验证域名:注册并填写注册码230920,验证域名所有权。下载SSL证书文件到本地电脑. JoySSL品牌证书 注册享大额优惠JoySSL是网…

Android开发高频面试题之——Android篇

Android开发高频面试题之——Android篇 Android开发高频面试题之——Java基础篇 Android开发高频面试题之——Kotlin基础篇 Android开发高频面试题之——Android基础篇 1. Activity启动模式 standard 标准模式,每次都是新建Activity实例。singleTop 栈顶复用。如果要启动的A…

车市状态喜人,国内海外“两开花”

文/王俣祺 导语:随着中秋假期告一段落,“金九”也正式过半,整体上这个销售旺季的数据可以说十分喜人,各家车企不是发布新车、改款车就是推出了一系列购车权益,充分刺激了消费者的购车热情。再加上政府政策的鼎力支持&a…

Unity 使用Editor工具查找 Prefab 中的指定脚本

在 Unity 项目中,随着项目规模的扩大和 Prefab 数量的增加,管理和定位 Prefab 中的脚本变得更加复杂。为了提高开发效率,所以需要编写一个自定义的 Unity Editor 工具,帮助查找某个 Prefab 中是否使用了指定的脚本。本文将介绍如何…

LIN总线CAPL函数——干扰LIN帧响应段(linInvertRespBit )

🍅 我是蚂蚁小兵,专注于车载诊断领域,尤其擅长于对CANoe工具的使用🍅 寻找组织 ,答疑解惑,摸鱼聊天,博客源码,点击加入👉【相亲相爱一家人】🍅 玩转CANoe&…

目标检测:滑块验证

最近在做一些爬虫相关的任务,有时候在登录时候需要去做滑块验证,刚好自己是做AI这一块得,就想着使用目标检测去做检测,然后绕过滑块。

AI 时代,大模型产业落地的八大思考

引言 在人工智能领域,大模型技术正逐渐成为推动行业进步的关键力量。随着技术的发展,大模型不仅在学术界引起了广泛的关注,也在产业界展现出巨大的应用潜力。然而,如何将这些强大的模型有效地应用到实际产业中,仍然是…

什么软件可以远程控制电脑?好用的电脑远程控制软件有哪些?这6款可以帮到你!

在如今的数字化办公环境中,远程控制电脑已成为解决问题、协作工作的必备技能。 无论是技术支持、远程办公,还是简单的文件传输,远程控制软件都能让我们随时随地连接其他电脑,省时省力。 那么,有哪些好用的远程控制软…

大数据和代理:揭示它们之间的微妙联系

大数据,顾名思义,是指使用传统数据处理应用程序无法有效处理的极其庞大而复杂的数据集。这些数据集的特点是数量庞大、速度快、种类繁多,有可能提供有价值的见解并支持各个行业的决策过程。 这些数据可能来自各种来源,例如社交媒体…