[转] PyTorch 0.4新版本 升级指南 no_grad

2023-11-13

转自PyTorch 0.4新版本 升级指南,博主为ShellCollector

PyTorch 0.4新版本 升级指南

PyTorch 终于从0.3.1升级到0.4.0了, 首先引入眼帘的,是PyTorch官方对自己的描述的巨大变化.

PyTorch 0.3.1说:

PyTorch is a python package that provides two high-level features:

• Tensor computation (like numpy) with strong GPU acceleration

• Deep Neural Networks built on a tape-based autodiff system

而PyTorch 0.4.0说:

PyTorch is a python based scientific computing package targeted at two sets of audiences:

• A replacement for NumPy to use the power of GPUs

• a deep learning research platform that provides maximum flexibility and speed

本次升级, 只做了一件事情, 就是将Tensor 类和 Variable 类 合并, 这一合并, 解决掉了很多原来令人困扰的问题.

在旧版本, Variable和Tensor分离, Tensor主要是多维矩阵的封装, 而Variable类是计算图上的节点, 它对Tensor进行了进一步的封装.

所以, 在训练过程中, 一个必要的步骤就是, 把Tensor转成Variable以便在模型中运行; 运行完之后, 我们还要将Variable转成Tensor,甚至Numpy. 我们在写代码和读代码的时候, 看到了各种辅助函数, 比如下面就是我常用的辅助函数:

# 旧版本实现
import torch
 
# 从Tensor转换到Vairable
def to_var(x):
    if torch.cuda.is_available():
        x = x.cuda()
    return Variable(x)  
  
# 从CUDA Variable转换到Numpy
def to_np(x):
    return x.data.cpu().numpy()
     
for epoch in range(3):   # 训练3轮
   for step, (batch_x, batch_y) in enumerate(loader):  # 每一步
      # 把训练数据转成Variable
      batch_x, batch_y = to_var(batch_x), to_var(batch_y)
      pass

0.4.0, 我们就可以不用这么转化了

for epoch in range(3):   # 训练3轮
   for step, (batch_x, batch_y) in enumerate(loader):  # 每一步
       optimizer.zero_grad()
          # forward + backward + optimize
       outputs = net(batch_x)
       loss = criterion(outputs, batch_y)
       loss.backward()
       optimizer.step()
 
print('Finished Training')

好处当然很大, 但是我们更关心以下几个问题:

Variable没了, Variable 的功能怎么办?

1.requires_grad 标志怎么处理了?

requires_grad 在Variable中,用来标志一个Variable是否要求导(或者说,要不要放到计算图中), 合并之后,这个标志处理的?

2.volatile 标志怎么处理了?

volatile在Variable中,用来标志一个Variable是否要被计算图隔离出去, 合并之后, 这个标志怎么处理的?

3.data方法呢?

Variable中,都是将封装的Tensor数据存储在.data里, 现在Variable和Tensor合并了, .data怎么办?

4.张量和标量怎么统一?

在Tensor元素内部都是Python 标量类型, 而Variable都是Tensor 张量类型, 原本它们井水不犯河水, 但现在合并了, 怎么处理?

# 旧版 0.3.1
>>> import torch
>>> from torch.autograd import Variable
>>> a = torch.Tensor([1,2,3])
>>> a[0]  # 内部元素是Python 标量
1.0
>>> type(a[0]) # 类别是Python float
<class 'float'>
>>> b = Variable(a)
>>> b[0] # 内部元素是Tensor类型, 张量
Variable containing:
 1
[torch.FloatTensor of size 1]

合并之后的Tensor是什么样的?

5.合并之后, 新版本Tensor是什么类型?

回答如下

1. requires_grad 标志怎么处理了?
直接挂在Tensor类下

>>> import torch
>>> x = torch.ones(1)  
>>> x.requires_grad
False

2.volatile 标志怎么处理了?
弃用 , 但是做了一些替代, 比如torch.no_grad(), torch.set_grad_enabled(grad_mode)

>>> import torch
>>> x = torch.zeros(1, requires_grad=True)
>>> with torch.no_grad(): # 将y 从计算图中排除
...     y = x * 2
>>> y.requires_grad
False

3.data方法呢?
保留功能, 但建议替代为x.detach()

.data方法,本质上是给当前Tensor加一个新引用, 它们指向的内存都是一样的, 因此不安全 。

比如y = x.data(), 而x参与了计算图的运算, 那么, 如果你不小心修改了y的data, xdata也会跟着变, 然而反向传播是监听不到xdata变化的, 因此造成梯度计算错误。

y = x.detach()正如其名, 将返回一个不参与计算图的Tensor y, Tensor y 一旦试图改变修改自己的data, 会被语法检查和python解释器监测到, 并抛出错误。

