楼主: 学习好帮手
14 0

PyTorch入门代码教程:从张量到神经网络 [推广有奖]

  • 0关注
  • 0粉丝

等待验证会员

学前班

80%

还不是VIP/贵宾

-

威望
0
论坛币
0 个
通用积分
0
学术水平
0 点
热心指数
0 点
信用等级
0 点
经验
30 点
帖子
2
精华
0
在线时间
0 小时
注册时间
2018-8-19
最后登录
2018-8-19

楼主
学习好帮手 发表于 2025-12-4 07:01:37 |AI写论文

+2 论坛币
k人 参与回答

经管之家送您一份

应届毕业生专属福利!

求职就业群
赵安豆老师微信:zhaoandou666

经管之家联合CDA

送您一个全额奖学金名额~ !

感谢您参与论坛问题回答

经管之家送您两个论坛币!

+2 论坛币

PyTorch 是一个由 Facebook 人工智能研究团队开发的开源深度学习框架,因其具备动态计算图机制和贴近 Python 编程习惯的直观接口而广受欢迎。无论你是从事深度学习研究的专业人员,还是刚刚入门的新手,PyTorch 都能提供灵活且高效的工具来构建、训练和调试神经网络模型。本文将从基础出发,系统性地介绍 PyTorch 的核心概念及其代码实现方式。

二、张量(Tensor)的基本操作

在 PyTorch 中,张量是整个框架的核心数据结构,其功能类似于 NumPy 中的 ndarray,但支持 GPU 加速运算,从而显著提升计算效率。

1. 张量的创建

import torch
import numpy as np

# 从列表创建张量
data = [[1, 2], [3, 4]]
x_data = torch.tensor(data)

# 从NumPy数组创建
np_array = np.array([[1, 2], [3, 4]])
tensor_from_np = torch.from_numpy(np_array)

# 创建特殊值张量
zeros_tensor = torch.zeros(2, 3)  # 2x3全零张量
ones_tensor = torch.ones(2, 3)   # 2x3全一张量
rand_tensor = torch.rand(2, 3)   # 2x3随机值张量(均匀分布)
randn_tensor = torch.randn(2, 3) # 2x3随机值张量(标准正态分布)

print("全零张量:\n", zeros_tensor)
print("随机张量:\n", rand_tensor)

2. 常见的张量操作

张量支持多种数学运算以及形状变换操作,例如加减乘除、矩阵乘法、reshape、转置等,便于进行复杂的数值处理。

# 创建示例张量
a = torch.tensor([1, 2, 3])
b = torch.tensor([4, 5, 6])

# 基本运算
c = a + b  # 或 torch.add(a, b)
d = a * b  # 元素级乘法
e = torch.matmul(a, b)  # 矩阵乘法

# 形状操作
x = torch.randn(4, 4)
y = x.view(16)  # 重塑为16元素向量
z = x.view(-1, 8)  # 自动推断维度

print("原始形状:", x.shape)
print("重塑后:", y.shape)
print("自动推断形状:", z.shape)

# 张量切片
tensor = torch.ones(5, 2)
print("第一行:", tensor[0])
print("第一列:", tensor[:, 0])

三、自动求导机制(Autograd)

PyTorch 的自动求导功能是实现神经网络反向传播的关键组件,能够自动追踪计算过程并计算梯度。

# 创建需要梯度追踪的张量
x = torch.tensor([2.0, 3.0], requires_grad=True)

# 定义计算
y = x ** 2
z = y.sum()

# 反向传播计算梯度
z.backward()

print("张量x:", x)
print("z对x的梯度:", x.grad)  # dy/dx = 2x = [4.0, 6.0]

在实际模型训练中,有时需要临时禁用或控制梯度的计算,以提高性能或实现特定逻辑。

# 临时禁用梯度追踪(用于模型评估)
with torch.no_grad():
    y = x * 2
    print("是否追踪梯度:", y.requires_grad)

# 从计算图中分离张量
detached_y = y.detach()
print("分离后是否追踪梯度:", detached_y.requires_grad)

四、神经网络模型的构建

PyTorch 提供了 torch.nn 模块用于搭建神经网络结构。通常通过继承 nn.Module 类来自定义模型架构。

?torch.nn?
?nn.Module?

1. 全连接网络定义示例

import torch.nn as nn

class SimpleNN(nn.Module):
    def __init__(self, input_size=10, hidden_size=5, output_size=2):
        super(SimpleNN, self).__init__()
        self.fc1 = nn.Linear(input_size, hidden_size)  # 输入层到隐藏层
        self.relu = nn.ReLU()                          # 激活函数
        self.fc2 = nn.Linear(hidden_size, output_size) # 隐藏层到输出层
    
    def forward(self, x):
        x = self.relu(self.fc1(x))
        x = self.fc2(x)
        return x

# 实例化模型
model = SimpleNN()
print(model)

2. 卷积神经网络的应用

针对图像识别类任务,可以使用卷积层构建 CNN 模型,有效提取空间特征。

