【深度学习 Pytorch系列课程】pytorch 常见模型分类之全连接神经网络(FNN)
·
PyTorch中全连接神经网络(Fully Connected Neural Network, FNN)的系统性详解,涵盖核心概念、数学原理、PyTorch实现及高级优化技巧,并结合最新实践整理:
🧠 一、FNN核心概念与结构
-
基本定义
- 前馈特性:数据单向流动(输入层 → 隐藏层 → 输出层),无循环或反馈。
- 全连接:相邻层的每个神经元均相互连接,权重矩阵规模为
(out_features, in_features)。
-
核心组件
- 输入层:接收数据,维度 = 特征数(如MNIST图像展平后为784维)。
- 隐藏层:
- 作用:通过非线性激活函数学习特征变换。
- 典型结构:多层堆叠(如
Linear(784, 128) → ReLU → Linear(128, 64))。
- 输出层:根据任务设计(分类:
Linear(64, 10) + Softmax;回归:Linear(64, 1))。
-
数学表达
- 第 (l) 层输出:
[
\mathbf{z}^{(l)} = \mathbf{W}^{(l)} \mathbf{a}^{(l-1)} + \mathbf{b}^{(l)}, \quad \mathbf{a}^{(l)} = \sigma(\mathbf{z}^{(l)})
]
其中 (\sigma) 为激活函数(如ReLU),(\mathbf{a}^{(0)} = \mathbf{x})(输入)。
- 第 (l) 层输出:
⚙️ 二、PyTorch实现基础
1. 核心模块:nn.Linear
- 功能:实现线性变换 (y = xW^T + b)。
- 参数:
layer = nn.Linear(in_features=784, out_features=128, bias=True) # 权重shape: [128, 784] - 输入输出:
- 输入:
(batch_size, in_features) - 输出:
(batch_size, out_features)。
- 输入:
2. 激活函数选择
| 函数 | 公式 | 优点 | 缺点 |
|---|---|---|---|
| ReLU | (\max(0, x)) | 计算快,缓解梯度消失 | 神经元死亡(输出为0) |
| Sigmoid | (\frac{1}{1+e^{-x}}) | 输出(0,1) | 梯度消失,计算慢 |
| GELU | (x \Phi(x)) | Transformer常用 | 计算复杂 |
3. 完整模型定义
import torch.nn as nn
class FNN(nn.Module):
def __init__(self, input_dim, hidden_dims, output_dim):
super().__init__()
layers = []
prev_dim = input_dim
for dim in hidden_dims:
layers.append(nn.Linear(prev_dim, dim))
layers.append(nn.ReLU()) # 激活函数
prev_dim = dim
layers.append(nn.Linear(prev_dim, output_dim))
self.net = nn.Sequential(*layers)
def forward(self, x):
return self.net(x)
# 示例:MNIST分类(输入784维 → 输出10类)
model = FNN(input_dim=784, hidden_dims=[256, 128], output_dim=10)
🔧 三、训练与优化
1. 损失函数
- 分类任务:
nn.CrossEntropyLoss()(内置Softmax)。 - 回归任务:
nn.MSELoss()(均方误差)。
2. 优化器配置
optimizer = torch.optim.Adam(model.parameters(), lr=0.001, weight_decay=1e-5) # Adam + L2正则
scheduler = torch.optim.lr_scheduler.StepLR(optimizer, step_size=30, gamma=0.1) # 学习率衰减
3. 训练循环
def train(model, dataloader, criterion, optimizer):
model.train()
for x, y in dataloader:
optimizer.zero_grad() # 梯度清零
outputs = model(x) # 前向传播
loss = criterion(outputs, y) # 损失计算
loss.backward() # 反向传播
optimizer.step() # 参数更新
🚀 四、高级技巧与变体
-
防止过拟合
- Dropout:随机丢弃神经元(
nn.Dropout(0.5))。 - 权重初始化:
nn.init.kaiming_normal_(layer.weight, mode='fan_in', nonlinearity='relu') # ReLU适用 nn.init.zeros_(layer.bias) # 偏置初始化为0
- Dropout:随机丢弃神经元(
-
残差连接(ResNet FNN)
- 解决深层网络梯度消失问题:
class ResBlock(nn.Module): def __init__(self, dim): super().__init__() self.fc1 = nn.Linear(dim, dim) self.fc2 = nn.Linear(dim, dim) def forward(self, x): identity = x x = torch.relu(self.fc1(x)) x = self.fc2(x) return torch.relu(x + identity) # 残差连接
- 解决深层网络梯度消失问题:
-
混合精度训练
- 加速计算并减少显存占用:
scaler = torch.cuda.amp.GradScaler() with torch.cuda.amp.autocast(): outputs = model(x) loss = criterion(outputs, y) scaler.scale(loss).backward() # 梯度缩放 scaler.step(optimizer) scaler.update()
- 加速计算并减少显存占用:
💻 五、应用场景与性能优化
-
典型任务
- 结构化数据预测:房价预测、用户分类。
- 图像分类:CNN特征提取后接全连接层(如ResNet分类头)。
- 生成模型:GAN生成器的核心组件(如DCGAN从噪声生成图像)。
-
性能优化
- 硬件加速:
model = model.to('cuda') # GPU迁移 dataloader = DataLoader(dataset, batch_size=64, num_workers=4, pin_memory=True) # 并行加载 - 编译优化(PyTorch 2.7+):
compiled_model = torch.compile(model, mode="max-autotune") # 加速训练40%
- 硬件加速:
💎 总结:FNN的现代应用
| 场景 | 代表模型」 | PyTorch关键组件」 |
|---|---|---|
| 基础分类任务」 | 多层感知机(MLP)」 | nn.Linear + CrossEntropyLoss」 |
| 图像生成」 | GAN生成器」 | nn.Linear + nn.BatchNorm1d」 |
| 大语言模型」 | Transformer FFN」 | Linear(d_model, d_ff) + GELU」 |
最佳实践:
- 优先使用 ReLU/GELU 激活函数,避免Sigmoid的梯度消失问题。
- 结合 Dropout + BatchNorm 提升深层FNN的稳定性。
- 使用 Torch.compile 和混合精度训练加速大规模FNN。
魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。
更多推荐


所有评论(0)