4.张量和标量怎么统一?
新增0维张量(0-dimensional Tensor), 用以封装标量(scalar), 将张量(Tensor), 标量(Scalar)都统一成张量.

>>> import torch
>>> torch.tensor(3.1416)         # 创建标量
tensor(3.1416)
>>> torch.tensor(3.1416).size()  # 其实是0维的张量
torch.Size([])
>>> torch.tensor([3]).size()     # 1维张量
torch.Size([1])

5.合并之后, 新版本Tensor是什么类型?
torch.Tensor类型, 但是, 详细类型需要进一步调用方法:

>>> import torch
>>> x = torch.DoubleTensor([1, 1, 1])
>>> type(x)  
<class 'torch.Tensor'>
>>> x.type() 
'torch.DoubleTensor'
>>> isinstance(x, torch.DoubleTensor)
True

旧版本的PyTorch, 你可以在类型上直接看出一个Tensor的基本信息, 比如devicecuda上, layoutsparse,dtypeFloat型的Tensor, 你可以:

# 0.3.1
>>> type(a)
<class 'torch.cuda.sparse.FloatTensor'>

由新版本, 所有的Tensor对外都是torch.Tensor类型, 上述的属性, 从类名转移到了Tensor的属性了。

  • torch.device 描述设备的位置, 比如torch.device('cuda'), torch.device('cpu')
>>> import torch
>>> cuda = torch.device('cuda') 
>>> cpu  = torch.device('cpu')
>>> a = torch.tensor([1,2,3], device=cuda)
>>> a.device
device(type='cuda', index=0)
>>> b = a.to(cpu) # 将数据从cuda copy 到 cpu
>>> b.device
device(type='cpu')
>>> type(a)  # type a 和 tpye b, 看不出谁在cuda谁在cpu
<class 'torch.Tensor'>
>>> type(b)
<class 'torch.Tensor'>

  • torch.layout
    torch.layout 是 一个表示Tensor数据在内存中样子的类, 默认torch.strided, 即稠密的存储在内存上, 靠stride来刻画tensor的维度. 目前还有一个实验版的对象torch.sparse_coo, 一种coo格式的稀疏存储方式, 但是目前API还不固定, 大家谨慎使用.

  • torch.dtype
    在这里插入图片描述

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

