iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > Python >Python Pytorch深度学习之核心小结
  • 690
分享到

Python Pytorch深度学习之核心小结

2024-04-02 19:04:59 690人浏览 泡泡鱼

Python 官方文档:入门教程 => 点击学习

摘要

目录一、Numpy实现网络二、PyTorch:Tensor三、自动求导1、PyTorch:Tensor和auto_grad总结Pytorch的核心是两个主要特征: 1.一个n维ten

Pytorch的核心是两个主要特征:

1.一个n维tensor,类似于numpy,但是tensor可以在GPU上运行

2.搭建和训练神经网络时的自动微分/求导机制

一、Numpy实现网络

在总结Tensor之前,先使用numpy实现网络。numpy提供了一个n维数组对象,以及许多用于操作这些数组的函数。


import numpy as np
# n是批量大小,d_in是输入维度
# h是隐藏的维度,d_out是输出维度
n,d_in,h,d_out=64,1000,100,10
# 创建随机输入和输出数据
x=np.random.randn(n,d_in)
y=np.random.randn(n,d_out)
# 随机初始化权重
w1=np.random.randn(d_in,h)
w2=np.random.randn(h,d_out)
learning_rate=1e-6
for i in range(500):
    #前向传播,计算预测值y
    h=x.dot(w1)
    h_relu=np.maximum(h,0)
    y_pred=h_relu.dot(w2)
    #计算损失值
    loss=np.square(y_pred-y).sum()
    print(i,loss)
    #反向传播,计算w1和w2对loss的梯度
    grad_y_pred=2.0*(y_pred-y)
    grad_w2=h_relu.T.dot(grad_y_pred)
    grad_h_relu=grad_y_pred.dot(w2.T)
    grad_h=grad_h_relu.copy()
    grad_h[h<0]=0
    grad_w1=x.T.dot(grad_h)
    # 更新权重
    w1-=learning_rate*grad_w1
    w2-=learning_rate*grad_w2

运行结果

在这里插入图片描述

在这里插入图片描述

可以明显看到loss逐渐减小。

此处解释一下上次发的一篇中,有猿友对其中的loss有疑问,其实我认为:损失值loss只是为了检测网络的学习情况(至少我在这几篇中的loss就只有这个功能),在前面那一篇中迭代没有清零,所以损失值是一直增加的,如果每次迭代以后置零,效果和现在是一样的。至于其中的除以2000只是为了便于显示,可以一目了然大小的变化所以那么写的,所以可以自己定义合理的写法。(仅个人的理解和看法)

二、Pytorch:Tensor

Tensor 在概念上和numpy中的array相同,tensor也是一个n维数组,pytorch提供了许多函数用于操作这些张量。所有使用numpy执行的计算都可以使用pytorch的tensor完成。与numpy不同的是pytorch可以利用GPU加速数据的计算。实现和numpy相同的过程


#%%tensor实现网络
import torch
dtype=torch.float
device=torch.device('cpu')
# device=torch.device('cuda:0')#由GPU的可爱们享受吧,我不配,实验室没有给我高配置的电脑
# n是批量大小,d_in是输入维度
# h是隐藏的维度,d_out是输出维度
n,d_in,h,d_out=64,1000,100,10
# 创建随机输入和输出数据
x=torch.randn(n,d_in,device=device,dtype=dtype)
y=torch.randn(n,d_out,device=device,dtype=dtype)
# 随机初始化权重
w1=torch.randn(d_in,h,device=device,dtype=dtype)
w2=torch.randn(h,d_out,device=device,dtype=dtype)
learning_rate=1e-6
for i in range(500):
    #前向传播,计算预测值y
    h=x.mm(w1)
    h_relu=h.clamp(min=0)
    y_pred=h_relu.mm(w2)
    #计算损失值
    loss=(y_pred-y).pow(2).sum().item()
    print(i,loss)
    #反向传播,计算w1和w2对loss的梯度
    grad_y_pred=2.0*(y_pred-y)
    grad_w2=h_relu.t().mm(grad_y_pred)
    grad_h_relu=grad_y_pred.mm(w2.T)
    grad_h=grad_h_relu.clone()
    grad_h[h<0]=0
    grad_w1=x.t().mm(grad_h)
    # 更新权重
    w1-=learning_rate*grad_w1
    w2-=learning_rate*grad_w2

运行结果

在这里插入图片描述

在这里插入图片描述

三、自动求导

1、PyTorch:Tensor和auto_grad

上面两个例子中,我们自己手动实现了神经网络的向前和向后传递。手动实现反向传递对小型双层网络来说没有问题,但是对于大型复杂的网络来说就会变得很繁琐。

但是Pytorch中的autograd包提供了自动微分可以用来计算神经网络中的后向传递。当使用autograd时候,网络前后想传播将定义一个计算图,图中的节点是tensor,边是函数,这些函数是输出tensor到输入tensor的映射。这张计算图使得在网络中反向传播时梯度的计算十分简单。

