Loading... # 张量(Tensors)和自动微分(Autograd)  # 张量(Tensors)和张量操作 欢迎回到我们深入学习PyTorch的课程!在上一节中,我们已经成功安装了PyTorch并设置了深度学习环境。现在,让我们深入了解深度学习的基础,即张量(Tensors)以及如何在PyTorch中进行张量操作。 ## 什么是张量? 在PyTorch中,张量是深度学习的核心数据结构。张量可以被看作是多维数组,类似于NumPy中的数组。它们可以包含标量、向量、矩阵和更高维的数据。张量是深度学习模型的基本构建块,所有的数据都被表示为张量。 ### 创建张量 让我们从如何创建张量开始。在PyTorch中,您可以使用`torch.Tensor()`构造函数来创建张量。例如,要创建一个形状为(2,3)的零张量,可以执行以下操作: ```python import torch # 创建一个2x3的零张量 tensor1 = torch.Tensor(2, 3) print(tensor1) ``` 这将创建一个2x3的零张量,并打印出来。您可以使用不同的构造函数创建包含随机数据的张量、全零张量或全一张量等。 ### 张量属性 每个张量都有一些重要的属性,例如形状(shape)、数据类型(dtype)和设备(device)。形状描述了张量的维度,数据类型定义了张量中元素的类型,设备表示张量存储在CPU还是GPU上。 ```python # 张量的形状、数据类型和设备 print(tensor1.shape) print(tensor1.dtype) print(tensor1.device) ``` ### 张量操作 PyTorch提供了丰富的张量操作,允许您执行各种数学运算和操作。以下是一些常见的张量操作: #### 张量加法 ```python # 张量加法 tensor2 = torch.Tensor(2, 3) # 创建另一个2x3的零张量 result = tensor1 + tensor2 print(result) ``` #### 张量乘法 ```python # 张量乘法 result = torch.matmul(tensor1, tensor2.T) # 矩阵相乘 print(result) ``` #### 张量索引 ```python # 张量索引 print(result[0, 1]) # 访问张量中的特定元素 ``` #### 改变张量形状 ```python # 改变张量形状 reshaped = result.view(3, 2) # 将形状改为3x2 print(reshaped) ``` 这些仅仅是张量操作的一小部分示例。PyTorch支持许多其他数学和逻辑运算,以及张量的逐元素操作、广播等高级功能。 ### 张量和NumPy的互操作 PyTorch和NumPy可以很好地集成在一起,您可以轻松地将NumPy数组转换为PyTorch张量,反之亦然。 ```python import numpy as np # 从NumPy数组创建张量 numpy_array = np.array([[1.0, 2.0, 3.0], [4.0, 5.0, 6.0]]) pytorch_tensor = torch.from_numpy(numpy_array) # 从张量创建NumPy数组 back_to_numpy = pytorch_tensor.numpy() ``` 这种无缝的互操作性使您能够在深度学习项目中充分利用NumPy和PyTorch的优势。 ## 什么是自动微分? 自动微分是深度学习中的一项关键技术,它使模型的训练变得更加高效和容易。在深度学习中,我们经常需要计算损失函数对模型参数的梯度,以便使用梯度下降等优化算法来更新参数。自动微分允许我们自动计算这些梯度,而无需手动编写梯度计算的代码。 在PyTorch中,Autograd是内置的自动微分引擎,它跟踪张量上的所有操作,并构 建一个计算图来记录这些操作。然后,它可以用于自动计算梯度,以便进行反向传播和优化。让我们来看一些Autograd的基本用法。 ## 张量的Autograd跟踪 在PyTorch中,默认情况下,张量是启用Autograd的。这意味着当您执行操作时,PyTorch会自动跟踪这些操作,并构建计算图。 ```python import torch # 创建一个张量并执行操作 x = torch.tensor(2.0, requires_grad=True) y = x ** 2 z = 2 * y + 3 print(z) ``` 在上面的示例中,我们创建了一个张量x,并执行了一些数学操作。PyTorch会自动构建计算图,以便跟踪操作和计算梯度。设置`requires_grad=True`参数将告诉PyTorch要跟踪梯度信息。 ## 计算梯度 一旦我们执行了一些操作并构建了计算图,我们可以使用`.backward()`方法来计算梯度。这将计算损失函数关于张量x的梯度。 ```python # 计算梯度 z.backward() # 打印梯度 print(x.grad) ``` 上述代码中,我们计算了z关于x的梯度,并通过`x.grad`访问梯度值。PyTorch自动计算了梯度,并将其存储在相应的张量属性中。 ## 非标量张量的梯度 自动微分不仅适用于标量张量(例如上述示例中的x),还适用于任何张量,包括具有多个元素的张量。当您计算非标量张量的梯度时,PyTorch将计算每个元素的梯度,并将其存储在相应的位置。 ```python import torch # 创建一个张量 x = torch.tensor([1.0, 2.0, 3.0], requires_grad=True) # 执行操作 y = x * 2 z = y.sum() # 计算梯度 z.backward() # 打印梯度 print(x.grad) ``` 上述代码中,我们创建了一个包含多个元素的张量x,并计算了y和z。最后,我们计算了z对x的梯度,并通过`x.grad`访问梯度值。 ## 防止梯度跟踪 有时,您可能希望防止某些操作被Autograd跟踪。您可以使用`torch.no_grad()`上下文管理器来实现这一点。 ```python import torch x = torch.tensor(2.0, requires_grad=True) # 在no_grad上下文中执行操作,不会被跟踪 with torch.no_grad(): y = x ** 2 # 打印梯度,将为None print(y.grad) ``` 在上述示例中,我们在`torch.no_grad()`上下文中执行了操作,因此y不会被Autograd跟踪,其梯度为None。 ## 清除梯度 有时,您可能需要清除张量的梯度信息,以便进行下一轮训练。您可以使用`zero_()`方法来将梯度设置为零。 ```python import torch x = torch.tensor(2.0, requires_grad=True) y = x ** 2 # 计算梯度 y.backward() print(x.grad) # 清除梯度 x.grad.zero_() # 打印清零后的梯度 print(x.grad) ``` 上述示例中,我们计算了梯度并使用`zero_()`方法将其清零。 ## 总结 在本节中,我们学习了深度学习的基础数据结构——张量,并探讨了如何在PyTorch中创建、操作和使用它们。张量是深度学习的核心,对于构建和训练深度学习模型至关重要。 Autograd是PyTorch中的一个强大工具,它使得梯度计算变得更加容易和高效。在深度学习中,梯度计算是模型训练的关键步骤,Autograd使这一过程变得无需手动编写复杂的梯度计算代码。 在下一节中,我们将开始学习如何构建神经网络模型,以便更好地理解如何使用PyTorch构建和训练深度学习模型。让我们继续前进吧! 最后修改:2024 年 09 月 02 日 © 允许规范转载 打赏 赞赏作者 支付宝微信 赞 如果觉得我的文章对你有用,请随意赞赏