🚀 原文地址:https://pytorch.org/tutorials/beginner/basics/tensorqs_tutorial.html

张量是一种特殊的数据结构,与数组和矩阵非常相似。在 PyTorch 中,我们使用张量对模型的输入和输出以及模型的参数进行编码。

:::info 📝 备注
————————
张量其实是数学领域上的一种定义,而数组是计算机领域上的一种定义,两者本质上其实可以看成一个东西。 :::

Tensors 类似于 NumPy 的 ndarrays,只是张量可以在 GPU 或其他专用硬件上进行加速运算。如果你熟悉 ndarrays,就可以直接使用 Tensor API。如果没有,请按照下面的 API 快速演练进行操作。

  1. import torch
  2. import numpy as np

2. 初始化

Tensors 可以用各种方式初始化,请看以下示例:

2.1 直接使用数据构建

Tensors 可以直接使用数据来构建,它将自动进行数据类型的推断。

  1. data = [[1, 2],[3, 4]]
  2. x_data = torch.tensor(data)

2.2 使用 NumPy 数组构建

Tensors 可以使用 NumPy 数组进行构建。

  1. np_array = np.array(data)
  2. x_np = torch.from_numpy(np_array)

2.3 使用另外一个tensor构建

除非显式重写,否则新的 Tensor 将保留参数 tensor 的特性(维度、数据类型)。

  1. x_ones = torch.ones_like(x_data) # retains the properties of x_data
  2. print(f"Ones Tensor: \n {x_ones} \n")
  3. x_rand = torch.rand_like(x_data, dtype=torch.float) # overrides the datatype of x_data
  4. print(f"Random Tensor: \n {x_rand} \n")

注意:如果声明一个未初始化的矩阵,该矩阵在使用之前不会包含确定已知的值。当创建一个未初始化的矩阵时,分配内存中的值都将显示为初始值。

  • 构建一个未初始化的 🐮张量 - 图1 矩阵:
  1. import torch
  2. x = torch.empty(5, 3)
  3. print(x)

输出结果:

  1. tensor([[6.4158e+10, 9.3046e-43, 6.4150e+10],
  2. [9.3046e-43, 6.4149e+10, 9.3046e-43],
  3. [6.4149e+10, 9.3046e-43, 6.4152e+10],
  4. [9.3046e-43, 6.4152e+10, 9.3046e-43],
  5. [6.4146e+10, 9.3046e-43, 6.4146e+10]])

多次运行该段代码,输出结果每次是不相同的

  • 构建一个随机初始化的矩阵:
  1. import torch
  2. x = torch.rand(5, 3)
  3. print(x)

输出结果:

  1. tensor([[0.0333, 0.8159, 0.0170],
  2. [0.5828, 0.3363, 0.5798],
  3. [0.4928, 0.3689, 0.8265],
  4. [0.2678, 0.6598, 0.2170],
  5. [0.7417, 0.5393, 0.6702]])

torch.rand 返回一个符合均匀分布的随机数矩阵,随机数取值区间为 [0, 1)

  • 构建一个元素填充为 0,且数据类型为 tensor.long 的矩阵:
  1. import torch
  2. x = torch.zeros(5, 3, dtype=torch.long)
  3. print(x)

输出结果:

  1. tensor([[0, 0, 0],
  2. [0, 0, 0],
  3. [0, 0, 0],
  4. [0, 0, 0],
  5. [0, 0, 0]])
  • 直接从列表数据中构建一个 Tensor:
  1. import torch
  2. x = torch.tensor([5.1, 3])
  3. print(x)

输出结果:

  1. tensor([5.1000, 3.0000])
  • 根据已知的 tensor 来创建 tensor,以下方法会重复使用输入 tensor 的属性,例如数据类型。除非用户自己指定新的值:
  1. x = torch.rand(5, 3)
  2. y1 = x.new_ones(5, 3, dtype=torch.double)
  3. print(y1)
  4. y2 = torch.rand_like(x, dtype=torch.float)
  5. print(y2)
  6. print(y2.size())

输出结果:

  1. tensor([[1., 1., 1.],
  2. [1., 1., 1.],
  3. [1., 1., 1.],
  4. [1., 1., 1.],
  5. [1., 1., 1.]], dtype=torch.float64)
  6. tensor([[0.6728, 0.2809, 0.9017],
  7. [0.1962, 0.8225, 0.9839],
  8. [0.9622, 0.9088, 0.8063],
  9. [0.1374, 0.4724, 0.6598],
  10. [0.9871, 0.6245, 0.0878]])
  11. torch.Size([5, 3])

注意torch.Size 事实上是一个元组,所以它支持所有元组的操作。