2.1. 数据操作

image.png
image.png
image.png
image.png
首先,我们导入 torch

  1. import torch

张量表示由一个数值组成的数组,这个数组可能有多个维度。

  1. x = torch.arange(12)
  2. x
  3. tensor([ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11])

可以通过张量的 shape 属性来访问张量的形状 (沿每个轴的长度)。

  1. x.shape
  2. torch.Size([12])

如果只想知道张量中元素的总数,即形状的所有元素乘积,可以检查它的大小(size)

  1. x.numel()

要改变一个张量的形状而不改变元素数量和元素值,可以调用 reshape 函数

  1. X = x.reshape(3, 4)
  2. X
  3. tensor([[ 0, 1, 2, 3],
  4. [ 4, 5, 6, 7],
  5. [ 8, 9, 10, 11]])

张量在给出其他部分后可以自动计算出一个维度。我们可以通过在希望张量自动推断的维度放置-1来调用此功能。在上面的例子中,我们可以用x.reshape(-1,4)或x.reshape(3,-1)来取代x.reshape(3,4)
有时,我们希望使用全0、全1、其他常量或者从特定分布中随机采样的数字来初始化矩阵。我们可以创建一个形状为 (2, 3, 4) 的张量,其中所有元素都设置为0。

  1. torch.zeros((2, 3, 4))
  2. tensor([[[0., 0., 0., 0.],
  3. [0., 0., 0., 0.],
  4. [0., 0., 0., 0.]],
  5. [[0., 0., 0., 0.],
  6. [0., 0., 0., 0.],
  7. [0., 0., 0., 0.]]])

我们可以创建一个形状为(2,3,4)的张量,其中所有元素都设置为1

  1. torch.ones((2, 3, 4))

随机采样:创建一个形状为 (3, 4) 的张量。其中的每个元素都服从均值为0、标准差为1的标准高斯(正态)分布中随机采样。

  1. torch.randn(3,4)
  2. tensor([[ 2.1989, -1.7897, 0.1334, 0.3321],
  3. [-0.8310, -1.3844, -1.5919, 0.1396],
  4. [-0.3225, -1.4449, 1.1404, 1.0962]])

可以通过提供包含数值的 Python 列表(或嵌套列表)来为所需张量中的每个元素赋予确定值。在这里,最外层的列表对应于轴 0,内层的列表对应于轴 1。

  1. torch.tensor([[1,2,3],[2,3,4],[4,5,6]])
  2. tensor([[1, 2, 3],
  3. [2, 3, 4],
  4. [4, 5, 6]])

按元素运算

  1. x = torch.tensor([1.0, 2, 4, 8])
  2. y = torch.tensor([2, 2, 2, 2])
  3. x + y, x - y, x * y, x / y, x**y # **运算符是求幂运算
  4. torch.exp(x) # 求幂

把多个张量 连结(concatenate) 在一起,沿行(轴-0,形状的第一个元素)和按列(轴-1,形状的第二个元素)连结两个矩阵

  1. X = torch.arange(12, dtype=torch.float32).reshape((3, 4))
  2. Y = torch.tensor([[2.0, 1, 4, 3], [1, 2, 3, 4], [4, 3, 2, 1]])
  3. torch.cat((X, Y), dim=0), torch.cat((X, Y), dim=1)

通过 逻辑运算符 构建二元张量

  1. X == Y

广播机制

由于 a 和 b 分别是 3×1和 1×2矩阵,如果我们让它们相加,它们的形状不匹配。我们将两个矩阵广播为一个更大的 3×2 矩阵,如下所示:矩阵 a将复制列,矩阵 b将复制行,然后再按元素相加。

索引和切片