def __init__(self):
        super(ConvNet, self).__init__()
        self.conv1 = nn.Conv2d(1, 32, kernel_size=3, stride=1, padding=1)
        self.conv2 = nn.Conv2d(32, 64, kernel_size=3, stride=1, padding=1)
        self.fc1 = nn.Linear(64 * 7 * 7, 128)
        self.fc2 = nn.Linear(128, 10)
        self.relu = nn.ReLU()
        self.pool = nn.MaxPool2d(2)
    
    def forward(self, x):
        x = self.relu(self.conv1(x))
        x = self.pool(x)
        x = self.relu(self.conv2(x))
        x = self.pool(x)
        x = x.view(-1, 64 * 7 * 7)  # 展平
        x = self.relu(self.fc1(x))
        x = self.fc2(x)
        return x

五、神经网络的训练流程

完整的训练过程包括损失函数的定义、优化器的选择,以及训练循环的编写。

1. 训练的基本步骤

import torch.optim as optim
from torch.utils.data import DataLoader, TensorDataset

# 准备模拟数据
X = torch.randn(100, 10)  # 100个样本,10个特征
y = torch.randint(0, 2, (100,))  # 二进制标签

# 创建数据集和数据加载器
dataset = TensorDataset(X, y)
dataloader = DataLoader(dataset, batch_size=32, shuffle=True)

# 初始化模型、损失函数和优化器
model = SimpleNN()
criterion = nn.CrossEntropyLoss()  # 交叉熵损失函数
optimizer = optim.SGD(model.parameters(), lr=0.01)  # 随机梯度下降优化器

# 训练循环
num_epochs = 5

for epoch in range(num_epochs):
    total_loss = 0
    for batch_idx, (data, target) in enumerate(dataloader):
        # 前向传播
        outputs = model(data)
        loss = criterion(outputs, target)
        
        # 反向传播
        optimizer.zero_grad()  # 清零梯度
        loss.backward()        # 计算梯度
        optimizer.step()       # 更新参数
        
        total_loss += loss.item()
    
    print(f'Epoch [{epoch+1}/{num_epochs}], Average Loss: {total_loss/len(dataloader):.4f}')

2. 使用真实数据集:MNIST 示例

借助 PyTorch 内置的 torchvision 工具库,可以方便地加载常用数据集如 MNIST。

?torchvision?
from torchvision import datasets, transforms

# 数据预处理
transform = transforms.Compose([
    transforms.ToTensor(),
    transforms.Normalize((0.5,), (0.5,))
])

# 加载MNIST数据集
train_dataset = datasets.MNIST(root='./data', train=True, download=True, transform=transform)
test_dataset = datasets.MNIST(root='./data', train=False, transform=transform)

train_loader = DataLoader(train_dataset, batch_size=64, shuffle=True)
test_loader = DataLoader(test_dataset, batch_size=1000, shuffle=False)

# 训练函数
def train_model(model, train_loader, criterion, optimizer, epochs=5):
    model.train()  # 设置模型为训练模式
    for epoch in range(epochs):
        running_loss = 0.0
        for i, (images, labels) in enumerate(train_loader):
            # 前向传播
            outputs = model(images)
            loss = criterion(outputs, labels)
            
            # 反向传播和优化
            optimizer.zero_grad()
            loss.backward()
            optimizer.step()
            
            running_loss += loss.item()
            
        print(f'Epoch [{epoch+1}/{epochs}], Loss: {running_loss/len(train_loader):.4f}')

六、模型评估与持久化存储

完成训练后,需对模型性能进行评估,并将其保存以便后续加载和推理使用。

1. 模型性能评估

def evaluate_model(model, test_loader):
    model.eval()  # 设置模型为评估模式
    correct = 0
    total = 0
    
    with torch.no_grad():  # 禁用梯度计算
        for images, labels in test_loader:
            outputs = model(images)
            _, predicted = torch.max(outputs.data, 1)
            total += labels.size(0)
            correct += (predicted == labels).sum().item()
    
    accuracy = 100 * correct / total
    print(f'测试集准确率: {accuracy:.2f}%')
    return accuracy

# 评估模型
accuracy = evaluate_model(model, test_loader)

2. 模型的保存与加载

可通过序列化模型参数或整个模型结构实现持久化。

# 保存模型
torch.save(model.state_dict(), 'model.pth')

# 加载模型
loaded_model = SimpleNN()
loaded_model.load_state_dict(torch.load('model.pth'))
loaded_model.eval()  # 设置为评估模式

七、利用 GPU 进行加速计算

PyTorch 支持无缝切换到 GPU 设备进行张量运算和模型训练,大幅提升计算速度。

# 检查GPU是否可用
device = torch.device('cuda' if torch.cuda.is_available() else 'cpu')
print(f'使用的设备: {device}')

# 将模型和数据移动到GPU
model = SimpleNN().to(device)

# 在训练循环中,将每个批次的数据移动到GPU
for data, target in dataloader:
    data, target = data.to(device), target.to(device)
    # ... 训练步骤 ...

