跳到主要内容

PyTorch 中的顺序块 Sequential

Sequential 是什么?

torch.nn.Sequential 是 PyTorch 中的一个容器模块,用于简化神经网络的创建。它允许我们按照它们在序列中的顺序来堆叠不同的模块,从而快速地创建一个神经网络。

优点:

  1. 简洁性:使用 Sequential 可以减少代码的冗余,使模型的定义更加简洁。
  2. 易读性:模型的结构在 Sequential 中按照顺序排列,使其容易理解。

使用方法:

  1. 使用 OrderedDict:可以为每个模块指定一个名称。
  2. 直接传入模块:按照传入的顺序堆叠模块。

示例:

  1. 直接传入模块
import torch.nn as nn

model = nn.Sequential(
nn.Conv2d(1, 20, 5),
nn.ReLU(),
nn.Conv2d(20, 64, 5),
nn.ReLU()
)
  1. 使用OrderedDict
from collections import OrderedDict

model = nn.Sequential(OrderedDict([
('conv1', nn.Conv2d(1, 20, 5)),
('relu1', nn.ReLU()),
('conv2', nn.Conv2d(20, 64, 5)),
('relu2', nn.ReLU())
]))

注意事项:

  • Sequential是一个线性堆叠的容器,这意味着它最适合于那些模块之间没有复杂连接的简单网络结构。对于具有分支或多输入/多输出的复杂网络结构,可能需要定义自己的网络类。

  • 虽然Sequential提供了一种简洁的方式来定义模型,但它可能不适合所有情况。有时,为了更好地控制前向传播或为模型添加额外的复杂性,可能需要直接继承nn.Module来定义自己的模型。

总的来说,nn.Sequential 是 PyTorch 中的一个非常有用的工具,它为定义简单的神经网络提供了一种简洁和直观的方法。

如何使用 Sequential 定义神经网络模型?

以下是一些简单的实际例子,展示如何使用 nn.Sequential 来定义不同类型的神经网络模型。

1. 简单的全连接前馈网络(Feedforward Neural Network)

这是一个简单的两层全连接网络,适用于二分类问题。

import torch.nn as nn

# 输入特征数为10,隐藏层神经元数为5,输出为2(二分类)
model = nn.Sequential(
nn.Linear(10, 5), # 输入层到隐藏层
nn.ReLU(), # ReLU激活函数
nn.Linear(5, 2) # 隐藏层到输出层
)

2. 卷积神经网络(Convolutional Neural Network)

这是一个简单的卷积神经网络,适用于图像分类。

model = nn.Sequential(
nn.Conv2d(1, 16, 3, stride=1, padding=1), # 输入通道为1,输出通道为16,3x3卷积核
nn.ReLU(),
nn.MaxPool2d(2, 2), # 2x2最大池化
nn.Conv2d(16, 32, 3, stride=1, padding=1), # 输入通道为16,输出通道为32,3x3卷积核
nn.ReLU(),
nn.MaxPool2d(2, 2), # 2x2最大池化
nn.Flatten(), # 展平操作,为全连接层准备
nn.Linear(32*7*7, 10) # 全连接层,输出10个类别
)

3. 简单的回归网络

这是一个简单的网络,适用于回归任务,例如预测房价。

model = nn.Sequential(
nn.Linear(5, 10), # 假设输入特征数为5,隐藏层神经元数为10
nn.ReLU(),
nn.Linear(10, 1) # 输出一个连续值
)

这些例子都是非常基础的,为了使新手容易理解。在实际应用中,神经网络的结构可能会更加复杂,但 nn.Sequential 为我们提供了一种简洁的方式来定义这些模型。对于初学者来说,从这些简单的模型开始是一个很好的起点,随着对PyTorch的熟悉,可以逐渐尝试更复杂的结构。