《深度学习》——pytorch框架及项目

文章目录

  • pytorch
    • 特点
    • 基本概念
  • 项目
    • 项目实现
      • 导入所需库
      • 下载训练数据和测试数据
      • 对训练和测试样本进行分批次
      • 展示手写图片
      • 判断pytorch是否支持GPU
      • 定义神经网络模型
      • 定义训练函数
      • 定义测试函数
      • 创建交叉熵损失函数和优化器
      • 通过多轮训练降低损失值得到最终结果
      • 注意

pytorch

PyTorch 是一个开源的深度学习框架,由 Facebook 的人工智能研究团队开发。它在学术界和工业界都得到了广泛的应用,下面从多个方面详细介绍:

特点

  • 动态计算图:与 TensorFlow 的静态计算图不同,PyTorch 使用动态计算图。这意味着在运行时可以动态地改变计算图的结构,使得代码的编写和调试更加直观和灵活。例如,在训练循环中可以根据不同的条件来改变计算流程。
  • Python 优先:PyTorch 深度集成 Python,代码风格简洁易懂,易于上手。开发者可以利用 Python 丰富的库和工具进行数据处理、可视化等操作。
  • 强大的 GPU 支持:PyTorch 能够充分利用 NVIDIA GPU 的并行计算能力,通过简单的代码就可以将张量和模型转移到 GPU 上进行加速计算,大大提高了训练和推理的速度。
  • 丰富的工具和库:提供了许多高级工具和库,如 Torchvision(用于计算机视觉任务)、Torchaudio(用于音频处理任务)等,方便开发者快速搭建和训练模型。

基本概念

  • 一、张量(Tensor):类似于 NumPy 的多维数组,但可以在 GPU 上运行以加速计算。例如,创建一个简单的张量

    import torch# 创建一个2x3的随机张量
    x = torch.rand(2, 3)
    print(x)
    

    在这里插入图片描述

  • 二、自动求导(Autograd):PyTorch 的自动求导机制可以自动计算张量的梯度,这对于训练神经网络非常重要。在定义张量时,只需要设置requires_grad=True,PyTorch 就会跟踪所有与之相关的操作,并在需要时计算梯度。

    import torch
    # 创建一个需要计算梯度的张量
    x = torch.tensor([2.0], requires_grad=True)
    y = x**2
    # 计算梯度
    y.backward()
    print(x.grad)  # 输出导数 2x,即 4
    
  • 三、模块(Module):torch.nn.Module是所有神经网络模块的基类。通过继承Module类,可以方便地定义自己的神经网络模型。

import torch
import torch.nn as nn# 定义一个简单的全连接神经网络
class SimpleNet(nn.Module):def __init__(self):super(SimpleNet, self).__init__()self.fc = nn.Linear(10, 1)def forward(self, x):return self.fc(x)# 创建模型实例
model = SimpleNet()
  • 四、优化器(Optimizer)
    PyTorch 提供了多种优化器,如 SGD、Adam、RMSprop 等,用于更新模型的参数。优化器根据计算得到的梯度来调整模型的参数,以最小化损失函数。

项目

下面我们使用BP神经网络来实现手写数字识别项目,此项目数据集来自MNIST 数据集由美国国家标准与技术研究所(NIST)整理而成,包含手写数字的图像,主要用于数字识别的训练和测试。该数据集被分为两部分:训练集和测试集。训练集包含 60,000 张图像,用于模型的学习和训练;测试集包含 10,000 张图像,用于评估训练好的模型在未见过的数据上的性能。

  • 图像格式:数据集中的图像是灰度图像,即每个像素只有一个值表示其亮度,取值范围通常为 0(黑色)到 255(白色)。
  • 图像尺寸:每张图像的尺寸为 28x28 像素,总共有 784 个像素点。
  • 标签信息:每个图像都有一个对应的标签,标签是 0 到 9 之间的整数,表示图像中手写数字的值

项目实现

导入所需库

import torch
from torch import nn #导入神经网络模块
from torch.utils.data import DataLoader # 数据包管理工具,打包数据
from torchvision import datasets # 封装了很对与图像相关的模型,数据集
from torchvision.transforms import ToTensor # 数据转换,张量,将其他类型的数据转换成tensor张量

下载训练数据和测试数据

'''下载训练数据集(包含训练集图片+标签)'''
training_data = datasets.MNIST( # 跳转到函数的内部源代码,pycharm 按下ctrl+鼠标点击root='data', # 表示下载的手写数字 到哪个路径。60000train=True, # 读取下载后的数据中的数据集download=True, # 如果你之前已经下载过了,就不用再下载了transform=ToTensor(), # 张量,图片是不能直接传入神经网络模型# 对于pytorch库能够识别的数据一般是tensor张量
)'''下载测试数据集(包含训练图片+标签)'''
test_data = datasets.MNIST(root='data',train=False,download=True,transform=ToTensor(),# Tensor是在深度学习中提出并广泛应用的数据类型,它与深度学习框架(如pytorch,TensorFlow)
)# numpy数组只能在cpu上运行。Tensor可以在GPU上运行,这在深度学习应用中可以显著提高计算速度。
print(len(training_data))
print(len(test_data))

