同步操作将从 OpenDocCN/pytorch-doc-zh 强制同步,此操作会覆盖自 Fork 仓库以来所做的任何修改,且无法恢复!!!
确定后同步将在后台操作,完成时将刷新页面,请耐心等待。
译者:@unknown
校对者:@bringtree
Tensors 在 PyTorch 中的操作方式 与 Torch 几乎完全相同.
用未初始化的内存创建一个大小为 (5 x 7) 的 tensor:
import torch
a = torch.FloatTensor(5, 7)
用 mean=0, var=1 的正态分布随机初始化一个tensor:
a = torch.randn(5, 7)
print(a)
print(a.size())
注解:
torch.Size
实际上是一个 tuple, 因此它支持相同的操作
第一个不同点在于 tensor 上的所有操作, 如果想要在 tensor 自身上进行的操作 (in-place) 就要加上一个 _
作为后缀. 例如, add
是一个 out-of-place 的 version ,而 add_
是一个 in-place 的 version .
a.fill_(3.5)
# a 的值现在变为 3.5
b = a.add(4.0)
# a 的值仍然是 3.5
# 返回的值 3.5 + 4.0 = 7.5 将作为b的值.
print(a, b)
还有一些像 narrow
的操作是没有 in-place version , 所以也就不存在 .narrow_
. 同样的, 也有像 fill_
的一些操作没有 out-of-place version . 因此, .fill
也同样不存在.
Tensors 是 zero-indexed (索引从零开始)这是另外一个不同点. (在 lua 中, tensors 是 one-indexed (索引从一开始))
b = a[0, 3] # 从 a 中选择第一行第四列的值.
Tensors 也可以用 Python 的切片索引
b = a[:, 3:5] # 从 a 中选择所有行中第四列和第五列的值.
接下来一个小的不同是所有的函数都不是 camelCase 了. 例如 indexAdd
现在被称为 index_add_
x = torch.ones(5, 5)
print(x)
z = torch.Tensor(5, 2)
z[:, 0] = 10
z[:, 1] = 100
print(z)
x.index_add_(1, torch.LongTensor([4, 0]), z)
print(x)
将 torch Tensor 转换为一个 numpy array, 反之亦然. Torch Tensor 和 numpy array 将会共用底层的内存, 改变其中一个, 另外一个也会随之改变.
a = torch.ones(5)
print(a)
b = a.numpy()
print(b)
a.add_(1)
print(a)
print(b) # 看一下 numpy array 值的变化
import numpy as np
a = np.ones(5)
b = torch.from_numpy(a)
np.add(a, 1, out=a)
print(a)
print(b) # 看一下通过改变 np array 来自动的改变 torch Tensor
除了 CharTensor 之外, 所有 CPU 上的 Tensors 支持转变为 NumPy 并且 转换回来.
CUDA Tensors 在 pytorch 中非常好用, 并且一个 CUDA tensor 从 CPU 转换到 GPU 仍将保持它底层的类型.
# 让我们在 CUDA 可用的时候运行这个单元
if torch.cuda.is_available():
# 创建一个 LongTensor 并且将其转换使用 GPU
# 的 torch.cuda.LongTensor 类型
a = torch.LongTensor(10).fill_(3).cuda()
print(type(a))
b = a.cpu()
# 将它转换到 CPU
# 类型变回 torch.LongTensor
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。