PyTorch 基础知识:开启你的深度学习之旅

161 阅读7分钟

欢迎来到 PyTorch 的世界,这是一个开源机器学习库,由 Facebook 的人工智能研究实验室 (FAIR) 开发,已迅速成为深度学习爱好者的首选工具。PyTorch 提供动态计算图、GPU 加速和丰富的生态系统,使其成为研究人员和开发人员钟爱的框架。在这篇博文中,我们将探索 PyTorch 的基础知识、它的重要性,并通过代码示例深入探讨几个基本概念。让我们开启您的深度学习之旅!

监督学习的计算图:

计算图是表示在神经网络中执行的操作序列的有向无环图 (DAG)。在监督学习中,这些图表有助于可视化数据流和操作,从而更容易理解、优化和调试模型。PyTorch 使用动态计算图,这意味着该图是在执行过程中即时构建的。这种灵活性允许在运行时更轻松地操作图形结构。

安装火炬:

安装 PyTorch 非常简单。根据您首选的包管理器和平台,您可以选择以下方法之一:

  1. 使用 pip(Python 包管理器):要使用 pip 安装 PyTorch,请打开终端或命令提示符并执行以下命令:

对于仅 CPU 版本:

pip install torch torchvision -f https://download.pytorch.org/whl /cpu/torch_stable.html

对于 GPU 版本(支持 CUDA):

pip 安装 torch torchvision -f https://download.pytorch.org/whl/cu111/torch_stable.html

注意:替换cu111为与您的设置相对应的正确 CUDA 版本(例如cu101,,cu110)。您可以通过访问PyTorch 官方网站并选择所需的配置来找到合适的 wheel 。

使用 conda(Anaconda 或 Miniconda 包管理器):要使用 conda 安装 PyTorch,请打开终端或命令提示符并执行以下命令:

对于仅 CPU 版本:

conda 安装 pytorch torchvision - c pytorch

对于 GPU 版本(支持 CUDA):

conda 安装 pytorch torchvision torchaudio - c pytorch - c conda - forge

注意:GPU 版本将根据您的系统配置自动安装具有 CUDA 支持的适当版本的 PyTorch。

有关基于您的操作系统和包管理器的更具体的安装说明,请访问PyTorch 官方网站并选择所需的配置。

请记住使用具有兼容版本的 Python 环境(推荐 Python 3.6 或更新版本)。为您的项目创建一个单独的虚拟环境以避免与其他包发生潜在冲突始终是一个好习惯。

在 PyTorch 框架中实现张量:

张量是多维数组,是 PyTorch 的基本构建块。它们支持高效的数学运算,并针对 GPU 计算进行了优化。要在 PyTorch 中创建张量,您可以使用以下代码片段:

进口手电筒
# 创建一个用零填充的 2x3 矩阵
zeros_tensor = torch.zeros(2, 3) 
print(zeros_tensor)# 创建一个用 1 填充的 2x3 矩阵
ones_tensor = torch.ones(2, 3) 
print(ones_tensor)# 创建一个带有随机值的 2x3 矩阵
random_tensor = torch.rand(2, 3) 
print(random_tensor)

比较激活函数:

激活函数将非线性引入神经网络,使其能够学习复杂的模式。一些流行的激活函数是:

  • 乙状结肠:torch.sigmoid(x)
  • ReLU(整流线性单元):torch.relu(x)
  • 漏 ReLU:torch.nn.functional.leaky_relu(x, negative_slope=0.01)
  • Tanh(双曲正切):torch.tanh(x)

比较损失函数:

损失函数衡量训练期间预测输出与实际输出(地面实况)之间的差异。PyTorch 中一些常见的损失函数是:

  • 均方误差 (MSE) 损失:torch.nn.MSELoss()
  • 交叉熵损失:torch.nn.CrossEntropyLoss()
  • 二元交叉熵损失:torch.nn.BCELoss()
  • L1损失:torch.nn.L1Loss()

构建神经网络训练器:

实现步骤和库函数:要在 PyTorch 中构建神经网络训练器,请按照以下步骤操作:

  • 使用定义你的神经网络模型torch.nn.Module
  • 选择一个优化器(例如torch.optim.SGD,,torch.optim.Adam
  • 选择损失函数(例如torch.nn.MSELosstorch.nn.CrossEntropyLoss
  • 加载和预处理数据集
  • 使用前向和后向传递训练模型
  • 在验证或测试数据集上评估模型

使用张量在 PyTorch 中建模神经网络:

下面是一个使用 PyTorch 的简单前馈神经网络示例:

python复制代码
import torch 
import torch.nn as nn 
import torch.optim as optim 

# 定义神经网络模型
类 SimpleNet (nn.Module): 
    def  __init__ ( self, input_size, hidden_​​size, output_size ): 
        super (SimpleNet, self).__init__() 
        self.fc1 = nn.Linear(input_size, hidden_​​size) 
        self.relu1 = nn.ReLU() 
        self.fc2 = nn.Linear(hidden_​​size, output_size) 

    def  forward ( self, x ): 
        x = self.fc1(x) 
        x = self.relu1(x) 
        x = self.fc2(x)
        return x 

# Hyperparameters
 input_size = 784
 hidden_​​size = 128
 output_size = 10
 learning_rate = 0.001
 num_epochs = 10 

# 创建SimpleNet模型实例
model = SimpleNet(input_size, hidden_​​size, output_size) 

# 定义损失函数和优化器
准则 = nn.CrossEntropyLoss( ) 
optimizer = optim.Adam(model.parameters(), lr=learning_rate) 

# 加载和预处理数据集(为简洁起见跳过)
# ... 

# 检查 GPU 是否可用
if torch.cuda.is_available(): 
    device = torch.device( "cuda" )
    打印( f"Using GPU: {torch.cuda.get_device_name( 0 )} " ) 
else : 
    device = torch.device( "cpu" ) 
    print ( "Using CPU" ) 

# 将模型移动到 GPU
 model.to(device) #在范围(num_epochs) 内训练模型:#

将数据移动到 GPU     inputs, labels = inputs.to(device), labels.to(device) # Forward pass     outputs = model(inputs)     loss = criterion(outputs , labels) # 向后传递    optimizer.zero_grad()     loss.backward()
 
    


    



    


    optimizer.step() 

    print ( f"Epoch [ {epoch+ 1 } / {num_epochs} ], Loss: {loss.item()} " ) 

# 在验证或测试数据集上评估模型(为简洁起见跳过)
# .. .

为碎片道歉。下面是使用 PyTorch 创建、训练和评估简单神经网络并在 GPU 上运行的完整代码片段:

python复制代码
进口火炬
进口火炬。nn 作为nn
导入手电筒。优化 为优化
# 定义神经网络模型
class SimpleNet(nn.Module): 
    def __init__(self, input_size, hidden_​​size, output_size): 
        super(SimpleNet, self).__init__() 
        self.fc1 = nn.Linear(input_size, hidden_​​size) 
        self. relu1 = nn.ReLU() 
        self.fc2 = nn.Linear(hidden_​​size, output_size)    def forward(self, x): 
        x = self.fc1(x) 
        x = self.relu1(x) 
        x = self.fc2(x)
        返回 x# 超参数
input_size = 784 
hidden_​​size = 128 
output_size = 10 
learning_rate = 0.001 
num_epochs = 10# 创建SimpleNet模型实例 model 
= SimpleNet(input_size, hidden_​​size, output_size)# 定义损失函数和优化器
criterion = nn.CrossEntropyLoss() 
optimizer = optim.Adam(model.parameters(), lr=learning_rate)# 加载和预处理数据集(为简洁起见跳过)
# ...# 检查 GPU 是否可用
if torch.cuda.is_available(): 
    device = torch.device("cuda") 
    print(f"Using GPU: {torch.cuda.get_device_name(0)}") 
else: 
    device = torch .device("cpu") 
    print("使用 CPU")# 将模型移动到 GPU 
model.to(device)
#在 range(num_epochs) 中训练模型: 
    # 将数据移动到 GPU 
    inputs, labels = inputs.to(device), labels.to(device)    # 正向传递
    outputs = model(inputs) 
    loss = criterion(outputs, labels)    # 向后传递
    optimizer.zero_grad() 
    loss.backward() 
    optimizer.step()    print(f"Epoch [{epoch+1}/{num_epochs}], 损失: {loss.item()}")# 在验证或测试数据集上评估模型(为简洁起见跳过)
# ...

此代码定义了一个简单的前馈神经网络,对其进行指定数量的训练,并在可用的 GPU 上运行它。请注意,数据集加载和预处理步骤以及评估步骤不包含在此代码段中。

使用 CUDA 的 GPU 加速:

CUDA(Compute Unified Device Architecture)是NVIDIA开发的并行计算平台和编程模型。它使开发人员能够利用 NVIDIA GPU 的强大功能进行通用计算,从而显着加快计算密集型任务的速度。

PyTorch 利用 CUDA 在 GPU 设备上执行张量运算,从而加快计算速度并缩短深度学习模型的执行时间。PyTorch 抽象掉了与 GPU 编程相关的大部分复杂性,使您可以轻松地在 GPU 上运行模型。

为了演示 PyTorch 如何利用 CUDA 来加速计算,让我们比较矩阵乘法在 CPU 和 GPU 上的执行时间:

导入火炬
导入时间
# 创建两个大小为 5000 x 5000 的随机矩阵
matrix1 = torch.rand(5000, 5000) 
matrix2 = torch.rand(5000, 5000)# 在CPU上执行矩阵乘法并
测量执行
时间cpu_time:.4f} 秒”)


# 检查 GPU 是否可用
if torch.cuda.is_available(): 
    # 将矩阵移动到 GPU 
    matrix1_gpu = matrix1.cuda() 
    matrix2_gpu = matrix2.cuda()    # 在GPU    上执行矩阵乘法
    并    测量
    执行
    时间gpu_time:.4f} seconds") else:     print("未找到 GPU。无法在 GPU 上执行矩阵乘法。")

在此示例中,我们首先创建两个大小为 5000 x 5000 的随机矩阵,并使用 CPU 执行矩阵乘法。然后我们检查 GPU 是否可用,如果可用,我们将矩阵移动到 GPU 并执行相同的矩阵乘法运算。测量并打印这两个操作的执行时间。

通常,您会观察到 GPU 执行时间比 CPU 执行时间要短得多,尤其是对于矩阵乘法等大规模计算。这种加速是由于 GPU 的大规模并行处理能力,它允许在大型张量上高效地执行操作。

通过利用 CUDA 和 GPU,PyTorch 可以显着加速深度学习工作负载,减少训练和推理时间,并实现更多实验和更快的模型开发。