如果我们想要计算某些tensor的梯度,我们只需要在建立这个tensor时加上一句:requires_grad=True。这个tensor上的任何Pytorch的操作都将构造一个计算图,从而允许我们在图中执行反向传播。如果这个tensor的requires_grad=True,那么反向传播之后x.grad将会是另外一个张量,其为关于某个标量值得梯度。

有时不需要构建这样的计算图,例如:在训练神经网络的过程中,通常不希望通过权重更新步骤进行反向传播。在这种情况下,可以使用torch.no_grad()上下文管理器来防止构造计算图——————(其实这些在之前的文章中都有详细的写过[我在这里],就不再赘述了)

下面例子中,使用Pytorch的Tensor和autograd来实现两层的神经网络,不需要再手动执行网络的反向传播:


#%%使用tensor和auto_grad实现两层神经网络
import torch
dtype=torch.float
device=torch.device('cpu')
# device=torch.device('cuda:0')#由GPU的可爱们享受吧,我不配,实验室没有给我高配置的电脑
# n是批量大小,d_in是输入维度
# h是隐藏的维度,d_out是输出维度
n,d_in,h,d_out=64,1000,100,10
# 创建随机输入和输出数据,requires_grad默认设置为False,表示不需要后期微分操作
x=torch.randn(n,d_in,device=device,dtype=dtype)
y=torch.randn(n,d_out,device=device,dtype=dtype)
# 随机初始化权重,requires_grad默认设置为True,表示想要计算其微分
w1=torch.randn(d_in,h,device=device,dtype=dtype,requires_grad=True)
w2=torch.randn(h,d_out,device=device,dtype=dtype,requires_grad=True)
learning_rate=1e-6
for i in range(500):
    #前向传播,使用tensor上的操作计算预测值y
    # 由于w1和w2的requirea_grad=True,涉及这两个张量的操作可以使pytorch构建计算图
    #即允许自动计算梯度,由于不需要手动实现反向传播,所以不需要保存中间值
    y_pred=x.mm(w1).clamp(min=0).mm(w2)
    
    #使用tensor中的操作计算损失值,loss.item()得到loss这个张量对应的数值
    loss=(y_pred-y).pow(2).sum()
    print(i,loss.item())
    #使用autograd计算反向传播,这个调用将计算loss对所有的requires_grad=True的tensor梯度,
    #调用之后,w1.grad和w2.grad将分别是loss对w1和w2的梯度张量
    loss.backward()
    #使用梯度下降更新权重,只想对w1和w2的值进行原地改变:不想更新构建计算图
    #所以使用torch.no_grad()阻止pytorch更新构建计算图
    with torch.no_grad():
        w1-=learning_rate*w1.grad
        w2-=learning_rate*w2.grad
    #反向传播后手动将梯度置零
    w1.grad.zero_()
    w2.grad.zero_()

运行结果

在这里插入图片描述

在这里插入图片描述

总结

本篇文章就到这里了,希望能够给你带来帮助,也希望您能够多多关注编程网的更多内容!

--结束END--

本文标题: Python Pytorch深度学习之核心小结

