机器学习初学者 07月21日 13:00
【深度学习】通透!十大 pytorch 核心操作全总结!!
index_new5.html
../../../zaker_core/zaker_tpl_static/wap/tpl_guoji1.html

 

本文深入总结了PyTorch中十类最常用且重要的操作,旨在帮助初学者和有经验的用户全面掌握PyTorch的核心功能。内容涵盖了张量创建与基本运算、自动求导机制、神经网络层的构建与管理、优化器的选择与应用、损失函数的运用、数据加载与预处理流程、模型保存与加载策略、学习率调整方法、模型评估指标以及GPU加速技巧。通过详细的介绍和示例代码,让读者能够更高效地利用PyTorch进行深度学习模型的开发与训练。

✨ **张量创建与基本操作**:PyTorch的核心数据结构是张量(Tensor),它类似于NumPy数组,但支持GPU加速和自动求导。文章详细介绍了从列表、NumPy数组创建张量,以及使用特定值(如全零、全一、随机数)和形状创建张量的方法。同时,涵盖了张量的索引、切片、形状改变(如`view`、`t()`)、数学运算(加法、矩阵乘法、广播)等基础操作,为后续的深度学习模型构建奠定基础。

⚙️ **自动求导(Autograd)**:PyTorch的自动求导机制是其强大之处,能够自动计算张量的梯度。通过设置张量的`requires_grad=True`属性,PyTorch会构建计算图,记录所有操作。用户可以通过调用`backward()`方法计算梯度,并通过`.grad`属性获取梯度值。此外,文章还介绍了`torch.no_grad()`上下文管理器和`.detach()`方法来阻止梯度追踪,以及如何利用自动求导进行模型优化,例如配合优化器更新模型参数。

🧱 **神经网络层与模块化**:`nn.Module`是PyTorch构建神经网络的基础。文章展示了如何通过继承`nn.Module`创建自定义的神经网络层(如包含线性层和激活函数的`SimpleLayer`),以及如何组合这些层构建更复杂的模型(如多层感知机MLP)。`nn.Module`支持模块嵌套和参数管理,并提供了保存、加载、设备移动等功能,使得模型构建更加灵活和易于组织。

📈 **优化器与损失函数**:文章详细介绍了PyTorch中常用的优化器,如SGD、Adam、RMSprop,以及如何设置学习率、清零梯度和执行梯度更新。同时,也列举了多种损失函数,包括MSELoss、CrossEntropyLoss、BCELoss等,适用于不同的任务类型,并强调了自定义损失函数的可行性。选择合适的优化器和损失函数是模型训练成功的关键。

📁 **数据加载、模型保存与学习率调整**:为了高效地进行模型训练,文章还介绍了PyTorch的数据加载与预处理流程,包括定义自定义数据集、使用DataLoader批量加载数据,以及`torchvision.transforms`进行数据增强。此外,还讲解了模型的保存与加载机制(保存`state_dict`或整个模型),以及多种学习率调整策略(如StepLR、CosineAnnealingLR、ReduceLROnPlateau),这些都是提升模型性能和训练效率的重要环节。

⚡ **模型评估与GPU加速**:文章最后强调了模型评估的重要性,介绍了如何将模型设为评估模式(`eval()`),使用`torch.no_grad()`进行推理,并计算准确率、精确度、召回率等性能指标。同时,详细阐述了利用GPU加速模型训练的步骤,包括检查GPU可用性、将模型和数据移动到GPU,以及多GPU并行训练的实现,这对于处理大规模数据集和复杂模型至关重要。

cos大壮 2025-07-15 12:03 浙江

总结了 PyTorch 最重要的十类操作,无论是初学者还是有基础的读者,都可以看看。

今天的内容,准备了两天。总结了 PyTorch 最重要的十类操作,无论是初学者还是有基础的读者,都可以看看。

当大家谈到PyTorch中最重要的操作时,以下是10个常用且重要的操作。

包括详细的介绍和示例代码。

张量创建和基本操作张量类似于 NumPy 的数组,但具有额外的功能,如自动求导(automatic differentiation)和 GPU 加速。

下面是在 PyTorch 中创建张量和进行基本操作的详细介绍。

1. 张量的创建从 Python 列表或 NumPy 数组创建张量:

import torch
import numpy as np
# 从列表创建张量
tensor_from_list = torch.tensor([123])
# 从 NumPy 数组创建张量
numpy_array = np.array([456])
tensor_from_numpy = torch.tensor(numpy_array)
使用特定值创建张量:

