【机器学习】PyTorch 使用教程
PyTorch 是一个开源的机器学习库,广泛用于计算机视觉和自然语言处理等领域。以下是一个简化的 PyTorch 使用教程,不采用分点或Markdown格式。
目录
一、概述
PyTorch 是一个开源的机器学习库,广泛用于计算机视觉和自然语言处理等领域。以下是一个简化的 PyTorch 使用教程,不采用分点或Markdown格式。
二、核心组件
Pytorch源码中所涉及的组件非常多,以下介绍部分常见的核心组件:
2.1 Tensor
张量是PyTorch中的基本数据结构,类似于NumPy数组。PyTorch的大部分计算和数据操作都是基于张量进行的。
2.2 Storage
Storage是一个底层的数据结构,它是Tensor的基础,与Tensor相比,Storage更底层,其直接负责了一个Tensor对象的内存管理。
2.3 Autograd
Autograd是PyTorch的自动微分引擎,用于自动计算张量的梯度,并在反向传播的过程中更新计算图中张量的值,它是Pytorch中所有神经网络优化的基础。
2.4 Module
nn.Module是PyTorch中构建神经网络的基类。通过继承nn.Module基类,可以定义自己的神经网络层、模型,并使用模块化的方式构建复杂的深度学习模型。
2.5 Optimizer
PyTorch提供了多种优化器,用于在深度学习模型中更新和调整参数以最小化损失函数。通过将需要优化的网络参数传入优化器,便可以在每一次反向传播过后利用得到的梯度优化网络参数。
2.6 DataLoader
在PyTorch中,DataLoader是一个用于加载数据集的实用工具,它能够自动进行数据的批处理、随机打乱数据、并行加载数据等操作,使得数据的预处理和加载变得更加高效和简单,它一般和Dataset类一起使用。
三、 PyTorch 的基本用法
首先,确保你安装了 PyTorch。你可以通过访问 PyTorch 官网获取安装指令,根据你的系统环境(如 Windows, macOS, Linux)和是否使用 GPU 支持进行安装。安装完成后,你可以开始编写 PyTorch 代码了。
3.1 基于 MNIST 数据集识别手写数字
这里,我们将通过一个简单的例子来展示 PyTorch 的基本用法:创建一个简单的神经网络来识别手写数字(基于 MNIST 数据集)。
import torch
import torch.nn as nn
import torch.optim as optim
from torchvision import datasets, transforms
from torch.utils.data import DataLoader
# 定义超参数
batch_size = 64
learning_rate = 0.01
epochs = 5
# 数据预处理
transform = transforms.Compose([
transforms.ToTensor(),
transforms.Normalize((0.5,), (0.5,))
])
# 下载和加载数据集
train_dataset = datasets.MNIST(root='./data', train=True, transform=transform, download=True)
train_loader = DataLoader(dataset=train_dataset, batch_size=batch_size, shuffle=True)
# 定义网络模型
class NeuralNet(nn.Module):
def __init__(self):
super(NeuralNet, self).__init__()
self.flatten = nn.Flatten()
self.linear_relu_stack = nn.Sequential(
nn.Linear(28*28, 512),
nn.ReLU(),
nn.Linear(512, 512),
nn.ReLU(),
nn.Linear(512, 10),
)
def forward(self, x):
x = self.flatten(x)
logits = self.linear_relu_stack(x)
return logits
model = NeuralNet()
# 定义损失函数和优化器
criterion = nn.CrossEntropyLoss()
optimizer = optim.SGD(model.parameters(), lr=learning_rate)
# 训练模型
for epoch in range(epochs):
for batch_idx, (data, target) in enumerate(train_loader):
# 前向传播
output = model(data)
loss = criterion(output, target)
# 反向传播和优化
optimizer.zero_grad()
loss.backward()
optimizer.step()
if batch_idx % 100 == 0:
print(f'Train Epoch: {epoch} [{batch_idx * len(data)}/{len(train_loader.dataset)} ({100. * batch_idx / len(train_loader):.0f}%)]\tLoss: {loss.item():.6f}')
# 注意:这里没有包括测试/验证集的加载和评估,以及模型保存和加载的代码。
# 实际应用中,你应该在训练集上训练模型,在验证集上评估模型,并保存最佳模型以便后续使用。
以上代码展示了使用 PyTorch 进行深度学习项目的基本流程:数据预处理、模型定义、损失函数和优化器的设置、训练循环等。你可以根据自己的需求调整模型结构、超参数等。
3.2 保存和加载模型
当然,我可以继续扩展上述的PyTorch示例,特别是加入模型评估的部分,以及在训练完成后保存和加载模型的功能。以下是扩展后的代码:
import torch
import torch.nn as nn
import torch.optim as optim
from torchvision import datasets, transforms
from torch.utils.data import DataLoader
# ... (之前的代码保持不变)
# 加载测试数据集
test_dataset = datasets.MNIST(root='./data', train=False, transform=transform, download=True)
test_loader = DataLoader(dataset=test_dataset, batch_size=batch_size, shuffle=False)
# 定义评估函数
def evaluate(model, data_loader):
model.eval() # 设置模型为评估模式
correct = 0
total = 0
with torch.no_grad(): # 在评估模式下关闭梯度计算
for data, target in data_loader:
output = model(data)
_, predicted = torch.max(output.data, 1)
total += target.size(0)
correct += (predicted == target).sum().item()
print(f'Accuracy of the network on the {len(data_loader.dataset)} test images: {100 * correct / total} %')
# 训练模型(如果之前已经训练过,可以注释掉这部分)
# ... (之前的训练循环代码)
# 评估模型
evaluate(model, test_loader)
# 保存模型
torch.save(model.state_dict(), 'mnist_model.pth')
# 加载模型
# 注意:这里我们重新实例化模型结构,然后加载之前保存的权重
model_loaded = NeuralNet()
model_loaded.load_state_dict(torch.load('mnist_model.pth'))
model_loaded.eval() # 确保模型在评估模式下
# 再次评估加载的模型(可选,用于验证加载的模型是否工作正常)
evaluate(model_loaded, test_loader)
在这段代码中,我添加了一个`evaluate`函数,它接受一个模型和数据加载器作为输入,并计算模型在给定数据上的准确率。然后,我展示了如何在训练结束后保存模型的状态字典(`state_dict`),并演示了如何加载这些权重到一个新的模型实例中,以便进行进一步的评估或预测。
请注意,在评估模型时,我们使用`model.eval()`将模型设置为评估模式,并通过`torch.no_grad()`上下文管理器来禁用梯度计算,这可以加快评估速度并减少内存消耗。在训练过程中,我们也需要确保模型处于训练模式(尽管在PyTorch中,模型默认就是训练模式,但明确调用`model.train()`可以作为一个好习惯)。然而,在上述示例中,我们并没有显式地调用`model.train()`,因为那已经是默认行为。
开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!
更多推荐
所有评论(0)