Pytorch学习笔记_1_tensor张量

Tensors

Tensors与Numpy中的ndarrays类似

torch.new_* 与 torch.*_like

前者创建的对象会保持原有的属性(如dtype),但shape不同

>>> x = torch.zeros(5, 3, dtype=torch.double)
>>> x.new_ones(2, 3)
tensor([[1., 1., 1.],
        [1., 1., 1.]], dtype=torch.float64)
>>> x.new_ones(2, 3, dtype=torch.long)
tensor([[1, 1, 1],
        [1, 1, 1]])

后者可以创建shape相同,属性不同的对象

>>> x = torch.zeros(5, 3, dtype=torch.double)
>>> torch.ones_like(x)
tensor([[1., 1., 1.],
        [1., 1., 1.],
        [1., 1., 1.],
        [1., 1., 1.],
        [1., 1., 1.]], dtype=torch.float64)
>>> torch.ones_like(x, dtype=torch.long)
tensor([[1, 1, 1],
        [1, 1, 1],
        [1, 1, 1],
        [1, 1, 1],
        [1, 1, 1]])

获得size

使用size方法与Numpy的shape属性返回的相同,张量也支持shape属性

>>> x = torch.zeros(5, 3, dtype=torch.double)
>>> x.size()
torch.Size([5, 3])

torch.Size实际上是一个tuple元组,因此它支持所有元组操作。

操作

加法

有多种操作方式:

  1. x + y
  2. torch.add(x, y)
  3. 提供输出tensor作为参数
result = torch.empty(5, 3)
torch.add(x, y, out=result)
  1. y.add_(x) 将x加到y中

任何 以 _ 结尾的操作都会用结果替换原变量. 例如: x.copy_(y), x.t_(), 都会改变 x.

索引

可以使用与NumPy索引方式相同的操作来进行对张量的操作,如x[:, 1]得到x的第1列

torch.view

可以改变张量的维度和大小,与Numpy的reshape类似

x = torch.randn(4, 4)
y = x.view(16)
z = x.view(-1, 8)  #  size -1 从其他维度推断
print(x.size(), y.size(), z.size())
# Output:
# torch.Size([4, 4]) torch.Size([16]) torch.Size([2, 8])

.item()

如果你有只有一个元素的张量,使用.item()来得到Python数据类型的数值

x = torch.randn(1)
print(x)
print(x.item())
# Output:
# tensor([-0.2368])
# -0.23680149018764496

NumPy转换

Torch Tensor与NumPy数组共享底层内存地址,修改一个会导致另一个的变化。

Tensor -> NumPy

a = torch.ones(5)
b = a.numpy()
print(b) # [1. 1. 1. 1. 1.]
a.add_(1)
print(a) # tensor([2., 2., 2., 2., 2.])
print(b) # [2., 2., 2., 2., 2.]

NumPy -> Tensor

a = np.ones(5)
b = torch.from_numpy(a)
np.add(a, 1, out=a)
print(a) # [2. 2. 2. 2. 2.]
print(b) # tensor([2., 2., 2., 2., 2.], dtype=torch.float64)

所有的 Tensor 类型默认都是基于CPU, CharTensor 类型不支持到 NumPy 的转换.

CUDA 张量

使用.to 方法 可以将Tensor移动到任何设备中

# is_available 函数判断是否有cuda可以使用
# ``torch.device``将张量移动到指定的设备中
if torch.cuda.is_available():
    device = torch.device("cuda")          # a CUDA 设备对象
    y = torch.ones_like(x, device=device)  # 直接从GPU创建张量
    x = x.to(device)                       # 或者直接使用``.to("cuda")``将张量移动到cuda中
    z = x + y
    print(z)
    print(z.to("cpu", torch.double))       # ``.to`` 也会对变量的类型做更改
Licensed under CC BY-NC-SA 4.0
comments powered by Disqus