# 创建全零张量
zeros_tensor = torch.zeros((34))
# 创建全一张量
ones_tensor = torch.ones((22))
# 创建指定范围的张量
range_tensor = torch.arange(0102)
# 创建均匀分布的张量
uniform_tensor = torch.rand((33))
# 创建正态分布的张量
normal_tensor = torch.randn((22))
使用特定形状的张量:

# 创建未初始化的张量
uninitialized_tensor = torch.empty((22))
# 创建与现有张量相同形状的张量
like_tensor = torch.ones_like(zeros_tensor)
2. 张量的基本操作索引和切片:

# 获取张量中的特定元素
element = tensor_from_list[1]
# 切片操作
sliced_tensor = tensor_from_list[1:3]
张量的形状操作:

# 获取张量的形状
shape = tensor_from_list.shape
# 改变张量的形状
reshaped_tensor = tensor_from_list.view(13)
# 转置张量
transposed_tensor = tensor_from_list.t()
数学运算:

# 加法
sum_tensor = tensor_from_list + tensor_from_numpy
# 乘法
product_tensor = torch.matmul(zeros_tensor, ones_tensor)
# 广播操作
broadcasted_tensor = tensor_from_list * 2
这些功能使得 PyTorch 成为深度学习领域的一流选择,因为它提供了方便、灵活且高效的工具来处理张量和构建神经网络模型。

自动求导PyTorch中的自动求导(Autograd)允许用户自动计算张量的梯度,而无需手动编写反向传播算法。

Autograd的核心是计算图(computational graph),它记录了计算张量的操作,并在需要时能够生成梯度。

1. 张量的requires_grad属性在创建张量时,可以通过设置requires_grad属性为True来指示PyTorch跟踪对该张量的操作,从而构建计算图。

import torch
# 创建一个需要梯度的张量
x = torch.tensor([1.02.0], requires_grad=True)
2. 张量操作和计算图一旦设置了requires_grad=True,PyTorch将自动追踪对该张量的所有操作,构建一个计算图。这个计算图记录了张量之间的关系和操作。

y = x + 2
z = y * y * 3
out = z.mean()
上述例子中,yz 和 out 都是通过对 x 进行操作得到的新张量,这些操作构成了计算图。

3. 计算梯度一旦有了计算图,可以调用 backward() 方法计算梯度。梯度计算完成后,可以通过张量的 grad 属性获取梯度值。

out.backward()  # 计算梯度
# 获取梯度
print(x.grad)
4. 阻止梯度追踪在某些情况下,可能需要阻止PyTorch对某些操作的梯度追踪,可以使用 torch.no_grad() 上下文管理器或者在张量上使用 .detach() 方法。

with torch.no_grad():
    # 不追踪梯度的操作
    y = x + 2
# 或者
z = y.detach()
5. 使用with torch.autograd.set_grad_enabled(False):控制梯度计算在某些情况下,可能需要在一段代码中关闭梯度计算,可以使用上下文管理器 torch.autograd.set_grad_enabled

with torch.autograd.set_grad_enabled(False):
    # 在此处的操作不会被追踪,也不会计算梯度
    y = x + 2
6. 示例:使用自动求导进行优化import torch.optim as optim
# 定义一个变量并设置需要梯度
x = torch.tensor([1.02.0], requires_grad=True)
# 定义一个优化器(例如梯度下降)
optimizer = optim.SGD([x], lr=0.01)
# 在循环中执行优化步骤
for _ in range(100):
    y = x + 2
    loss = y[0] * y[1]  # 这里定义了一个简单的损失函数
    optimizer.zero_grad()  # 清零梯度
    loss.backward()  # 计算梯度
    optimizer.step()  # 更新参数
# 查看优化后的结果
print(x)
这个例子演示了如何使用自动求导来执行优化步骤,通过反向传播计算梯度并使用优化器更新参数。

总体而言,PyTorch中的自动求导提供了一个方便的工具,使得深度学习的模型训练变得更加简单和高效。

神经网络层在 PyTorch 中,nn.Module 是构建神经网络模型的基础类。nn.Module 提供了一个模块化和灵活的方式来组织复杂的神经网络结构。通过继承 nn.Module 类,可以创建自定义的神经网络层、模型或整个神经网络。