在这里插入图片描述

训练样本和测试样本的数量
在这里插入图片描述

对训练和测试样本进行分批次

# 创建训练数据的 DataLoader 对象
# DataLoader 是 PyTorch 中用于批量加载数据的实用工具类,它可以帮助我们更高效地处理大规模数据集。
train_dataloader = DataLoader(training_data, batch_size=64)  # 建议用2的指数当作一个包的数量
test_dataloader = DataLoader(test_data, batch_size=64)

展示手写图片

'''展示手写体图片,把训练数据集中的59000张图片展示一下'''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.show(I) # 显示矢量plt.imshow(img.squeeze(),cmap='gray') # plt.imshow()将numpy数组data中的数据显示为图像,并在图形窗口显示a = img.squeeze() # img.squeeze()从张量img中去掉维度为1的。如果该维度的大小不为1则张量不会改变。
plt.show()

在这里插入图片描述

判断pytorch是否支持GPU

'''判断是否支持GPU'''
device = 'cuda' if torch.cuda.is_available() else 'mps' if torch.backends.mps.is_available() else 'cpu'
print(f'Using {device} device')

如果支持GPU输出cuda,map系统则输出map,使用CPU则输出CPU
在这里插入图片描述

定义神经网络模型

'''定义神经网络 类的继承这种方式'''
class NeuralNetwork(nn.Module): # 通过调用类的形式来使用神经网络,神经网络模型nn.moduledef __init__(self): # self类自己本身super().__init__() # 继承的父类初始化self.flatten = nn.Flatten() # 展开,创建一个展开对象flattenself.hidden1 = nn.Linear(28*28,128)self.hidden2 = nn.Linear(128,256)self.out = nn.Linear(256,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.out(x)return x
model = NeuralNetwork().to(device)
print(model)

定义训练函数

def train(dataloader,model,loss_fn,optimizer):model.train() # 告诉模型,要开始训练,模型中w进行随机化操作,已经更新w,在训练过程中w会被修改# pytorch提供两种方式来切换训练和测试的模式,分别是:model.train()和model.eval()# 一般用法:在训练之前写model.train(),在测试时写model.eval()batch_size_num = 1for x,y in dataloader: # 其中batch为每一个数据的编号x,y=x.to(device),y.to(device) # 将训练数据和标签传入gpupred = model.forward(x) # .forward可以被省略,父类中已经对次功能进行了设置。自动初始化w权值loss = loss_fn(pred,y) # 通过交叉熵损失函数计算损失值loss# Backpropagation 进来个batch的数据,计算一次梯度,更新一次网络optimizer.zero_grad() #梯度值清零loss.backward() # 反向传播计算每一个参数的梯度值woptimizer.step() # 根据梯度更新网络w参数loss_value = loss.item() # 从tensor数据中提取数据出来,tensor获取损失值if batch_size_num % 100 == 0:print(f'loss:{loss_value:7f}  [number:{batch_size_num}]' )batch_size_num += 1

定义测试函数

def test(dataloader,model,loss_fn):size = len(dataloader.dataset) # 10000num_batches = len(dataloader) # 打包的数据model.eval() # 测试,w就不能再更新test_loss,correct = 0,0with torch.no_grad(): # 一个上下文管理器,关闭梯度计算。当你确定不会调用Tensor.backward()的时候。这可以减少计算内存for x,y in dataloader:x,y = x.to(device),y.to(device)pred = model.forward(x)test_loss += loss_fn(pred,y).item()#test_loss是会自动累加每一个批次的损失值correct  +=(pred.argmax(1) == y).type(torch.float).sum().item()a = (pred.argmax(1) == y)#dim=1表示每一行中的最大值对应的索引号,dim=0表示每一列中的最大值对应的索引号b = (pred.argmax(1) == y).type(torch.float)test_loss /=num_batches#能来衡量模型测试的好坏。correct /= size#平均的正确率print(f'Test result: \n Accuracy:{(100*correct)}%,Avg loss:{test_loss}')

创建交叉熵损失函数和优化器

loss_fn = nn.CrossEntropyLoss()#创建交叉熵损失函数对象,因为手写字识别中一共有10个数字,输出会有10个结果
#一会改成adam优化器
optimizer = torch.optim.Adam(model.parameters(),lr=0.001)#创建一个优化器,SGD为随机梯度下降算法
#params:要训练的参数,一般我们传入的都是model.parameters()
# #lr:learning_rate学习率,也就是步长。