八、完整案例:手写数字识别

以下是一个基于 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.1307,), (0.3081,))
])

# 加载数据
train_dataset = datasets.MNIST('./data', train=True, download=True, transform=transform)
test_dataset = datasets.MNIST('./data', train=False, transform=transform)

train_loader = DataLoader(train_dataset, batch_size=batch_size, shuffle=True)
test_loader = DataLoader(test_dataset, batch_size=1000, shuffle=False)

# 定义模型
class MNISTModel(nn.Module):
    def __init__(self):
        super(MNISTModel, self).__init__()
        self.fc1 = nn.Linear(784, 128)
        self.fc2 = nn.Linear(128, 10)
        self.relu = nn.ReLU()
    
    def forward(self, x):
        x = x.view(-1, 784)  # 展平图像
        x = self.relu(self.fc1(x))
        x = self.fc2(x)
        return x

# 初始化模型、损失函数和优化器
device = torch.device('cuda' if torch.cuda.is_available() else 'cpu')
model = MNISTModel().to(device)
criterion = nn.CrossEntropyLoss()
optimizer = optim.SGD(model.parameters(), lr=learning_rate)

# 训练模型
for epoch in range(epochs):
    model.train()
    for batch_idx, (data, target) in enumerate(train_loader):
        data, target = data.to(device), target.to(device)
        
        optimizer.zero_grad()
        output = model(data)
        loss = criterion(output, target)
        loss.backward()
        optimizer.step()
        
        if batch_idx % 100 == 0:
            print(f'Epoch: {epoch} [{batch_idx * len(data)}/{len(train_loader.dataset)}] '
                  f'Loss: {loss.item():.6f}')

# 评估模型
model.eval()
test_loss = 0
correct = 0
with torch.no_grad():
    for data, target in test_loader:
        data, target = data.to(device), target.to(device)
        output = model(data)
        test_loss += criterion(output, target).item()
        pred = output.argmax(dim=1, keepdim=True)
        correct += pred.eq(target.view_as(pred)).sum().item()

test_loss /= len(test_loader.dataset)
accuracy = 100. * correct / len(test_loader.dataset)
print(f'\n测试集准确率: {accuracy:.2f}%')

九、进阶技巧与推荐实践

1. 利用预训练模型迁移学习

通过加载已在大型数据集上训练好的模型权重,可快速应用于新任务。

import torchvision.models as models

# 加载预训练的ResNet模型
resnet = models.resnet18(pretrained=True)

# 微调模型:替换最后一层
resnet.fc = nn.Linear(resnet.fc.in_features, 10)  # 假设有10个类别

2. 学习率调度策略

动态调整学习率有助于提升收敛速度和最终性能。

# 创建学习率调度器
scheduler = optim.lr_scheduler.StepLR(optimizer, step_size=10, gamma=0.1)

# 在训练循环中使用
for epoch in range(epochs):
    # 训练步骤...
    scheduler.step()  # 更新学习率

3. 采用早停法避免过拟合

当验证误差不再下降时提前终止训练,防止模型过度拟合训练数据。

best_accuracy = 0
patience = 3
trigger_times = 0

for epoch in range(100):  # 最大100个epoch
    train_model(...)
    accuracy = evaluate_model(...)
    
    if accuracy > best_accuracy:
        best_accuracy = accuracy
        trigger_times = 0
        # 保存最佳模型
        torch.save(model.state_dict(), 'best_model.pth')
    else:
        trigger_times += 1
        if trigger_times >= patience:
            print("早停法:停止训练")
            break

一、环境配置与安装指南

开始使用前,首先需要正确安装 PyTorch。官方提供了详细的安装说明,用户可根据自己的操作系统、Python 环境及是否拥有 CUDA 兼容显卡选择合适的安装命令。

# 使用pip安装
pip install torch torchvision torchaudio

# 或使用conda安装
conda install pytorch torchvision torchaudio -c pytorch

安装完成后,运行如下代码可验证安装是否成功:

import torch

print(torch.__version__)  # 输出PyTorch版本
print(torch.cuda.is_available())  # 检查GPU是否可用

总结

本教程全面介绍了 PyTorch 的关键特性与基本使用方法,内容涵盖张量操作、自动微分机制、神经网络构建、模型训练与评估等核心模块。得益于其动态计算图设计和高度 Python 化的语法风格,PyTorch 具备良好的可读性和调试便利性,非常适合用于深度学习的研究与实验场景。

为进一步深入掌握 PyTorch,建议采取以下行动:

  • 查阅官方文档与教程资源
  • 积极参与开源项目贡献
  • 尝试复现经典论文中的模型结构
  • 学习分布式训练、模型压缩等高级主题

希望本内容能为你开启 PyTorch 深度学习之旅提供有力支持。

二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

关键词:神经网络 神经网 RCH TRANSFORMS parameters

您需要登录后才可以回帖 登录 | 我要注册

本版微信群
jg-xs1
拉您进交流群
GMT+8, 2025-12-9 05:54