pytorch张量及其使用——初学者入门必看

PyTorch中的张量是一种多维数组,类似于NumPy的数组。与NumPy数组类似,张量可以用来表示向量、矩阵、图片等各种数据结构。PyTorch中的张量有以下几种常见的属性:

  • shape: 张量的形状,即各维度的大小。

  • dtype: 张量的数据类型,例如float32int64等。

  • device: 张量存放的设备,例如cpucuda

PyTorch中的张量支持很多操作,例如加减、乘除、矩阵乘法、索引、切片等。可以使用torch.Tensortorch.tensor函数创建一个张量,例如:

import torch

# 创建一个形状为(2, 3)的张量
x = torch.Tensor([[1, 2, 3], [4, 5, 6]])
print(x)
# 输出:
# tensor([[1., 2., 3.],
# [4., 5., 6.]])

# 创建一个全为0的形状为(3, 4)的张量
y = torch.zeros((3, 4))
print(y)
# 输出:
# tensor([[0., 0., 0., 0.],
# [0., 0., 0., 0.],
# [0., 0., 0., 0.]])

# 创建一个随机数的形状为(2, 2)的张量
z = torch.randn((2, 2))
print(z)
# 输出:
# tensor([[-1.7316, 0.5823],
# [-0.1171, -0.2952]])

# 创建一个与y形状相同的全为1的张量
ones = torch.ones_like(y)
print(ones)
# 输出:
# tensor([[1., 1., 1., 1.],
# [1., 1., 1., 1.],
# [1., 1., 1., 1.]])

PyTorch中遍历张量的方式类似于遍历Python列表,可以使用for循环来逐个遍历张量中的元素。例如:

import torch

# 创建一个形状为(2, 3)的张量
x = torch.Tensor([[1, 2, 3], [4, 5, 6]])

# 遍历张量中的元素
for i in range(x.shape[0]):
for j in range(x.shape[1]):
print(x[i, j])

当然,也可以使用PyTorch提供的一些函数来对张量进行遍历,例如torch.flatten可以将多维张量展开成一维张量,然后使用for循环遍历该张量中的元素。例如:

import torch

# 创建一个形状为(2, 3)的张量
x = torch.Tensor([[1, 2, 3], [4, 5, 6]])

# 将多维张量展开成一维张量
x_flat = torch.flatten(x) 

# 遍历该一维张量中的元素
for i in x_flat:
    print(i)

再举例如下:

import torch

x = torch.tensor([[1, 2], [3, 4]])
x_flat = torch.flatten(x)

for i in x_flat:
    print(i)


在这个例子中,我们首先创建一个 2 x 2 的张量 x,然后使用 torch.flatten() 方法将其展平成一个一维张量 x_flat。最后,我们使用 for 循环遍历张量 x_flat 中的所有元素,并打印它们的值。输出结果如下所示:

tensor(1)
tensor(2)
tensor(3)
tensor(4)

需要注意的是,在实际使用过程中,如果要对 PyTorch 张量中的元素进行操作,建议使用向量化的操作,而不是使用 Python 中的 for 循环。因为向量化的操作能够利用硬件加速,运算速度更快。

在 PyTorch 中,可以使用 tensor.flatten() 方法将多维张量展开成一维张量。该方法会将张量展平成一维,返回一个新的张量,不改变原始张量的形状和数据。以下是一个简单的示例:

import torch

# 创建一个 2 x 3 x 4 的三维张量
x = torch.randn(2, 3, 4)

# 将 x 展开成一维张量
y = x.flatten()

print("x shape:", x.shape) # 输出:x shape: torch.Size([2, 3, 4])
print("y shape:", y.shape) # 输出:y shape: torch.Size([24])

​在上面的代码中,我们首先创建了一个形状为 (2, 3, 4) 的三维张量 x,然后使用 flatten() 方法将其展开成一维张量 y。最后打印了原始张量 x 和展开后的张量 y 的形状。可以看到,展开后的张量 y 形状为 (24,),即原始张量中所有元素的个数。

torch.flatten() 是 PyTorch 中将多维张量展开成一维张量的方法之一。你可以使用它将一个张量展开成一个一维张量。下面是一个简单的例子:

import torch

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

x_flat = torch.flatten(x)

print(x)  # tensor([[1, 2],

          #         [3, 4]])

print(x_flat)  # tensor([1, 2, 3, 4])

在这个例子中,我们首先创建一个 2 x 2 的张量 x,然后使用 torch.flatten() 方法将其展平成一个一维张量 x_flat。展开后的张量 x_flat 包含了原始张量中所有的元素,而且这些元素按照原始张量中的顺序排列。

下面是一个简单的 PyTorch 张量向量化操作的示例:

import torch

# 创建一个 2x3 的张量
a = torch.tensor([[1, 2, 3], [4, 5, 6]])

# 创建一个 3x2 的张量
b = torch.tensor([[1, 2], [3, 4], [5, 6]])

# 张量相乘
c = torch.matmul(a, b)

print(c)

在这个例子中,我们首先创建了两个张量 ab,分别为一个 2x3 和一个 3x2 的矩阵。然后使用 PyTorch 提供的 torch.matmul 函数将两个矩阵相乘,将结果赋值给变量 c。最后打印出 c 的值。

需要注意的是,向量化操作通常比 Python 中的 for 循环操作更快,因此在实际使用中尽量使用向量化操作。此外,PyTorch 还提供了很多其他的向量化操作,比如张量的加、减、乘、除等运算,以及各种常用的数学函数(如 torch.exp()torch.log() 等),用户可以根据实际需求进行选择和使用。

下面是一个简单的示例,展示如何使用 PyTorch 完成两个张量向量化操作,求差,然后把各列分别求和求平均值

import torch

# 创建两个 3x4 的张量
a = torch.tensor([[1.0, 2.0, 3.0, 4.0], [5.0, 6.0, 7.0, 8.0], [9.0, 10.0, 11.0, 12.0]])
b = torch.tensor([[2.0, 3.0, 4.0, 5.0], [6.0, 7.0, 8.0, 9.0], [10.0, 11.0, 12.0, 13.0]])

# 两个张量相减
diff = a - b

# 分别求各列的和
col_sum = torch.sum(diff, dim=0)

# 求平均值
col_avg = torch.mean(col_sum)

print(col_avg)

在这个例子中,我们首先创建了两个 3x4 的张量 ab,然后将它们相减,得到了一个新的张量 diff。接着,使用 PyTorch 提供的 torch.sum 函数对 diff 沿着列的方向进行求和,得到一个长度为 4 的张量 col_sum,其中每个元素表示对应列的差的和。最后,使用 PyTorch 提供的 torch.mean 函数对 col_sum 进行求平均值,得到一个标量 col_avg,表示各列的差的和的平均值。最终打印出 col_avg 的值。

需要注意的是,向量化操作通常比 Python 中的 for 循环操作更快,因此在实际使用中尽量使用向量化操作。此外,PyTorch 还提供了很多其他的向量化操作,比如张量的加、减、乘、除等运算,以及各种常用的数学函数(如 torch.exp()torch.log() 等),用户可以根据实际需求进行选择和使用。

猜你喜欢

转载自blog.csdn.net/Fan0920/article/details/130083359
今日推荐