[转] PyTorch 0.4新版本 升级指南 no_grad 的相关文章

  • 在 PyTorch 中原生测量多类分类的 F1 分数

    我正在尝试在 PyTorch 中本地实现宏 F1 分数 F measure 而不是使用已经广泛使用的sklearn metrics f1 score https scikit learn org stable modules generat
  • 使用 KL 散度时,变分自动编码器为每个输入 mnist 图像提供相同的输出图像

    当不使用 KL 散度项时 VAE 几乎完美地重建 mnist 图像 但在提供随机噪声时无法正确生成新图像 当使用 KL 散度项时 VAE 在重建和生成图像时都会给出相同的奇怪输出 这是损失函数的 pytorch 代码 def loss fu
  • 在pytorch张量中过滤数据

    我有一个张量X like 0 1 0 5 1 0 0 1 2 0 我想实现一个名为的函数filter positive 它可以将正数据过滤成新的张量并返回原始张量的索引 例如 new tensor index filter positive
  • 从打包序列中获取每个序列的最后一项

    我试图通过 GRU 放置打包和填充的序列 并检索每个序列最后一项的输出 当然我的意思不是 1项目 但实际上是最后一个 未填充的项目 我们预先知道序列的长度 因此应该很容易为每个序列提取length 1 item 我尝试了以下方法 impor
  • 下载变压器模型以供离线使用

    我有一个训练有素的 Transformer NER 模型 我想在未连接到互联网的机器上使用它 加载此类模型时 当前会将缓存文件下载到 cache 文件夹 要离线加载并运行模型 需要将 cache 文件夹中的文件复制到离线机器上 然而 这些文
  • BatchNorm 动量约定 PyTorch

    Is the 批归一化动量约定 http pytorch org docs master modules torch nn modules batchnorm html 默认 0 1 与其他库一样正确 例如Tensorflow默认情况下似乎
  • Blenderbot 微调

    我一直在尝试微调 HuggingFace 的对话模型 Blendebot 我已经尝试过官方拥抱脸网站上给出的传统方法 该方法要求我们使用 trainer train 方法来完成此操作 我使用 compile 方法尝试了它 我尝试过使用 Py
  • 如何更新 PyTorch 中神经网络的参数?

    假设我想将神经网络的所有参数相乘PyTorch 继承自的类的实例torch nn Module http pytorch org docs master nn html torch nn Module by 0 9 我该怎么做呢 Let n
  • 将 Keras (Tensorflow) 卷积神经网络转换为 PyTorch 卷积网络?

    Keras 和 PyTorch 使用不同的参数进行填充 Keras 需要输入字符串 而 PyTorch 使用数字 有什么区别 如何将一个转换为另一个 哪些代码在任一框架中获得相同的结果 PyTorch 还采用参数 in channels o
  • 如何使用Python计算多类分割任务的dice系数?

    我想知道如何计算多类分割的骰子系数 这是计算二元分割任务的骰子系数的脚本 如何循环每个类并计算每个类的骰子 先感谢您 import numpy def dice coeff im1 im2 empty score 1 0 im1 numpy
  • Pytorch“展开”等价于 Tensorflow [重复]

    这个问题在这里已经有答案了 假设我有大小为 50 50 的灰度图像 在本例中批量大小为 2 并且我使用 Pytorch Unfold 函数 如下所示 import numpy as np from torch import nn from
  • Pytorch RuntimeError:“host_softmax”未针对“torch.cuda.LongTensor”实现

    我正在使用 pytorch 来训练模型 但是在计算交叉熵损失时我遇到了运行时错误 Traceback most recent call last File deparser py line 402 in
  • Pytorch .to('cuda') 或 .cuda() 不起作用并且卡住了

    我正在尝试做 pytorch 教程 当我尝试将他们的设备设置为 cuda 时 它不起作用并且我的代码运行被卡住 有关具体信息 我正在使用 conda 环境 蟒蛇3 7 3 火炬1 3 0 cuda 10 2 NVIDIA RTX2080TI
  • 如何将 35 类城市景观数据集转换为 19 类?

    以下是我的代码的一小段 使用它 我可以在城市景观数据集上训练名为 lolnet 的模型 但数据集包含 35 个类别 标签 0 34 imports trainloader torch utils data DataLoader datase
  • 尝试将 cuda 与 pytorch 一起使用时出现运行时错误 999

    我为我的 Geforce 2080 ti 安装了 Cuda 10 1 和最新的 Nvidia 驱动程序 我尝试运行一个基本脚本来测试 pytorch 是否正常工作 但出现以下错误 RuntimeError cuda runtime erro
  • 如何屏蔽 PyTorch 权重参数中的权重?

    我正在尝试在 PyTorch 中屏蔽 强制为零 特定权重值 我试图掩盖的权重是这样定义的def init class LSTM MASK nn Module def init self options inp dim super LSTM
  • 使用 CNN 和 pytorch 计算每个类别的准确度

    我可以使用此代码计算每个时期后的准确性 但是 我想最后计算每个班级的准确性 我怎样才能做到这一点 我有两个文件夹 train 和 val 每个文件夹有 7 个不同类别的 7 个文件夹 train 文件夹用于训练 否则 val 文件夹用于测试
  • 没有名为“torch”或“torch.C”的模块

    希望得到像我 5 这样的解释 因为我已经检查了所有相关答案 但没有一个有帮助 我已经安装了Python 我已经安装了Pycharm 我已经安装了Anaconda 我已经安装了 Microsoft Visual Studio 我有not安装了
  • 将 Pytorch 模型 .pth 转换为 onnx 模型

    我有一个预训练的模型 其格式为 pth 扩展名 我想将其转换为 Tensorflow protobuf 但我没有找到任何方法来做到这一点 我见过 onnx 可以将模型从 pytorch 转换为 onnx 然后从 onnx 转换为 Tenso
  • Pytorch LSTM:计算交叉熵损失的目标维度

    我一直在尝试在 Pytorch 中使用 LSTM LSTM 后跟自定义模型中的线性层 但在计算损失时出现以下错误 Assertion cur target gt 0 cur target lt n classes failed 我用以下函数

