首页 > 编程笔记 > Python笔记 阅读:10

PyTorch创建张量的多种方式(附带实例)

张量的工作是用数字的方式表示数据。例如,可以将图像表示为具有形状 [3, 224,224] 的张量,这意味着 [color_channels,height,width],因为在图像中有 3 个颜色通道(red, green, blue),高度为 224 像素,宽度为 224 像素。

在张量语言(用于描述张量的语言)中,张量有 3 个维度,分别是颜色通道、高度和宽度。

PyTorch创建张量

首先创建的是标量。标量是一个单一的数,又称零维张量。
>>> # Scalar
>>> scalar = torch.tensor(7)
>>> scalar
tensor(7)

可以使用 ndim 属性来检查张量的维数,代码如下:
>>> scalar.ndim
0

怎么从张量中检索数字呢?可以使用 item() 方法,代码如下:
>>> # Get the Python number within a tensor (only works with one-element tensors)
>>> scalar.item()
7
向量是一维张量,可以包含许多数字。

可以用一个向量 [3,2] 来描述房子里的 [卧室、浴室]。也可以用 [3,2,2] 来描述房子里的 [卧室、浴室、停车场]。

向量在其所能表示的内容上是灵活的:
>>> # Vector
>>> vector = torch.tensor([7, 7])
>>> vector
tensor([7, 7])
你认为它会有多少个维度?
>>> # Check the number of dimensions of vector
>>> vector.ndim
1
可以通过外部方括号([)的数量来判断 PyTorch 中张量的维数。

张量的另一个重要概念是它们的形状属性。形状告诉它们内部的元素是如何排列的。让我们看看向量的形状,代码如下:
>>> # Check shape of vector
>>> vector.shape
torch.Size([2])
上述代码返回 torch.Size([2]),这意味着向量具有 [2] 的形状。这是因为在方括号内放置了两个元素([7, 7])。

现在看一个矩阵,代码如下:
>>> # Matrix
>>> MATRIX = torch.tensor([[7, 8],
                   [9, 10]])
>>> MATRIX
tensor([[ 7,  8],
        [ 9, 10]])

矩阵和向量一样灵活,只是它们有一个额外的维度,代码如下:
>>> # Check number of dimensions
>>> MATRIX.ndim
2
矩阵有两个维度。你认为它会是什么形状?
>>> MATRIX.shape
torch.Size([2, 2])
得到了 torch.Size([2, 2]),因为 MATRIX 是两个元素深和两个元素宽。

创建一个张量:
>>> # Tensor
>>> TENSOR = torch.tensor([[[1, 2, 3],
              [3, 6, 9],
              [2, 4, 5]])
>>> TENSOR
tensor([[1, 2, 3],
        [3, 6, 9],
        [2, 4, 5]])
你认为它有多少维度?
>>> # Check number of dimensions for TENSOR
>>> TENSOR.ndim
3
检查它的形状:
>>> # Check shape of TENSOR
>>> TENSOR.shape
torch.Size([1, 3, 3])
维度从外到内。这意味着有一个 3×3 的 1 个维度。

PyTorch随机张量

当使用 PyTorch 构建机器学习模型时,很少会手动创建张量。相反,机器学习模型通常从大的随机数张量开始,并在处理数据时调整这些随机数,以更好地表示数据。

可以使用 torch.rand() 并传入 size 参数来完成此操作,代码如下:
>>> # Create a random tensor of size (3, 4)
>>> random_tensor = torch.rand(size=(3, 4))
>>> random_tensor, random_tensor.dtype
(tensor([[0.3631, 0.3493, 0.7014, 0.8026],
        [0.7313, 0.7560, 0.5939, 0.4873],
        [0.9999, 0.1685, 0.6585, 0.3015]]), torch.float32)

torch.rand() 的灵活性在于,可以将大小调整为我们想要的任何大小。例如,想要一个通用图像形状为 [224, 224, 3]([高度,宽度,颜色通道]) 的随机张量,代码如下:
>>> # Create a random tensor of size (224, 224, 3)
>>> random_image_size_tensor = torch.rand(size=(224, 224, 3))
>>> random_image_size_tensor.shape, random_image_size_tensor.ndim
(torch.Size([224, 224, 3]), 3)

PyTorch零和一填充张量

有时只想用零或一来填充张量。这种情况在做掩码时经常发生。

用 torch.zeros() 可以创建一个全是 0 的张量,代码如下:
>>> # Create a tensor of all zeros
>>> zeros = torch.zeros(size=(3, 4))
>>> zeros, zeros.dtype
(tensor([[0., 0., 0., 0.],
        [0., 0., 0., 0.],
        [0., 0., 0., 0.]]), torch.float32)

可以使用 torch.ones() 创建一个全是 1 的张量,代码如下:
>>> # Create a tensor of all ones
>>> ones = torch.ones(size=(3, 4))
>>> ones, ones.dtype
(tensor([[1., 1., 1., 1.],
        [1., 1., 1., 1.],
        [1., 1., 1., 1.]]), torch.float32)

PyTorch范围张量

有时可能需要一个数字范围,如 1~10 或 0~100。这时可以用 torch.arange(start,end, step)。
>>> # Create a range of values 0 to 10
>>> zero_to_ten = torch.arange(start=0, end=10, step=1)
>>> zero_to_ten
tensor([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])

有时,可能想要一个特定类型的张量与另一个张量具有相同的形状。例如,一个全零的张量,其形状与前一个张量相同。要做到这一点,可以使用 torch.zeros_like(input) 或 torch.ones_like(input),它们分别返回一个填充有与输入形状相同的 0 或 1 的张量,代码如下:
>>> # Can also create a tensor of zeros similar to another tensor
>>> ten_zeros = torch.zeros_like(input=zero_to_ten) # will have same shape
>>> ten_zeros
tensor([0, 0, 0, 0, 0, 0, 0, 0, 0, 0])

相关文章