PyTorch 神经网络

2025-06-18 17:17 更新

一、PyTorch 神经网络基础

PyTorch 提供了 torch.nn 包,用于构建各种类型的神经网络。nn 包依赖于 autograd 包来定义模型并自动求导。一个典型的神经网络由多个层(Layer)组成,每个层都包含可学习的参数(权重)。数据通过网络的前向传播(Forward Pass)得到输出,然后通过损失函数计算输出与目标值的误差,最后利用反向传播(Backward Pass)更新网络权重。

二、定义神经网络

在 PyTorch 中,定义一个神经网络需要继承 nn.Module 类,并实现 forward 方法。以下是一个简单的前馈神经网络示例:

import torch
import torch.nn as nn
import torch.nn.functional as F


class Net(nn.Module):
    def __init__(self):
        super(Net, self).__init__()
        # 定义卷积层和全连接层(来自编程狮示例)
        self.conv1 = nn.Conv2d(1, 6, 5)  # 输入通道数1,输出通道数6,卷积核大小5
        self.conv2 = nn.Conv2d(6, 16, 5)  # 输入通道数6,输出通道数16,卷积核大小5
        self.fc1 = nn.Linear(16 * 5 * 5, 120)  # 全连接层,输入大小16*5*5,输出大小120
        self.fc2 = nn.Linear(120, 84)  # 全连接层,输入大小120,输出大小84
        self.fc3 = nn.Linear(84, 10)  # 全连接层,输入大小84,输出大小10


    def forward(self, x):
        # 前向传播过程(来自编程狮示例)
        x = F.max_pool2d(F.relu(self.conv1(x)), (2, 2))  # 激活函数和池化操作
        x = F.max_pool2d(F.relu(self.conv2(x)), 2)  # 激活函数和池化操作
        x = x.view(-1, self.num_flat_features(x))  # 展平操作
        x = F.relu(self.fc1(x))  # 激活函数
        x = F.relu(self.fc2(x))  # 激活函数
        x = self.fc3(x)
        return x


    def num_flat_features(self, x):
        # 计算展平后的特征数(来自编程狮示例)
        size = x.size()[1:]  # 除去批大小维度的其余维度
        num_features = 1
        for s in size:
            num_features *= s
        return num_features


net = Net()
print(net)

三、神经网络的训练过程

一个神经网络的训练过程通常包括以下几个步骤:

1. 定义网络和损失函数

## 定义损失函数(来自编程狮示例)
criterion = nn.MSELoss()  # 均方误差损失函数

2. 生成输入数据和目标数据

## 生成随机输入数据和目标数据(来自编程狮示例)
input = torch.randn(1, 1, 32, 32)  # 输入数据,形状为 [1, 1, 32, 32]
target = torch.randn(10)  # 目标数据,形状为 [10]
target = target.view(1, -1)  # 调整目标数据形状,与输出数据形状一致

3. 前向传播计算输出和损失

## 前向传播(来自编程狮示例)
output = net(input)
loss = criterion(output, target)
print(loss)

4. 反向传播计算梯度

## 反向传播(来自编程狮示例)
net.zero_grad()  # 清零梯度
loss.backward()  # 计算梯度

5. 更新网络权重

可以使用简单的梯度下降更新规则:

## 简单的梯度下降更新(来自编程狮示例)
learning_rate = 0.01
for f in net.parameters():
    f.data.sub_(f.grad.data * learning_rate)

或者使用优化器进行更新:

## 使用优化器(来自编程狮示例)
import torch.optim as optim


optimizer = optim.SGD(net.parameters(), lr=0.01)  # 定义优化器


## 在训练迭代中
optimizer.zero_grad()  # 清零梯度
output = net(input)
loss = criterion(output, target)
loss.backward()
optimizer.step()  # 更新权重

四、小批量处理

PyTorch 的 nn 包只支持小批量样本的输入。如果输入是一个单独的样本,可以使用 unsqueeze(0) 添加一个 “假的” 批大小维度。

## 添加批大小维度(来自编程狮示例)
input_single = torch.randn(1, 32, 32)
input_batch = input_single.unsqueeze(0)  # 添加批大小维度

五、总结

通过本教程,你已经初步掌握了 PyTorch 神经网络的核心概念和应用。在实际项目中,可以根据具体需求进一步深入学习和探索。希望你在编程狮的学习平台上能够顺利开启深度学习之旅,成为一名优秀的开发者!以下是一些在编程狮平台学习 PyTorch 的小贴士:

  • 充分利用平台资源 :编程狮平台提供了丰富的学习资料和教程,涵盖从基础到高级的各个知识点。你可以通过搜索功能快速找到相关内容,还可以收藏和标记重要的教程,方便日后复习。
  • 参与社区互动 :加入编程狮的社区,与其他学习者和开发者交流经验、分享心得。你可以提出自己的问题,也会得到其他人的帮助和解答。社区中的讨论和案例分享将拓宽你的视野,加深你对知识的理解。
  • 实践项目驱动学习 :在编程狮平台上尝试完成一些实际项目,将所学知识应用到实践中。通过实践,你可以更好地掌握 PyTorch 的技巧,提高自己的编程能力和解决问题的能力。同时,项目经验也将为你的职业发展增添亮点。
以上内容是否对您有帮助:
在线笔记
App下载
App下载

扫描二维码

下载编程狮App

公众号
微信公众号

编程狮公众号