通过多轮训练降低损失值得到最终结果

epochs = 20
for t in range(epochs):print(f'epoch{t+1}\n--------------------')train(train_dataloader,model, loss_fn, optimizer)
print('Done!')
test(test_dataloader,model, loss_fn)

在这里插入图片描述

可通过结果看出在使用ADam优化器步长为0.001时,训练20轮得到的正确率为97.5%,损失值为0.119。

注意

  • 可以通过修改优化器来提高准确率
  • 对于不同的神经网络要使用不同的激活函数,对于sigmoid函数来说隐藏层过多时会产生梯度消失,因为sigmoid函数的偏导在0~0.25之间随着反向传播的进行,梯度会不断累乘。即使初始梯度较大,但经过多层的累乘后,梯度值会迅速变小,趋近于 0,从而导致梯度消失。因此可用ReLU、tanh、P-ReLU、R-ReLU、maxout等来代替sigmoid函数。ReLU函数偏导为1,不会产生梯度消失问题。
  • 当梯度在传递过程中不断增大,变得非常大时,就会导致梯度爆炸现象。此时,模型参数会因为梯度值过大而发生大幅度的更新,使得模型无法收敛,甚至可能导致数值溢出,使得训练过程崩溃。

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

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

相关文章

深入探索人工智能的未来:DeepSeek R1与蓝耘智算平台的完美结合

在当今数字化时代,人工智能(AI)和机器学习(ML)正以前所未有的速度改变着我们的生活和工作方式。从智能语音助手到自动驾驶汽车,从精准医疗到金融风险预测,AI的应用无处不在。深度学习作为AI的核…

基于uniapp vue3 的滑动抢单组件

通过在onMounted获取movable-area与movable-view实例&#xff0c;计算出可滑动的距离 效果图&#xff1a; 代码&#xff1a; <template><view class"slider-container"><movable-area class"movable-area" id"movableArea">…

亚博microros小车-原生ubuntu支持系列:26手势控制小车基础运动

背景知识 手指检测&#xff1a;亚博microros小车-原生ubuntu支持系列&#xff1a;4-手部检测-CSDN博客 程序功能说明 功能开启后&#xff0c;摄像头捕获图像&#xff0c;识别手势来控制小车移动。 手势 “5”小车前进拳头小车后退手势 “1”小车向左手势 “2”小车向右 运…

在人工智能领域 ⊕、⊗和 ⊙ 符号是什么含义?

我们经常在论文中看到 ⊕、⊗和 ⊙ 符号&#xff0c;那么有下面两个问题&#xff1a; 这三个符号有什么作用呢&#xff1f; 如何在论文中正确使用这三个数学符号 1. 两种符号的解释 1.1 逐元素相加&#xff1a;⊕ ⊕ 在论文中表示逐元素相加&#xff0c;如果用两个矩阵表示&a…

NineData云原生智能数据管理平台新功能发布|2025年1月版

本月发布 14 项更新&#xff0c;其中重点发布 6 项、功能优化 7 项、安全性更新 1 项。 重点发布 数据库 Devops - 数据导出功能增强 支持 AWS ElastiCache 数据源&#xff1a;现已支持通过 SQL 查询语句或直接通过库表导出 AWS ElastiCache 数据&#xff0c;方便用户快速提取…

蓝桥与力扣刷题(226 翻转二叉树)

题目&#xff1a;给你一棵二叉树的根节点 root &#xff0c;翻转这棵二叉树&#xff0c;并返回其根节点。 示例 1&#xff1a; 输入&#xff1a;root [4,2,7,1,3,6,9] 输出&#xff1a;[4,7,2,9,6,3,1]示例 2&#xff1a; 输入&#xff1a;root [2,1,3] 输出&#xff1a;[2,…

C# OpenCV机器视觉:OSTU算法实现背景差分的自适应分割

在一个热闹的科技公司里&#xff0c;阿强是一个负责图像分析的员工。他的日常工作就是从各种复杂的图像中提取出有用的信息&#xff0c;可这可不是一件轻松的事情哦 最近&#xff0c;阿强接到了一个艰巨的任务&#xff1a;要从一堆嘈杂的监控图像中分离出运动的物体&#xff0c…

amis组件crud使用踩坑

crud注意 过滤条件参数同步地址栏 默认 CRUD 会将过滤条件参数同步至浏览器地址栏中&#xff0c;比如搜索条件、当前页数&#xff0c;这也做的目的是刷新页面的时候还能进入之前的分页。 但也会导致地址栏中的参数数据合并到顶层的数据链中&#xff0c;例如&#xff1a;自动…

解决 ollama._types.ResponseError 问题