随机推荐

  • 冒泡排序--java(详解)

    对于一个数组 4 6 3 9 而言 首先进行第一轮 第一次比较 4 lt 6 所以不用交换两元素 数组不变为 4 6 3 9 第二次比较 6 gt 3 所以交换两元素 得到一个新数组为 4 3 6 9 第三次比较 6 lt 9 所以不用交换
  • 计算机维修培训教材,计算机芯片级维中心(芯片级维修培训教材)b.doc

    计算机芯片级维中心 芯片级维修培训教材 b 一 芯片的功能 作用及性能 具体内容 芯片组 南桥 北桥 BIOS芯片 时钟发生器IC RTC实时时钟 I O芯片 串口芯片75232 缓冲器244 245 门电路74系列 电阻R 电容C 二极管
  • Java笔记1:IntelliJ IDEA详细安装步骤

    安装IntelliJ IDEA 一 安装JDK 1 下载最新的jdk 这里下的是jdk 8u66 2 将jdk安装到默认的路径C Program Files Java目录下 二 安装IntelliJ IDEA 1 运行IntelliJ ID
  • Redis中SAVE和BGSAVE的区别

    Redis的这两个命令都是用于创建当前数据库的备份 因为Redis持久化选择RDB快照模式 所以Redis并不是实时的进行数据持久化 而是有一定的时间间隔 这个时候如果我们想要手动进行一次持久化 可以使用save或者bgsave命令 SAV
  • 如何使用sharemouse共享鼠标

    如何使用sharemouse共享鼠标 文章目录 如何使用sharemouse共享鼠标 1 Step 1 查看server IP 2 Step 2 配置Server的TCP UDP端口 设置密码 3 Step 3 client连接server
  • #ifndef/#define/#endif使用详解

    问题 想必很多人都看过 头文件中的 ifndef define endif 防止该头文件被重复引用 但是是否能理解 被重复引用 是什么意思 是不能在不同的两个文件中使用include来包含这个头文件吗 如果头文件被重复引用了 会产生什么后果
  • Linux系统安全——NAT(SNAT、DNAT)

    目录 NAT SNAT SNAT实际操作 DNAT DNAT实际操作 NAT NAT network address translation 支持PREROUTING INPUT OUTPUT POSTROUTING四个链 请求报文 修改源
  • magma测试与安装,使用(含docker配置)

    作者Ubuntu 18 04 Docker的配置与安装 Docker更改镜像源 docker下载ubuntu docker运行进入容器 通过Dockfile更改docker中ubuntu的apt源 docker容器中的ubuntu的配置 下
  • Macbook(M2 Air) 使用笔记/经验分享

    文章目录 如何选择配置 如何看待溢价 目前体验感受 目前玩过游戏 目前续航体验 如何选择配置 教育优惠时只看到了8 256版本 在开了下列软件时遇到了内存压力瓶颈 若您有生产力需求请16 512起步 IDEA 社区版用于Java Sprin
  • Java菜鸟教程 面向对象初步(一)

    最近 笔者初步接触了java中 面向对象 的概念 在此做一下简单的分享 简单的介绍 一开始的编程软件如c语言 是属于 面向过程 的编程软件 当事件比较简单 可以利用线性的思维解决的时候 面向过程 的语言和 面向对象 的语言都可以解决这些问题
  • linux socket的阻塞和非阻塞设置方法

    非阻塞IO 和阻塞IO 在网络编程中对于一个网络句柄会遇到阻塞IO 和非阻塞IO 的概念 这里对于这两种socket 先做一下说明 基本概念 阻塞IO socket 的阻塞模式意味着必须要做完IO 操作 包括错误 才会 返回 非阻塞IO 非
  • 用c语言打印*图案

    打印出以下图案 include
  • 安卓语音播报封装工具类

    封装类 import android annotation SuppressLint import android content Context import android speech tts TextToSpeech import
  • 【华为OD统一考试A卷

    华为OD统一考试A卷 B卷 新题库说明 2023年5月份 华为官方已经将的 2022 0223Q 1 2 3 4 统一修改为OD统一考试 A卷 和OD统一考试 B卷 你收到的链接上面会标注A卷还是B卷 请注意 根据反馈 目前大部分收到的都是
  • os.path.isdir()函数的作用和用法-判断是否为目录

    Python编程语言判断是否是目录 在Python编程语言中可以使用os path isdir 函数判断某一路径是否为目录 其函数原型如下所示 os path isdir path 其参数含义如下 path 要进行判断的路径 以下实例判断E
  • mysql知识系列:数据库名称带减号- 创建修改删除时

    说明 create database a b 会提示报错 ERROR 1064 42000 You have an error in your SQL syntax check the manual that corresponds to
  • 使用navicat for mysql连接远程mysql

    我是使用navicat的windows端 连接centos下mysql服务器 其实配过远程连接grant all privileges on to root identified by password 并在服务器控制台打开3306端口就可
  • 服务器操作系统使用相关要求,服务器操作系统的安全要求

    服务器操作系统的安全要求 内容精选 换一换 本文介绍创建裸金属服务器的几种方式 按照向导指引创建裸金属服务器是常见的方式 您可以灵活选择配置项 确保满足业务的需求 详细操作请参见创建裸金属服务器 如果您想快速获取一台裸金属服务器 可以创建快
  • 基于vue的swiper动画轮播图

    以前做轮播都是参照 https www swiper com cn 去做 使用最多的是https github com surmon china vue awesome swiper 这个插件但是 因为介绍不够详细经常性遇到各种问题 直到几
  • [转] PyTorch 0.4新版本 升级指南 no_grad

    转自PyTorch 0 4新版本 升级指南 博主为ShellCollector PyTorch 0 4新版本 升级指南 PyTorch 终于从0 3 1升级到0 4 0了 首先引入眼帘的 是PyTorch官方对自己的描述的巨大变化 PyTo