专栏首页专知不只是支持Windows, PyTorch 0.4新版本变动详解与升级指南

不只是支持Windows, PyTorch 0.4新版本变动详解与升级指南

【导读】今天大家比较关心的是PyTorch在GitHub发布0.4.0版本,专知成员Huaiwen详细讲解了PyTorch新版本的变动信息, 本次升级, 只做了一件事情, 就是把Tensor 类和 Variable 类 合并了, 且官方同时更新了API和Tutorials, 可以肯定, 以后的人不会再学0.3.1。专知成员Huaiwen也计划于今日更新一个系列的新版PyTorch简单上手, 希望大家持续关注。

专知成员Huaiwen以前推出一系列PyTorch教程:

【教程】专知-PyTorch手把手深度学习教程系列完整版

【干货】深度学习实验流程及PyTorch提供的解决方案

【干货】对抗自编码器PyTorch手把手实战系列

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

显然, 不断提升的功能和不断发展的社区, 给了PyTorch充足的底气.

本次升级, 只做了一件事情, 就是将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, x的data也会跟着变, 然而反向传播是监听不到x的data变化的, 因此造成梯度计算错误。

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的基本信息, 比如device在cuda上, layout是sparse,dtype是Float型的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

后续

回答完上述疑问, 我们也对新版本的PyTorch有了新的认识, 由于去除了Variable类, 且官方同时更新了API和Tutorials, 我们可以肯定, 以后的人不会再学0.3.1. 我计划于近日更新一个系列的新版PyTorch简单上手, 希望大家持续关注。

GitHub 发布地址:https://github.com/pytorch/pytorch/releases

PyTorch 官网:http://pytorch.org/

文章分享自微信公众号:
专知

本文参与 腾讯云自媒体分享计划 ,欢迎热爱写作的你一起参与!

如有侵权,请联系 cloudcommunity@tencent.com 删除。
登录 后参与评论
0 条评论

相关文章

  • 年度最大更新!PyTorch 0.4:完全改变API,官方支持Windows

    新智元
  • 新版 PyTorch 1.2 已发布:功能更多、兼容更全、操作更快!

    近日,PyTorch 社区又添入了「新」工具,包括了更新后的 PyTorch 1.2,torchvision 0.4,torchaudio 0.3 和 torc...

    AI研习社
  • Github 项目推荐 | 用 PyTorch 0.4 实现的 YoloV3

    该库 fork 自 @github/marvis 的 pytorch-yolo2,不过作者没有直接修改或者更新 marvis 的源文件,因为很多文件已经改了文件...

    AI研习社
  • 热点 | 年度重大更新:PyTorch0.4官方支持Windows,完全改变API

    昨天,PyTorch 官方 GitHub 发布 0.4.0 版本,大家心心念念的 Windows 支持终于到来!加入到深度学习的行列中来吧!

    灯塔大数据
  • 用Windows电脑训练深度学习模型?超详细配置教程来了

    本文将介绍在 Windows 计算机上配置深度学习环境的全过程,其中涉及安装所需的工具和驱动软件。出人意料的是,即便只是配置深度学习环境,任务也不轻松。你很有可...

    机器之心
  • 用Windows电脑训练深度学习模型?超详细配置教程来了

    本文将介绍在 Windows 计算机上配置深度学习环境的全过程,其中涉及安装所需的工具和驱动软件。出人意料的是,即便只是配置深度学习环境,任务也不轻松。你很有可...

    代码医生工作室
  • 终于!大家心心念念的PyTorch Windows官方支持来了

    这一次更新从 0.3.1 到 0.4.0 有着非常多的改进,最重要的就是官方支持 Windows 系统。在没有官方支持前,Windows 上安装 PyTorch...

    朱晓霞
  • 大意了| ONNXRUNTIME C++ 版本推理部署踩坑记录

    点击上方蓝字关注我们 微信公众号:OpenCV学堂 关注获取更多计算机视觉与深度学习知识 前言     之前我安装了CUDA10.0跟cuDnn7.6.5 然后...

    OpenCV学堂
  • 终于!大家心心念念的PyTorch Windows官方支持来了

    机器之心整理 参与:机器之心编辑部 五个小时前,PyTorch 官方 GitHub 发布 0.4.0 版本,大家心心念念的 Windows 支持终于来了。 Gi...

    机器之心
  • Keras vs PyTorch:谁是「第一」深度学习框架?

    值得一提的是,尽管在 4 月底 PyTorch 在 0.4 版本中已经加入了对于 Windows 的支持,但其对比 Keras 与 TensorFlow 在 W...

    机器之心
  • 新版PyTorch发布!新增TorchScript API,扩展ONNX导出……4大功能更新值得关注

    官方表示,和1.1版本相比,新版本在使用体验上又往前迈进了一大步。主要新增/改动的功能包括:

    量子位
  • PyTorch 的这些更新,你都知道吗?

    昱良
  • PyTorch 重磅更新,不只是支持 Windows

    这次版本的主要更新一些性能的优化,包括权衡内存计算,提供 Windows 支持,24个基础分布,变量及数据类型,零维张量,张量变量合并,支持 CuDNN 7.1...

    AI科技大本营
  • 谷歌TF2.0凌晨发布!“改变一切,力压PyTorch”

    Google深度学习科学家、Keras作者François Chollet热情的表示:“TensorFlow 2.0是一个来自未来的机器学习平台,它改变了一切”...

    OpenCV学堂
  • 不能更详细的PyTorch环境安装与配置

    PyTorch是Facebook团队于2017年1月发布的一个深度学习框架,虽然晚于TensorFlow、Keras等框架,但自发布之日起,其关注度就在不断上升...

    统计学家
  • 灵魂追问 | 教程那么多,你……看完了吗?

    机器之心
  • PyTorch更新了:支持Windows,新增零维张量

    PyTorch今天发布了v0.4.0版本,网友们反响非常热烈,甚至有人说:感觉就像提前过圣诞~

    量子位

扫码关注云+社区

领取腾讯云代金券