原因 在对问题进行分析后&#xff0c;我认为原因是之前为了在服务器上下载模型&#xff0c;我设置了启动时自动配置的网络代理。然而&#xff0c;ollama在运行时采用了该代理配置&#xff0c;而不是默认的API URL&#xff08;“http://localhost:11434”&#xff09;。因此&am…

用户认证实验

一&#xff0c;拓扑图: 第一步&#xff1a;先开启防火墙 第二步&#xff1a;sw2配置&#xff1a; [sw2] vlan batch 10 20 interface GigabitEthernet0/0/2 port link-type access port default vlan 10 interface GigabitEthernet0/0/3 port link-type access port defau…

活动预告 | 为 AI 新纪元做好准备:助力安全的业务转型

课程介绍 随着现代办公模式的不断演变和 AI 技术的迅速发展&#xff0c;企业在享受效率提升的同时&#xff0c;也面临着信息安全与数据保护的严峻挑战。在利用 AI 技术释放业务潜力的同时&#xff0c;如何确保数据质量与安全已成为企业发展的关键议题。 在本次线上课程中&…

【再谈设计模式】中介者模式 - 协调对象间交互的枢纽

一、引言 在软件工程&#xff0c;软件开发过程中&#xff0c;复杂的软件系统&#xff0c;对象之间的交互往往错综复杂。当众多对象相互依赖、频繁通信时&#xff0c;系统的耦合度会急剧上升&#xff0c;导致代码难以维护、扩展和理解。就像在一个大型社交聚会中&#xff0c;如果…

网络工程师 (29)CSMA/CD协议

前言 CSMA/CD协议&#xff0c;即载波监听多路访问/碰撞检测&#xff08;Carrier Sense Multiple Access with Collision Detection&#xff09;协议&#xff0c;是一种在计算机网络中&#xff0c;特别是在以太网环境下&#xff0c;用于管理多个设备共享同一物理传输介质的重要…

软件项目验收测试有哪些类型?

在信息技术行业&#xff0c;软件项目的成功不仅依赖于开发能力&#xff0c;更在于准确的验收测试。验收测试是软件开发生命周期中的重要一环。其主要目的是验证软件系统是否符合用户需求和预期。在这一阶段&#xff0c;最终用户能够直观地判断软件是否满足其业务需求。 软件项…

Python截图轻量化工具

一、兼容局限性 这是用Python做的截图工具&#xff0c;不过由于使用了ctypes调用了Windows的API, 同时访问了Windows中"C:/Windows/Cursors/"中的.cur光标样式文件, 这个工具只适用于Windows环境&#xff1b; 如果要提升其跨平台性的话&#xff0c;需要考虑替换cty…

【Deepseek私有化部署】解决 Anything LLM 上传文档一直转圈上传失败问题

这里写自定义目录标题 一、问题描述二、原因分析&#xff08;一&#xff09;Embedder 在 Anything LLM 中的核心作用&#xff08;二&#xff09;默认配置与 Deepseek 的适配问题&#xff08;三&#xff09;未正确配置 nomic - embed - text 引发的异常 三、解决途径&#xff08…

神经网络|(九)概率论基础知识-泊松分布及python仿真

【1】引言 在前序学习进程中&#xff0c;我们已经知晓二项分布是多重伯努利分布&#xff0c;二伯努利分布对应的是可以无限重复、结果只有两种可能的随机试验。 相关文章链接为&#xff1a; 神经网络|(八)概率论基础知识-二项分布及python仿真-CSDN博客 上述文章还调用nump…

《从0到1CTFer成长之路》逆向工程个人笔记--静态分析

上一篇文章&#xff1a;《从0到1CTFer成长之路》逆向工程个人笔记--逆向工程基础 IDA 使用入门 加载文件 打开 IDA&#xff0c;点击 GO&#xff0c;即可把程序拖拽到 IDA 中 IDA 分为 32bit 和 64bit 两种架构&#xff0c;选择哪种结构&#xff0c;可以在把程序拖拽到 IDA 后…

【机器学习】训练(Training)、验证(Validation)和测试(Testing)

机器学习中训练(Training)、验证(Validation)和测试(Testing)这三个阶段的作用和关系。 1. 训练阶段 (Training) - 使用训练集数据来训练模型 - 模型通过学习训练数据的特征和模式来调整其内部参数 - 这个阶段模型会不断优化以减少预测误差 - 通常使用最大的数据集比例&…

解锁 DeepSeek 模型高效部署密码:蓝耘平台深度剖析与实战应用

&#x1f496;亲爱的朋友们&#xff0c;热烈欢迎来到 青云交的博客&#xff01;能与诸位在此相逢&#xff0c;我倍感荣幸。在这飞速更迭的时代&#xff0c;我们都渴望一方心灵净土&#xff0c;而 我的博客 正是这样温暖的所在。这里为你呈上趣味与实用兼具的知识&#xff0c;也…