1. 创建一个简单的神经网络层import torch
import torch.nn as nn
class SimpleLayer(nn.Module):
    def __init__(self, input_size, output_size):
        super(SimpleLayer, self).__init__()
        self.linear = nn.Linear(input_size, output_size)
        self.relu = nn.ReLU()
    def forward(self, x):
        x = self.linear(x)
        x = self.relu(x)
        return x
上面的例子中,SimpleLayer 继承自 nn.Module,并定义了一个包含线性层(nn.Linear)和激活函数 ReLU 的简单神经网络层。forward 方法定义了前向传播的计算过程。

2. 构建更复杂的模型可以通过将多个神经网络层组合在一起构建更复杂的模型。下面是一个简单的多层感知机 (MLP) 的例子:

class MLP(nn.Module):
    def __init__(self, input_size, hidden_size, output_size):
        super(MLP, self).__init__()
        self.layer1 = SimpleLayer(input_size, hidden_size)
        self.layer2 = SimpleLayer(hidden_size, output_size)
    def forward(self, x):
        x = self.layer1(x)
        x = self.layer2(x)
        return x
3. 模块的嵌套和子模块nn.Module 支持嵌套和包含其他 nn.Module 实例,这有助于构建更复杂的神经网络。子模块会自动跟踪其参数和梯度。

class ComplexModel(nn.Module):
    def __init__(self):
        super(ComplexModel, self).__init__()
        self.layer1 = SimpleLayer(1020)
        self.layer2 = MLP(20305)
    def forward(self, x):
        x = self.layer1(x)
        x = self.layer2(x)
        return x
4. 访问模块的参数通过 named_parameters() 或 parameters() 方法可以访问模块中的所有参数。

model = ComplexModel()
for name, param in model.named_parameters():
    print(f"{name}{param.size()}")
5. 模型的保存和加载可以使用 torch.save 保存模型的状态字典,并使用 torch.load 加载模型。

# 保存模型
torch.save(model.state_dict(), 'model.pth')
# 加载模型
loaded_model = ComplexModel()
loaded_model.load_state_dict(torch.load('model.pth'))
6. 模型的设备移动可以使用 to 方法将模型移动到指定的设备,例如 GPU。

device = torch.device('cuda' if torch.cuda.is_available() else 'cpu')
model.to(device)
7. 自定义层和操作可以通过继承 nn.Module 类创建自定义的神经网络层和操作,例如自定义的激活函数、损失函数等。

这些功能使得 nn.Module 成为 PyTorch 中构建和组织神经网络的核心工具之一。通过模块化的设计,可以更灵活地搭建、训练和调整复杂的神经网络结构。

优化器在 PyTorch 中,优化器(Optimizer)是用于更新神经网络模型参数的工具。优化器基于模型参数的梯度信息来调整参数,从而最小化或最大化某个损失函数。PyTorch 提供了多种优化器,包括随机梯度下降(SGD)、Adam、RMSprop 等。

1. SGD 优化器随机梯度下降是最基本的优化算法之一。在 PyTorch 中,可以使用 torch.optim.SGD 类来创建 SGD 优化器。

import torch
import torch.optim as optim
# 定义模型和损失函数
model = ...
criterion = ...
# 定义 SGD 优化器
optimizer = optim.SGD(model.parameters(), lr=0.01)
2. Adam 优化器Adam 是一种自适应学习率的优化算法,它在训练深度学习模型时表现良好。在 PyTorch 中,可以使用 torch.optim.Adam 类来创建 Adam 优化器。

# 定义 Adam 优化器
optimizer = optim.Adam(model.parameters(), lr=0.001)
3. RMSprop 优化器RMSprop(Root Mean Square Propagation)是另一种自适应学习率的优化算法。在 PyTorch 中,可以使用 torch.optim.RMSprop 类来创建 RMSprop 优化器。

# 定义 RMSprop 优化器
optimizer = optim.RMSprop(model.parameters(), lr=0.001)
4. 设置学习率可以通过 lr 参数来设置优化器的学习率。

optimizer = optim.SGD(model.parameters(), lr=0.01)
5. 梯度清零在每个训练步骤之前,通常需要清零梯度。可以使用 zero_grad() 方法来实现。

optimizer.zero_grad()
6. 梯度更新使用优化器的 step() 方法来更新模型参数。

