# Variable和Tensor合并后，PyTorch的代码要怎么改？

• Tensors/Variables 合并

• 支持零维（标量）张量

• 弃用 volatile 标志

• dtypes，devices 和 Numpy-style Tensor 创建函数

• 编写一些不依赖设备的代码

Tensor 中 type () 的变化

>>> x = torch.DoubleTensor([1, 1, 1])>>> print(type(x))  # was torch.DoubleTensor"<class 'torch.Tensor'>">>> print(x.type())  # OK: 'torch.DoubleTensor''torch.DoubleTensor'>>> print(isinstance(x, torch.DoubleTensor))  # OK: TrueTrue

﻿

>>> x = torch.ones(1)  # create a tensor with requires_grad=False (default)
False
>>> y = torch.ones(1)  # another tensor with requires_grad=False
>>> z = x + y
>>> # both inputs have requires_grad=False. so does the output
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
True
>>> total = w + z
>>> # the total sum now requires grad!
True
>>> total.backward()
tensor([ 1.])
>>> # and no computation is wasted to compute gradients for x, y and z, which don't require grad
True

﻿

.data 是从 Variable 中获取底层 Tensor 的主要方式。 合并后，调用 y = x.data 仍然具有相似的语义。因此 y 将是一个与 x 共享相同数据的 Tensor，并且 requires_grad = False，它与 x 的计算历史无关。

>>> 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
>>> mysum = torch.tensor([2, 3]).sum()
>>> mysum
tensor(5)
>>> mysum.size()
torch.Size([])

﻿﻿

dtypes，devices和Numpy式Tensor创建函数

• torch.dtype

﻿

• torch.device

torch.device 包含设备类型（'cpu'或'cuda'）及可选的设备序号（id）。它可以通过 torch.device（'{device_type}'） 或 torch.device（'{device_type}：{device_ordinal}'）来初始化所选设备。

• torch.layout

torch.layout 表示张量的数据布局。新版本中，torch.strided（密集张量）和torch.sparse_coo（带有 COO 格式的稀疏张量）均受支持。

﻿

>>> device = torch.device("cuda:1")
>>> x = torch.randn(3, 3, dtype=torch.float64, device=device)
tensor([[-0.6344,  0.8562, -1.2758],
[ 0.8414,  1.7962,  1.0589],
[-0.1369, -1.0462, -0.4373]], dtype=torch.float64, device='cuda:1')
>>> x.requires_grad  # default is False
False
True

torch.tensor(data, …)

torch.tensor 是新添加的张量创建方法之一。它像所有类型的数据一样排列，并将包含值复制到一个新的 Tensor 中。如前所述，PyTorch 中的 torch.tensor 等价于 NumPy 中的构造函数 numpy.array。与 torch.*tensor 方法不同的是，你也可以通过这种方式（单个 Python 数字在 torch.*tensor 方法中被视为大小）创建零维张量（也称为标量）。此外，如果没有给出 dtype 参数，它会根据给定的数据推断出合适的 dtype。这是从现有数据（如 Python 列表）创建张量的推荐方法。代码如下：

>>> cuda = torch.device("cuda")>>> torch.tensor([[1], [2], [3]], dtype=torch.half, device=cuda)tensor([[ 1],        [ 2],        [ 3]], device='cuda:0')>>> torch.tensor(1)               # scalartensor(1)>>> torch.tensor([1, 2.3]).dtype  # type inferecetorch.float32>>> torch.tensor([1, 2]).dtype    # type inferecetorch.int64

1. torch.*_like 输入一个 tensor 而不是形状。除非另有说明，它默认将返回一个与输入张量相同属性的张量。代码如下：

 >>> x = torch.randn(3, dtype=torch.float64)
>>> torch.zeros_like(x)
tensor([ 0.,  0.,  0.], dtype=torch.float64)
>>> torch.zeros_like(x, dtype=torch.int)
tensor([ 0,  0,  0], dtype=torch.int32)


2. tensor.new_ * 也可以创建与 tensor 具有相同属性的 tensor，但它需要指定一个形状参数：

 >>> x = torch.randn(3, dtype=torch.float64)
>>> x.new_ones(2)
tensor([ 1.,  1.], dtype=torch.float64)
>>> x.new_ones(4, dtype=torch.int)
tensor([ 1,  1,  1,  1], dtype=torch.int32)


• 张量的device属性将为所有张量提供 torch.device 属性（get_device 仅适用于 CUDA 张量）

• Tensors 和 Modules 的 to 方法可用于将对象轻松移动到不同的设备（而不必根据上下文信息调用 cpu() 或 cuda()）

# at beginning of the scriptdevice = torch.device("cuda:0" if torch.cuda.is_available() else "cpu")...# then whenever you get a new Tensor or Module# this won't copy if they are already on the desired deviceinput = data.to(device)model = MyModule(...).to(device)

0.3.1旧版本

model = MyRNN()
if use_cuda:
model = model.cuda()

# train
total_loss = 0
input, target = Variable(input), Variable(target)
hidden = Variable(torch.zeros(*h_shape))  # init hidden
if use_cuda:
input, target, hidden = input.cuda(), target.cuda(), hidden.cuda()
...  # get loss and optimize
total_loss += loss.data[0]

# evaluate
input = Variable(input, volatile=True)
if use_cuda:
...
...

0.4.0 新版本

﻿

# torch.device object used throughout this script
device = torch.device("cuda" if use_cuda else "cpu")
model = MyRNN().to(device)

# train
total_loss = 0
input, target = input.to(device), target.to(device)
hidden = input.new_zeros(*h_shape)  # has the same device & dtype as input
...  # get loss and optimize
total_loss += loss.item()           # get Python number from 1-element Tensor

# evaluate
with torch.no_grad():                   # operations inside don't track history
...

http://pytorch.org/2018/04/22/0_4_0-migration-guide.html

（转载声明：如需转载，请联系营长：微信1092722531）

AI科技大本营现招聘AI记者和资深编译，有意者请将简历投至：gulei@csdn.net，期待你的加入

AI科技大本营读者群（计算机视觉、机器学习、深度学习、NLP、Python、AI硬件、AI+金融、AI+PM方向）正在招募中，和你志同道合的小伙伴也在这里！关注AI科技大本营微信公众号，后台回复：读者群，添加营长请务必备注姓名，研究方向。

AI科技大本营公众号ID：rgznai100

☟☟☟点击 | 阅读原文 | 查看更多精彩内容

01-19 4018

03-22 7万+

10-30 3万+

02-26 89

07-31 3万+

07-30 5578

07-01 6282

07-25 909

04-28 1515

#### pytorch的基础操作：Tensor, Variable

©️2020 CSDN 皮肤主题: 大白 设计师: CSDN官方博客

1.余额是钱包充值的虚拟货币，按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载，可以购买VIP、C币套餐、付费专栏及课程。