1. 神经网络核心组件
- 层(Layer)
- 输入张量的转换器(如全连接层 `nn.Linear`、卷积层 `nn.Conv2d`)。
- 模型(Model)
- 层的组合(如CNN、ResNet)。
- 损失函数(Loss Function)
- 目标函数的数学表达(如交叉熵损失 `nn.CrossEntropyLoss`)。
- 优化器(Optimizer)
- 参数更新算法(如SGD、Adam)。
---
2. PyTorch构建工具对比
工具类型 特点
`nn.Module` 继承自基类,自动管理权重/偏置,支持序列化与状态转换(如训练/测试模式切换)。
`nn.functional` 纯函数形式,需手动管理参数,无法直接与 `nn.Sequential` 结合使用。
关键区别:
- `nn.Module` 实例化后可链式调用(如 `model(input)`),而 `nn.functional` 需传递参数(如 `F.relu(x)`)。
- Dropout 层在 `nn.Module` 中可通过 `model.eval()` 自动切换状态,`nn.functional` 需手动控制。
---
3. 模型构建方法
(1) 继承 `nn.Module`
- 步骤:
1. 定义 `__init__()` 初始化层和参数。
2. 重写 `forward()` 定义前向逻辑。
- 示例代码:
python
class CustomModel(nn.Module):
def __init__(self):
super().__init__()
self.layers = nn.Sequential(nn.Linear(10, 5), nn.ReLU())
def forward(self, x):
return self.layers(x)
(2) 使用 `nn.Sequential`
- 方法1:可变参数顺序构建(无层名称):
python
model = nn.Sequential(nn.Linear(3, 1), nn.Sigmoid())
- 方法2:命名层(通过 `add_module` 或 `OrderedDict`):
python
model = nn.Sequential(OrderedDict(
('linear', nn.Linear(3, 1)),
('sigmoid', nn.Sigmoid())
))
(3) 模型容器
- `nn.Sequential`:线性堆叠层。
- `nn.ModuleList`:动态列表管理子模块(支持灵活索引)。
- `nn.ModuleDict`:字典映射子模块名称到实例(便于按需访问)。
---
4. 自定义网络模块(以 ResNet18 为例)
- 残差块设计:
1. 直接相加型:输入 → 卷积 → 激活 → 输出与输入相加。
2. 通道调整型:通过 `1×1` 卷积统一输入/输出形状。
- 组合残差块:堆叠多个残差块形成 ResNet18,解决梯度消失问题。
---
5. 模型训练流程
1. 数据准备
- 加载数据集(如 MNIST、CIFAR-10)。
- 数据预处理(归一化、数据增强)。
2. 组件定义
- 损失函数(如 `nn.CrossEntropyLoss`)。
- 优化器(如 `torch.optim.Adam`)。
3. 训练循环
- 前向传播 → 计算损失 → 反向传播 → 更新参数。
4. 验证循环
- 切换模型为测试模式 (`model.eval()`)。
- 计算验证集准确率。
5. 结果可视化
- 绘制损失曲线、准确率曲线。
---
备注
- 代码复用性:优先使用 `nn.Module`(自动管理参数),避免重复定义权重。
- 状态管理:训练阶段 (`model.train()`) 和测试阶段 (`model.eval()`) 需手动切换。
- 残差网络优势:通过跳跃连接提升梯度流动效率,适用于深层网络。
一、神经网络核心组件
1. 四大核心要素:
- 层(Layer):神经网络基本结构,处理张量转换
- 模型(Model):由多个层构成的网络结构
- 损失函数(Loss Function):参数学习的目标函数
- 优化器(Optimizer):最小化损失函数的算法
二、PyTorch构建工具对比
1. nn.Module特点:
- 继承自Module类
- 自动参数管理
- 支持与nn.Sequential结合
- 自动处理训练/测试状态(如Dropout)
- 示例:nn.Linear, nn.Conv2d
2. nn.functional特点:
- 纯函数式接口
- 需手动管理参数
- 不支持模型容器
- 示例:激活函数,池化操作
三、模型构建方法
1. 主要方式:
- 继承nn.Module基类
- 使用nn.Sequential顺序构建
* 三种实现方式:
- 可变参数
- add_module方法
- OrderedDict字典
- 结合模型容器:
* nn.Sequential:顺序结构
* nn.ModuleList:可迭代模块列表
* nn.ModuleDict:键值对模块字典
四、自定义网络模块
1. 残差块类型:
- 基础型:输入输出直接相加 + ReLU
- 调整型:通过1×1卷积统一维度
- 组合应用:构建ResNet18网络结构
五、模型训练流程
1. 标准步骤:
1) 数据加载与预处理
2) 定义损失函数(如交叉熵)
3) 选择优化器(如SGD/Adam)
4) 训练循环(前向/反向传播)
5) 验证测试流程
6) 结果可视化
六、关键注意事项
1. 开发建议:
- 优先使用nn.Module管理参数
- 合理选择模型容器组织网络结构
- 注意训练/测试模式切换(model.train()/eval())
- 残差连接需处理维度匹配问题