loss.backward()  # 计算梯度
optimizer.step()  # 更新参数
7. 动态调整学习率PyTorch 提供了一些学习率调整策略,如学习率衰减、余弦退火等。可以使用 torch.optim.lr_scheduler 模块来实现。

from torch.optim import lr_scheduler
# 创建学习率衰减策略
scheduler = lr_scheduler.StepLR(optimizer, step_size=5, gamma=0.1)
# 在训练循环中使用
for epoch in range(num_epochs):
    # 训练模型
    ...
    # 更新学习率
    scheduler.step()
8. 自定义优化器可以通过继承 torch.optim.Optimizer 类来创建自定义的优化器。

class CustomOptimizer(optim.Optimizer):
    def __init__(self, params, lr=0.01):
        defaults = dict(lr=lr)
        super(CustomOptimizer, self).__init__(params, defaults)
    def step(self, closure=None):
        # 自定义的优化步骤
        ...
优化器是深度学习训练过程中关键的组件之一,选择适当的优化器和学习率策略对于模型的性能至关重要。PyTorch 提供了丰富的优化器和学习率调整工具,使得用户能够根据具体问题选择合适的训练策略。

损失函数(Loss Function)损失函数(Loss Function)用于度量模型输出与真实标签之间的差异,是训练神经网络时优化的目标。

PyTorch 提供了多种损失函数,适用于不同类型的任务,如分类、回归等。

1. 均方误差损失(Mean Squared Error, MSE)均方误差是回归任务中常用的损失函数,计算模型输出与真实标签之间的平方差的平均值。

import torch.nn as nn
criterion = nn.MSELoss()
2. 交叉熵损失(Cross-Entropy Loss)交叉熵损失是分类任务中常用的损失函数,适用于多类别分类问题。

criterion = nn.CrossEntropyLoss()
3. 二元交叉熵损失(Binary Cross-Entropy Loss)二元交叉熵损失通常用于二分类问题,其中每个样本属于两个类别之一。

criterion = nn.BCELoss()
4. 二元交叉熵损失(带权重)可以为每个类别设置不同的权重,以处理类别不平衡的问题。

weights = torch.tensor([weight_class_0, weight_class_1])
criterion = nn.BCEWithLogitsLoss(pos_weight=weights)
5. K-L 散度损失(Kullback-Leibler Divergence Loss)适用于度量两个概率分布之间的差异,通常用于生成对抗网络(GANs)。

criterion = nn.KLDivLoss()
6. 三元组损失(Triplet Margin Loss)在训练人脸识别等任务时,可以使用三元组损失来确保相同类别样本之间的距离小于不同类别样本之间的距离。

from torch.nn.functional import triplet_margin_loss
criterion = triplet_margin_loss
7. 自定义损失函数可以通过继承 nn.Module 类创建自定义的损失函数,实现自定义的损失计算逻辑。

import torch
class CustomLoss(nn.Module):
    def __init__(self, weight):
        super(CustomLoss, self).__init__()
        self.weight = weight
    def forward(self, output, target):
        loss = torch.mean((output - target) ** 2)
        return self.weight * loss
8. 使用损失函数进行训练在训练循环中,通过计算模型输出与真实标签的损失,并调用反向传播和优化器更新参数来训练模型。

output = model(inputs)
loss = criterion(output, labels)
optimizer.zero_grad()
loss.backward()
optimizer.step()
选择适当的损失函数取决于任务类型和数据特性。通常,可以根据任务的性质和输出的特点选择合适的损失函数。

数据加载与预处理在 PyTorch 中,数据加载与预处理是深度学习中非常重要的一部分,它涉及到将原始数据加载到模型中并进行适当的预处理,以便用于训练和测试。PyTorch 提供了 torch.utils.data 模块来实现数据加载和预处理,同时可以使用 torchvision 提供的一些工具进行常见的图像处理。

1. 数据集的定义在 PyTorch 中,通常通过创建一个自定义的数据集类来加载数据。自定义数据集需要继承自 torch.utils.data.Dataset,并实现 __len__ 和 __getitem__ 方法。

from torch.utils.data import Dataset
class CustomDataset(Dataset):
    def __init__(self, data, labels, transform=None):
        self.data = data
        self.labels = labels
        self.transform = transform
    def __len__(self):
        return len(self.data)
    def __getitem__(self, idx):
        sample = {'data': self.data[idx], 'label': self.labels[idx]}
        if self.transform:
            sample = self.transform(sample)
        return sample
