PyTorch神经网络层全攻略:从线性层到Transformer,一文掌握torch.nn核心组件
本文系统介绍了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核心组件
推荐阅读
VMware Workstation 16激活码及许可证密钥获取方法
30192024-09-29
XWiki只允许本机访问:Jetty绑定127.0.0.1配置方法
1642026-04-28
VMware Workstation 17许可证密钥及免费激活方法详解
46092024-09-29
从非交互到交互式备案,手把手教你一周内搞定公安安全评估,轻松解锁网站互动功能
2812026-04-11
Windows系统PyTorch安装教程:CUDA 12.1环境配置与TorchText版本兼容性指南
30752024-06-21
GeoServer适配达梦数据库完整教程:从账号创建到图层发布
1722026-04-14