趋近智
虽然通过子类化torch.nn.Module定义自定义网络架构提供了最大程度的灵活性,但许多常见模型都涉及层的一个直观序列,其中一层的输出直接作为下一层的输入。对于这些线性堆叠,PyTorch提供了一个方便的容器:torch.nn.Sequential。
nn.Sequential作为一个包装器,接收一个有序的模块序列(如层和激活函数 (activation function)),并在输入数据通过时,以该特定顺序执行它们。可以将其视为为您的数据转换构建一个流程。当您不需要复杂的数据流逻辑、跳跃连接或多输入/多输出路径时,这种方法简化了模型定义。
nn.Sequential定义模型您可以通过将您想要包含的模块作为参数 (parameter)传递给其构造函数来创建Sequential模型。顺序很重要,因为它决定了数据流。
让我们构建一个简单的两层前馈网络,它接收一个784维的输入(例如扁平化的MNIST图像),通过一个包含128个单元和ReLU激活的隐藏层,最后生成一个10维输出(用于10个类别)。
import torch
import torch.nn as nn
from collections import OrderedDict
# 定义输入、隐藏层和输出维度
input_size = 784
hidden_size = 128
output_size = 10
# 方法1:直接将模块作为参数传递
model_v1 = nn.Sequential(
nn.Linear(input_size, hidden_size), # 第1层:线性变换
nn.ReLU(), # 激活函数1:非线性
nn.Linear(hidden_size, output_size) # 第2层:线性变换
)
# 打印模型结构
print("Model V1 (Unnamed Layers):")
print(model_v1)
# 示例用法:创建一个虚拟输入张量
# 假设批量大小为64
dummy_input = torch.randn(64, input_size)
output = model_v1(dummy_input)
print("\nOutput shape:", output.shape) # 预期:torch.Size([64, 10])
这创建了一个模型,其中输入数据首先经过nn.Linear(784, 128),然后应用nn.ReLU()激活,最后结果通过nn.Linear(128, 10)。请注意,定义是多么紧凑。Sequential容器自动处理将一个模块的输出作为下一个模块的输入传递。
nn.Sequential中命名层尽管前一种方法可行,但层只被分配了默认的数字索引(0、1、2等)。这可能会使得后续调试或访问特定层变得更难。为了清晰度和可访问性,更好的做法是使用Python collections模块中的OrderedDict来为您的层提供名称。
# 方法2:使用OrderedDict进行命名层
model_v2 = nn.Sequential(OrderedDict([
('fc1', nn.Linear(input_size, hidden_size)), # 全连接层1
('relu1', nn.ReLU()), # ReLU激活
('fc2', nn.Linear(hidden_size, output_size)) # 全连接层2
]))
# 打印模型结构
print("\nModel V2 (Named Layers):")
print(model_v2)
# 现在可以通过名称访问特定层
print("\nAccessing fc1 weights shape:", model_v2.fc1.weight.shape)
# 如果需要,也可以使用整数索引访问
print("Accessing layer at index 0:", model_v2[0])
# 或者如果使用OrderedDict,直接通过字符串名称访问
print("Accessing layer by name 'relu1':", model_v2.relu1)
使用OrderedDict保留了插入顺序(这对nn.Sequential非常重要),同时允许您引用诸如model_v2.fc1或model_v2.relu1之类的层。这显著提高了代码的可读性和可维护性,特别是对于稍长的序列,使得检查模型的特定部分变得更容易。
数据流经使用命名层通过
nn.Sequential定义的model_v2。输入按线性顺序通过fc1、relu1和fc2。
nn.Sequentialnn.Sequential特别适合于:
Conv2d、BatchNorm2d和ReLU的卷积模块),然后可以将其作为单个模块整合到更大的自定义nn.Module结构中。nn.Sequential的主要局限在于其严格的线性性质。它假定一个单一输入和一个单一输出,数据顺序流经所有包含的模块。您不能直接使用它来定义具有更复杂拓扑的模型,例如:
forward方法中显式实现。nn.Sequential来表示。对于任何表现出这些特点的架构,您必须通过子类化torch.nn.Module并自行实现forward方法来定义一个自定义模型,这将给予您对数据流的完全控制,如前所述在“定义自定义网络架构”一节中讨论的。
总之,nn.Sequential提供了一种清晰高效的方法来定义线性堆叠神经网络 (neural network)层的常见模式。它是一个有价值且方便的工具,适用于更简单的架构和组件模块,补充了自定义nn.Module类这种更灵活的方法。现在您可以使用nn.Module或nn.Sequential定义模型结构了,下一步是定义模型将优化的目标函数,这将引出损失函数 (loss function)。
这部分内容有帮助吗?
torch.nn.Sequential 容器的官方文档,详细介绍了其功能和构建线性神经网络的方法。torch.nn.Module 基类的官方文档,解释了如何在 PyTorch 中构建自定义神经网络层和模型,是 nn.Sequential 的基础。nn.Module 和 nn.Sequential 构建神经网络,展示了它们的实际应用。© 2026 ApX Machine Learning用心打造