2. 数据加载器数据加载器是 PyTorch 中用于批量加载数据的工具。通过创建一个数据加载器,可以方便地在模型训练中迭代地获取批量数据。

from torch.utils.data import DataLoader
# 创建数据集
dataset = CustomDataset(data, labels, transform=...)
# 创建数据加载器
dataloader = DataLoader(dataset, batch_size=64, shuffle=True)
3. 预处理与转换可以使用 torchvision.transforms 中的预处理函数对数据进行常见的预处理,例如缩放、裁剪、旋转等。

from torchvision import transforms
# 定义转换
transform = transforms.Compose([
    transforms.Resize((256256)),
    transforms.RandomCrop((224224)),
    transforms.RandomHorizontalFlip(),
    transforms.ToTensor(),
    transforms.Normalize(mean=[0.50.50.5], std=[0.50.50.5])
])
# 将转换应用于数据集
dataset = CustomDataset(data, labels, transform=transform)
4. 使用预训练模型如果使用了预训练的模型,可能需要采用与训练时相同的预处理方式。torchvision.transforms 中也提供了用于预训练模型的一些标准预处理方法。

from torchvision import transforms
# 使用 ImageNet 预训练模型的标准化参数
preprocess = transforms.Compose([
    transforms.Resize(256),
    transforms.CenterCrop(224),
    transforms.ToTensor(),
    transforms.Normalize(mean=[0.4850.4560.406], std=[0.2290.2240.225])
])
5. 数据加载与迭代通过数据加载器,可以在训练循环中方便地迭代加载批量的数据。

for batch in dataloader:
    inputs, labels = batch['data'], batch['label']
    # 进行模型训练
6. 使用预训练模型当使用预训练模型时,通常需要使用与预训练时相同的数据预处理方式。torchvision.transforms 中提供了一些用于预训练模型的标准预处理方法。

from torchvision import transforms
# 使用 ImageNet 预训练模型的标准化参数
preprocess = transforms.Compose([
    transforms.Resize(256),
    transforms.CenterCrop(224),
    transforms.ToTensor(),
    transforms.Normalize(mean=[0.4850.4560.406], std=[0.2290.2240.225])
])
这些步骤提供了一个基本的数据加载与预处理的框架。根据实际问题和数据特点,可能需要进行更复杂的数据处理。

模型保存与加载在 PyTorch 中,模型的保存与加载是训练深度学习模型中重要的一部分。模型的保存使得可以在训练过程中保存中间结果或在训练结束后保存最终模型,而模型的加载则允许在其他地方或其他时间使用已经训练好的模型。

1. 模型的保存在 PyTorch 中,可以使用 torch.save 函数保存模型的状态字典(state_dict)或整个模型。状态字典包含了模型的参数和其他相关信息。

import torch
import torch.nn as nn
# 定义模型
class SimpleModel(nn.Module):
    def __init__(self):
        super(SimpleModel, self).__init__()
        self.fc = nn.Linear(101)
model = SimpleModel()
# 保存模型的状态字典
torch.save(model.state_dict(), 'model_state.pth')
# 保存整个模型(包括结构和参数)
torch.save(model, 'model.pth')
2. 模型的加载使用 torch.load 函数加载模型的状态字典或整个模型。

# 加载模型的状态字典
loaded_state_dict = torch.load('model_state.pth')
model.load_state_dict(loaded_state_dict)
# 加载整个模型
loaded_model = torch.load('model.pth')
3. 跨设备加载模型如果在训练时使用了 GPU,而在加载时想切换到 CPU,可以使用 map_location 参数。

# 在 CPU 上加载 GPU 上保存的模型
loaded_model = torch.load('model.pth', map_location=torch.device('cpu'))
4. 保存与加载模型的结构和参数在保存整个模型时,模型的结构和参数都会被保存。

# 保存整个模型(包括结构和参数)
torch.save(model, 'model.pth')
# 加载整个模型
loaded_model = torch.load('model.pth')
5. 保存与加载模型的结构如果只想保存和加载模型的结构而不包含参数,可以使用 torch.save 时设置 save_model_obj=False

# 保存模型结构
torch.save(model, 'model_structure.pth', save_model_obj=False)
# 加载模型结构
loaded_model_structure = torch.load('model_structure.pth')
6. 只保存和加载模型参数如果只想保存和加载模型参数而不包含模型结构,可以使用 torch.save 时设置 save_model_obj=False