本文链接: https://www.lsjlt.com/news/155743.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Python Pytorch深度学习之核心小结
    目录一、Numpy实现网络二、Pytorch:Tensor三、自动求导1、PyTorch:Tensor和auto_grad总结Pytorch的核心是两个主要特征: 1.一个n维ten...
    99+
    2022-11-12
  • Python Pytorch深度学习之Tensors张量
    目录一、Tensor(张量)二、操作总结环境:Anaconda自带的编译器——Spyder 最近才开使用conda,发现conda 就是 yyds,爱啦~ 一、Tensor(张量)...
    99+
    2022-11-12
  • Python深度学习之Pytorch初步使用
    目录一、Tensor二、Pytorch如何创建张量2.1 创建张量2.2 tensor与ndarray的关系2.3 常用api2.4 常用方法三、数据类型3.1 获取数据类型四、tensor的其他操作4.1 相加4....
    99+
    2022-06-02
    Python Pytorch python深度学习
  • Python Pytorch深度学习之自动微分
    目录一、简介二、TENSOR三、梯度四、Example——雅克比向量积总结一、简介 antograd包是Pytorch中所有神经网络的核心。autograd为Tensor上的所有操作...
    99+
    2022-11-12
  • Python Pytorch深度学习之神经网络
    目录一、简介二、神经网络训练过程2、通过调用net.parameters()返回模型可训练的参数3、迭代整个输入4、调用反向传播5、计算损失值6、反向传播梯度7、更新神经网络参数总结...
    99+
    2022-11-12
  • Python深度学习之使用Pytorch搭建ShuffleNetv2
    一、model.py 1.1 Channel Shuffle def channel_shuffle(x: Tensor, groups: int) -> Tensor: batch_si...
    99+
    2022-06-02
    Python Pytorch搭建ShuffleNetv2 python ShuffleNetv2
  • Python Pytorch深度学习之图像分类器
    目录一、简介二、数据集三、训练一个图像分类器1、导入package吧2、归一化处理+贴标签吧3、先来康康训练集中的照片吧4、定义一个神经网络吧5、定义一个损失函数和优化器吧6、训练网...
    99+
    2022-11-12
  • Python Pytorch深度学习之数据加载和处理
    目录一、下载安装包二、下载数据集三、读取数据集四、编写一个函数看看图像和landmark五、数据集类六、数据可视化七、数据变换1、Function_Rescale2、Function...
    99+
    2022-11-12
  • Python深度学习pytorch神经网络块的网络之VGG
    目录VGG块VGG网络训练模型与芯片设计中工程师从放置晶体管到逻辑元件再到逻辑块的过程类似,神经网络结构的设计也逐渐变得更加抽象。研究人员开始从单个神经元的角度思考问题,发展到整个层...
    99+
    2022-11-12
  • Python 3.11 安装深度学习Pytorch开发环境
    Python 3.11 安装Pytorch开发环境 # 环境 Ubuntu 18.04, 选择环境 CUDA 11.6, 之前已安装驱动和CUDA,CUDNN环境 # 安装 Python3.11 sudo add-apt-repositor...
    99+
    2023-09-16
    python ubuntu pytorch
  • Python深度学习pytorch卷积神经网络LeNet
    目录LeNet模型训练不变性 在本节中,我们将介绍LeNet,它是最早发布的卷积神经网络之一。这个模型是由AT&T贝尔实验室的研究院Yann LeCun在1989年提出的(并...
    99+
    2022-11-12
  • python深度学习之多标签分类器及pytorch实现源码
    目录多标签分类器多标签分类器损失函数代码实现多标签分类器 多标签分类任务与多分类任务有所不同,多分类任务是将一个实例分到某个类别中,多标签分类任务是将某个实例分到多个类别中。多标签分...
    99+
    2022-11-13
  • Pytorch深度学习之实现病虫害图像分类
    目录一、pytorch框架1.1、概念1.2、机器学习与深度学习的区别1.3、在python中导入pytorch成功截图二、数据集三、代码复现3.1、导入第三方库3.2、CNN代码3...
    99+
    2022-11-12
  • python学习之panda数据分析核心支持库
    前言 Python是一门实现数据可视化很好的语言,他们里面的很多库可以很好的画出图形,形象明了。 今天我们就来说说:Pandas数据分析核心支持库 初识Pandas: Pandas 是 Python 语言的一个扩展程...
    99+
    2022-06-02
    pandas python python的pandas库 python常用模块
  • Python深度学习pytorch神经网络汇聚层理解
    目录最大汇聚层和平均汇聚层填充和步幅多个通道我们的机器学习任务通常会跟全局图像的问题有关(例如,“图像是否包含一只猫呢?”),所以我们最后一层的神经元应该对整个输入的全局敏感。通过逐...
    99+
    2022-11-12
  • Python深度学习pytorch实现图像分类数据集
    目录读取数据集读取小批量整合所有组件目前广泛使用的图像分类数据集之一是MNIST数据集。如今,MNIST数据集更像是一个健全的检查,而不是一个基准。 为了提高难度,我们将在接下来的章...
    99+
    2022-11-12
  • python 进阶学习之python装饰器小结
    装饰器总结 什么是装饰器?处理函数的函数,加一个功能,但是不影响原来函数的内部结构生活中的例子:给手机加一个外壳,外壳保护了手机 装饰器有什么用?增强函数的功能 装饰器使用场景增加被...
    99+
    2022-11-12
  • Python深度学习pytorch神经网络Dropout应用详解解
    目录扰动的鲁棒性实践中的dropout简洁实现扰动的鲁棒性 在之前我们讨论权重衰减(L2​正则化)时看到的那样,参数的范数也代表了一种有用的简单性度量。简单性的另一个有用...
    99+
    2022-11-12
  • 深度学习小工程练习之tensorflow垃圾分类详解
    介绍 这是一个基于深度学习的垃圾分类小工程,用深度残差网络构建 软件架构 使用深度残差网络resnet50作为基石,在后续添加需要的层以适应不同的分类任务 模型的训...
    99+
    2022-11-12
  • Python深度学习理解pytorch神经网络批量归一化
    目录训练深层网络为什么要批量归一化层呢?批量归一化层全连接层卷积层预测过程中的批量归一化使用批量归一化层的LeNet简明实现争议训练深层神经网络是十分困难的,特别是在较短的实践内使他...
    99+
    2022-11-12
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作