PyTorch神经网络层全攻略:从线性层到Transformer,一文掌握torch.nn核心组件

2026-05-26 人工智能 519 次阅读 0 次点赞
本文系统介绍了PyTorch中torch.nn模块的常用层类型及其功能,包括容器(Sequential等)、线性层、卷积层、池化层、正则化层、Dropout层、循环层(LSTM等)、Transformer层、稀疏层(Embedding)和视觉层,并通过代码示例展示了各层的使用方法。文章强调,理解这些层是构建神经网络的基础,最后通过一个完整的CNN分类网络示例综合演示了多种层的配合使用,并建议查阅官方文档获取更详细的信息。

在深度学习框架PyTorch中,torch.nn模块提供了构建神经网络所需的各种层(Layer)。本文将系统介绍PyTorch中常用的层类型及其功能,帮助你更好地理解和搭建神经网络模型。

常用地址

官方文档:https://docs.pytorch.org/docs/main/nn.html

快速参考

层类型 主要功能
容器 组织网络结构
线性层 全连接网络
卷积层 空间特征提取
池化层 降采样
正则化层 稳定训练
循环层 序列建模
Transformer层 注意力机制
Dropout层 正则化防过拟合

容器(Containers)

容器层用于组织和管理其他层,是构建网络的基础。

层 说明
Module 所有神经网络模块的基类
Sequential 顺序容器,按添加顺序执行层
ModuleList 以列表形式保存子模块
ModuleDict 以字典形式保存子模块

Sequential示例

import torch
import torch.nn as nn

# 使用Sequential快速构建网络
model = nn.Sequential(
    nn.Linear(784, 1000),
    nn.ReLU(),
    nn.Dropout(),
    nn.Linear(1000, 10)
)

x = torch.randn(100, 784)
y = model(x)
print(y.shape)  # torch.Size([100, 10])

线性层(Linear Layers)

线性层执行仿射变换,是全连接网络的核心组件。

层 说明
nn.Linear 应用仿射线性变换 y = xA^T + b
nn.Identity 恒等映射,不做任何变换
nn.Bilinear 双线性变换
nn.LazyLinear 延迟初始化in_features的Linear层

Linear示例

x = torch.randn(10, 24)

# 将24维输入映射到48维输出
fc = nn.Linear(in_features=24, out_features=48)
y = fc(x)
print(y.shape)  # torch.Size([10, 48])

卷积层(Convolution Layers)

卷积层通过滑动卷积核提取局部特征,是计算机视觉任务的基础。

层 说明
nn.Conv1d 一维卷积,常用于序列数据
nn.Conv2d 二维卷积,常用于图像数据
nn.Conv3d 三维卷积,常用于视频或3D数据
nn.ConvTranspose2d 二维转置卷积,用于上采样

Conv2d示例

# 输入: batch=1, 通道=3, 高度=32, 宽度=32
x = torch.randn(1, 3, 32, 32)

# 3输入通道 -> 16输出通道, 3x3卷积核
conv = nn.Conv2d(in_channels=3, out_channels=16, kernel_size=3, padding=1)
y = conv(x)
print(y.shape)  # torch.Size([1, 16, 32, 32])

池化层(Pooling Layers)

池化层用于降采样,减少特征图尺寸和参数数量。

层 说明
nn.MaxPool2d 二维最大池化
nn.AvgPool2d 二维平均池化
nn.AdaptiveAvgPool2d 自适应平均池化,输出固定尺寸

MaxPool2d示例

x = torch.randn(1, 16, 32, 32)

# 2x2池化窗口,步幅2,将32x32降采样为16x16
pool = nn.MaxPool2d(kernel_size=2, stride=2)
y = pool(x)
print(y.shape)  # torch.Size([1, 16, 16, 16])

# 自适应池化:输出固定尺寸5x5
adaptive_pool = nn.AdaptiveAvgPool2d(output_size=(5, 5))
y = adaptive_pool(x)
print(y.shape)  # torch.Size([1, 16, 5, 5])

填充层(Padding Layers)

填充层在输入边界添加填充值,常用于保持特征图尺寸。

层 说明
nn.ZeroPad2d 零填充
nn.ReflectionPad2d 反射填充
nn.ReplicationPad2d 复制边界填充
nn.ConstantPad2d 常数填充

正则化层(Normalization Layers)

正则化层用于稳定训练、加速收敛。

层 说明
nn.BatchNorm2d 批量归一化,用于CNN
nn.LayerNorm 层归一化,常用于Transformer
nn.InstanceNorm2d 实例归一化,用于风格迁移
nn.GroupNorm 分组归一化

BatchNorm2d示例

x = torch.randn(16, 64, 28, 28)  # batch=16, channels=64

bn = nn.BatchNorm2d(num_features=64)
y = bn(x)
# 输出尺寸不变,但分布被归一化
print(y.shape)  # torch.Size([16, 64, 28, 28])

Dropout层(Dropout Layers)

Dropout通过随机丢弃神经元防止过拟合。