# 保存模型参数
torch.save(model.state_dict(), 'model_parameters.pth')
# 加载模型参数
loaded_parameters = torch.load('model_parameters.pth')
model.load_state_dict(loaded_parameters)
以上是在 PyTorch 中保存与加载模型的基本方法。在实际应用中,还可以结合其他工具,如 torch.optim 优化器状态字典的保存与加载,以便在恢复训练时继续优化过程。

学习率调整在深度学习中,学习率调整是优化算法的关键部分之一。PyTorch 提供了 torch.optim.lr_scheduler 模块来实现各种学习率调整策略。

1. StepLR 学习率调整StepLR 是一种简单的学习率调整策略,每经过一定的步数,将学习率按照给定的因子进行衰减。

import torch.optim as optim
from torch.optim import lr_scheduler
# 定义优化器
optimizer = optim.SGD(model.parameters(), lr=0.01)
# 定义学习率调整策略
scheduler = lr_scheduler.StepLR(optimizer, step_size=5, gamma=0.1)
# 在训练循环中使用
for epoch in range(num_epochs):
    # 训练模型
    ...
    # 更新学习率
    scheduler.step()
2. MultiStepLR 学习率调整MultiStepLR 是在预定义的多个时间点降低学习率的策略。

scheduler = lr_scheduler.MultiStepLR(optimizer, milestones=[102030], gamma=0.1)
3. ExponentialLR 学习率调整ExponentialLR 对学习率进行指数衰减。

scheduler = lr_scheduler.ExponentialLR(optimizer, gamma=0.9)
4. CosineAnnealingLR 学习率调整CosineAnnealingLR 使用余弦退火函数来调整学习率。

scheduler = lr_scheduler.CosineAnnealingLR(optimizer, T_max=10)
5. LambdaLR 学习率调整LambdaLR 允许使用任意的学习率调整函数。

scheduler = lr_scheduler.LambdaLR(optimizer, lr_lambda=lambda epoch: 0.95 ** epoch)
6. ReduceLROnPlateau 学习率调整ReduceLROnPlateau 在验证集上监测指标,当指标不再提升时降低学习率。

scheduler = lr_scheduler.ReduceLROnPlateau(optimizer, mode='min', factor=0.1, patience=5, verbose=True)
7. 使用学习率调整器在训练循环中使用学习率调整器。

for epoch in range(num_epochs):
    # 训练模型
    ...
    # 更新学习率
    scheduler.step(validation_loss)  # 如果使用 ReduceLROnPlateau
8. 学习率调整的参数在学习率调整中,有一些参数是常用的:

optimizer: 优化器,可以通过 optim.SGDoptim.Adam 等创建。

step_size(对于 StepLR 和 MultiStepLR): 学习率衰减的步数。

gamma: 学习率衰减的因子。

milestones(对于 MultiStepLR): 多步学习率衰减的时间点。

T_max(对于 CosineAnnealingLR): 一个周期的迭代次数。

lr_lambda(对于 LambdaLR): 自定义学习率衰减函数。

mode(对于 ReduceLROnPlateau): 监测指标的模式,可以是 'min''max' 或 'auto'

选择适当的学习率调整策略对于模型的性能非常关键。在实践中,通常需要进行一些实验以确定最佳的学习率调整策略和参数。

模型评估模型评估是在训练之后对模型性能进行定量评估的过程。评估模型涉及到使用验证集或测试集上的数据进行推理,并计算模型在这些数据上的性能指标,如准确率、精确度、召回率等。

1. 设置模型为评估模式在进行模型评估之前,需要将模型切换到评估模式,即使用 eval() 方法。这会关闭 Dropout 等训练时使用的一些特定行为。

model.eval()
2. 使用验证集或测试集进行推理通过遍历验证集或测试集,使用模型进行推理。

model.eval()
with torch.no_grad():
    for inputs, labels in dataloader:
        outputs = model(inputs)
        # 进行后续处理...
3. 计算性能指标根据任务类型和需求,选择合适的性能指标进行计算。以下是一些常见的性能指标:

准确率(Accuracy):

correct = (predicted == labels).sum().item()
total = labels.size(0)
accuracy = correct / total
精确度(Precision):

from sklearn.metrics import precision_score
precision = precision_score(labels, predicted, average='weighted')
召回率(Recall):

from sklearn.metrics import recall_score
recall = recall_score(labels, predicted, average='weighted')
F1 分数(F1 Score):

