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

2025-03-12 人工智能 178 次阅读 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官方文档获取更详细的参数说明和最新特性。

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

评论 (0)

登录 后发表评论

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