层 说明
nn.Dropout 随机将部分元素置零
nn.Dropout2d 随机丢弃整个通道
nn.AlphaDropout 保持均值和方差的Dropout

Dropout示例

x = torch.randn(100, 256)
dropout = nn.Dropout(p=0.5)  # 50%的神经元随机置零

model.train()  # 训练模式
y_train = dropout(x)

model.eval()   # 评估模式,dropout不生效
y_eval = dropout(x)

循环层(Recurrent Layers)

循环层用于处理序列数据,如时间序列、文本等。

层 说明
nn.LSTM 长短期记忆网络
nn.RNN 简单循环神经网络
nn.GRU 门控循环单元
nn.LSTMCell LSTM单元(单时间步)

LSTM示例

# 输入: 序列长度10, batch=5, 特征维度20
x = torch.randn(10, 5, 20)

# 输入20维,隐藏状态64维,2层LSTM
lstm = nn.LSTM(input_size=20, hidden_size=64, num_layers=2)

output, (h_n, c_n) = lstm(x)
print(output.shape)  # torch.Size([10, 5, 64])

Transformer层

Transformer层基于注意力机制,是现代NLP和视觉模型的核心。

层 说明
nn.Transformer 完整Transformer模型
nn.TransformerEncoder Transformer编码器栈
nn.TransformerEncoderLayer 单层编码器(自注意力+前馈)
nn.TransformerDecoderLayer 单层解码器(自注意力+交叉注意力+前馈)

TransformerEncoderLayer示例

x = torch.randn(10, 32, 512)  # 序列长10, batch=32, 特征512

encoder_layer = nn.TransformerEncoderLayer(
    d_model=512,      # 特征维度
    nhead=8,          # 8个注意力头
    dim_feedforward=2048,
    dropout=0.1
)

encoder = nn.TransformerEncoder(encoder_layer, num_layers=6)
y = encoder(x)
print(y.shape)  # torch.Size([10, 32, 512])

稀疏层(Sparse Layers)

稀疏层主要用于处理离散数据,如词嵌入。

层 说明
nn.Embedding 词嵌入查找表
nn.EmbeddingBag 嵌入包(求和/平均),更高效

Embedding示例

# 10个词的词汇表,每个词映射到64维向量
embedding = nn.Embedding(num_embeddings=10, embedding_dim=64)

# 输入: 索引序列
x = torch.tensor([1, 2, 4, 5, 9])  # shape: (5)
y = embedding(x)
print(y.shape)  # torch.Size([5, 64])

视觉层(Vision Layers)

视觉层提供图像特有的操作,如上采样。

层 说明
nn.Upsample 通用上采样
nn.PixelShuffle 像素重排,用于超分辨率
nn.UpsamplingBilinear2d 双线性插值上采样

完整示例:构建CNN分类网络

下面是一个综合使用多种层的完整示例:

import torch
import torch.nn as nn

class CNNClassifier(nn.Module):
    def __init__(self):
        super().__init__()
        # 特征提取部分
        self.features = nn.Sequential(
            # 卷积块1
            nn.Conv2d(3, 32, kernel_size=3, padding=1),
            nn.BatchNorm2d(32),
            nn.ReLU(),
            nn.MaxPool2d(2, 2),  # 32x32 -> 16x16
            
            # 卷积块2
            nn.Conv2d(32, 64, kernel_size=3, padding=1),
            nn.BatchNorm2d(64),
            nn.ReLU(),
            nn.MaxPool2d(2, 2),  # 16x16 -> 8x8
            
            # 卷积块3
            nn.Conv2d(64, 128, kernel_size=3, padding=1),
            nn.BatchNorm2d(128),
            nn.ReLU(),
            nn.AdaptiveAvgPool2d((4, 4))  # 自适应输出4x4
        )
        
        # 分类器部分
        self.classifier = nn.Sequential(
            nn.Flatten(),
            nn.Linear(128 * 4 * 4, 256),
            nn.ReLU(),
            nn.Dropout(0.5),
            nn.Linear(256, 10)  # 10个类别
        )
    
    def forward(self, x):
        x = self.features(x)
        x = self.classifier(x)
        return x

# 测试模型
model = CNNClassifier()
x = torch.randn(16, 3, 32, 32)  # 16张32x32的RGB图像
y = model(x)
print(f"输入形状: {x.shape}")
print(f"输出形状: {y.shape}")  # torch.Size([16, 10])

总结

PyTorch的torch.nn模块提供了丰富的层类型,涵盖从基础线性层到高级Transformer层的各种需求。理解每种层的功能是构建高效神经网络的关键。建议在实际使用中查阅PyTorch官方文档获取更详细的参数说明和最新特性。

最后更新于4月前
本文由人工编写,AI优化,转载请注明原文地址: PyTorch神经网络层全攻略:从线性层到Transformer,一文掌握torch.nn核心组件

评论 (0)

请 登录 后发表评论

暂无评论,快来发表第一条评论吧!