from sklearn.metrics import f1_score
f1 = f1_score(labels, predicted, average='weighted')
4. 混淆矩阵(Confusion Matrix)混淆矩阵是一个很有用的工具,可以展示模型在每个类别上的性能。

from sklearn.metrics import confusion_matrix
conf_matrix = confusion_matrix(labels, predicted)
5. 模型性能可视化通过绘制 ROC 曲线、学习曲线等图表,可以更直观地了解模型的性能。

import matplotlib.pyplot as plt
# 绘制 ROC 曲线等
6. 完整的评估过程示例model.eval()
total_correct = 0
total_samples = 0
with torch.no_grad():
    for inputs, labels in dataloader:
        outputs = model(inputs)
        _, predicted = torch.max(outputs, 1)
        
        total_correct += (predicted == labels).sum().item()
        total_samples += labels.size(0)
accuracy = total_correct / total_samples
print(f'Accuracy: {accuracy}')
7. 注意事项在评估过程中,确保使用 torch.no_grad() 来关闭梯度计算,以减少内存使用和加速推理过程。

对于分类问题,使用 Softmax 函数获得类别概率,并选择概率最大的类别作为预测结果。

对于不同的任务(分类、回归、目标检测等),选择合适的性能指标进行评估。

以上是在 PyTorch 中进行模型评估的基本步骤。具体的评估过程会根据任务的性质和需求而有所不同。

GPU加速在 PyTorch 中,利用 GPU 加速是训练深度学习模型的关键步骤之一。PyTorch 提供了简单而灵活的方式,使用户能够方便地将模型和数据移动到 GPU 上进行加速。

1. 检查 GPU 是否可用在使用 GPU 加速之前,首先需要检查系统上是否有可用的 GPU 设备。

import torch
# 检查 GPU 是否可用
device = torch.device('cuda' if torch.cuda.is_available() else 'cpu')
print('Using device:', device)
2. 将模型移动到 GPU使用 .to() 方法将模型移动到 GPU 上。

model = MyModel()  # 自定义模型
model.to(device)
3. 将张量移动到 GPU同样地,使用 .to() 方法将张量移动到 GPU 上。

inputs, labels = data  # 假设 data 是从数据加载器中获取的一批数据
inputs, labels = inputs.to(device), labels.to(device)
4. 在 GPU 上执行前向传播和反向传播使用 GPU 上的模型进行前向传播和反向传播。

outputs = model(inputs)
loss = criterion(outputs, labels)
optimizer.zero_grad()
loss.backward()
optimizer.step()
5. 多 GPU 加速PyTorch 支持多 GPU 加速,可以使用 torch.nn.DataParallel 封装模型,使其能够并行在多个 GPU 上执行。

model = MyModel()
model = nn.DataParallel(model)
model.to(device)
6. 在 GPU 上保存和加载模型保存和加载模型时,可以选择将模型参数保存到或加载自 GPU。

# 保存模型到 GPU
torch.save(model.state_dict(), 'model.pth')
# 加载模型到 GPU
model.load_state_dict(torch.load('model.pth'))
model.to(device)
7. GPU 上的数据并行在使用多 GPU 进行数据并行训练时,可以使用 torch.nn.parallel.DistributedDataParallel

model = MyModel()
model = nn.parallel.DistributedDataParallel(model)
model.to(device)
8. 注意事项确保你的 PyTorch 版本支持 CUDA,并安装了与你的 GPU 驱动版本相匹配的 CUDA 版本。

模型和数据移动到 GPU 时,确保 GPU 上有足够的显存可用。

使用 torch.cuda.empty_cache() 可以释放一部分被 PyTorch 占用的 GPU 内存。

GPU 加速能够显著提高深度学习模型的训练速度,特别是对于复杂的模型和大规模的数据集。在实践中,GPU 的使用通常是深度学习项目中的标配。



阅读原文

跳转微信打开

Fish AI Reader

Fish AI Reader

AI辅助创作,多种专业模板,深度分析,高质量内容生成。从观点提取到深度思考,FishAI为您提供全方位的创作支持。新版本引入自定义参数,让您的创作更加个性化和精准。

FishAI

FishAI

鱼阅,AI 时代的下一个智能信息助手,助你摆脱信息焦虑

联系邮箱 441953276@qq.com

相关标签

PyTorch 深度学习 张量 自动求导 神经网络
相关文章