Pytorch v0.4.0发布,首次支持Windows以及张量/变量合并

Song • 3191 次浏览 • 0 个回复 • 2018年04月25日

一、主要核心变化

更新了一些每天常用的最核心的功能。

主要变化和潜在变化:
  • TensorsVariables已合并
  • 一些操作现在返回0维(标量)Tensors
  • 弃用volatile标示
改进
  • 添加了dtypesdevicesNumpy风格的Tensor构造功能
  • 支持编写device-agnostic代码

我们编写了一个迁移指南,帮助您将代码转换为新的API和风格。如果您的代码为以前PyTorch版本中编写的代码,那么你可以阅读它。

1、合并Tensor和Variable类

torch.autograd.Variabletorch.Tensor现在类相同。确切地说,torch.Tensor能够像Variable一样自动求导; Variable继续像以前一样工作但返回一个torch.Tensor类型的对象。意味着你在代码中不再需要Variable包装器。

Tensor中的type()改变了

type()不再反映张量的数据类型。使用isinstance()x.type()替代:

>>> x = torch.DoubleTensor([1, 1, 1])
>>> print(type(x)) # was torch.DoubleTensor
<class 'torch.autograd.variable.Variable'>
>>> print(x.type())  # OK: 'torch.DoubleTensor'
'torch.DoubleTensor'
>>> print(isinstance(x, torch.DoubleTensor))  # OK: True
True
什么时候autograd开始自动求导?

equires_gradautograd的核心标志,现在是Tensors上的一个属性。让我们看看在代码中如何体现的。

autograd使用以前用于Variables的相同规则。当张量定义了requires_grad=True就可以自动求导了。例如,

>>> x = torch.ones(1)  # create a tensor with requires_grad=False (default)
>>> x.requires_grad
False
>>> y = torch.ones(1)  # another tensor with requires_grad=False
>>> z = x + y
>>> # both inputs have requires_grad=False. so does the output
>>> z.requires_grad
False
>>> # then autograd won't track this computation. let's verify!
>>> z.backward()
RuntimeError: element 0 of tensors does not require grad and does not have a grad_fn
>>>
>>> # now create a tensor with requires_grad=True
>>> w = torch.ones(1, requires_grad=True)
>>> w.requires_grad
True
>>> # add to the previous result that has require_grad=False
>>> total = w + z
>>> # the total sum now requires grad!
>>> total.requires_grad
True
>>> # autograd can compute the gradients as well
>>> total.backward()
>>> w.grad
tensor([ 1.])
>>> # and no computation is wasted to compute gradients for x, y and z, which don't require grad
>>> z.grad == x.grad == y.grad == None
True
操作requires_grad标志

除了直接设置属性之外,您可以使用my_tensor.requiresgrad(requires_grad=True)直接修改此标志,或者如上例所示,在创建时将其作为参数传递(默认为False),例如:

>>> existing_tensor.requires_grad_()
>>> existing_tensor.requires_grad
True
>>> my_tensor = torch.zeros(3, 4, requires_grad=True)
>>> my_tensor.requires_grad
True
关于.data

.data是从Variable中获取Tensor的方法。合并后,调用y = x.data仍然具有类似的语义。因此y将是与x共享同的Tensor相数据,x与计算历史无关,并具有requires_grad=False

但是,.data在某些情况下可能不安全。x.data上的任何变化都不会被autograd跟踪,并且x在向后传递中计算梯度将不正确。一种更安全的替代方法是使用x.detach(),它也返回一个Tensorrequires_grad=False共享数据的数据,但是如果x需要反向传播那就会使用autograd直接改变报告。

2、现在一些操作返回0维(标量)Tensors

以前,Tensor向量(1维张量)的索引返回一个Python数字,但是Variable的索引向量返回一个(1,)的向量!即tensor.sum()返回一个Python数字,但variable.sum()会返回一个大小为(1,)的向量。

幸运的是,此版本在PyTorch中引入了适当的标量(0维张量)支持!可以使用新torch.tensor函数来创建标量(稍后会对其进行更详细的解释;现在只需将它看作PyTorch中与numpy.array的等价物)。现在你可以做这样的事情:

>>> torch.tensor(3.1416)         # create a scalar directly
tensor(3.1416)
>>> torch.tensor(3.1416).size()  # scalar is 0-dimensional
torch.Size([])
>>> torch.tensor([3]).size()     # compare to a vector of size 1
torch.Size([1])
>>>
>>> vector = torch.arange(2, 6)  # this is a vector
>>> vector
tensor([ 2.,  3.,  4.,  5.])
>>> vector.size()
torch.Size([4])
>>> vector[3]                    # indexing into a vector gives a scalar
tensor(5.)
>>> vector[3].item()             # .item() gives the value as a Python number
5.0
>>> sum = torch.tensor([2, 3]).sum()
>>> sum
tensor(5)
>>> sum.size()
torch.Size([])

由于很多网站只是发布标题抢占排名,所以我也发布更新消息,有用作者时间有限,所以可能需要一点时间翻译完所有内容,欢迎继续关注


原创文章,转载请注明 :Pytorch v0.4.0发布,首次支持Windows以及张量/变量合并 - pytorch中文网
原文出处: https://ptorch.com/news/163.html
问题交流群 :168117787
提交评论
要回复文章请先登录注册
用户评论
  • 没有评论
Pytorch是什么?关于Pytorch! Windos使用CONDA/PIP安装官方pythorch 0.4.0/torchvision