一、神经网络核心组件
组件 | 功能 |
---|
层 | 基本结构,实现输入张量到输出张量的变换 |
模型 | 由层组合而成的完整网络框架 |
损失函数 | 量化预测值与真实值差异,作为参数学习目标 |
优化器 | 通过梯度调整模型参数,最小化损失函数 |
协同流程:输入→层处理→预测值→损失函数算差异→优化器更新参数。
二、核心构建工具:nn.Module vs nn.functional
对比项 | nn.Module(如 nn.Linear) | nn.functional(如 F.relu) |
---|
参数管理 | 自动管理权重、偏置 | 需手动定义和传入参数 |
容器兼容 | 可与 nn.Sequential 等结合 | 不可结合模型容器 |
状态切换 | Dropout 等自动切换训练 / 测试状态 | 需手动控制状态 |
适用场景 | 含可学习参数的层(卷积、全连接等) | 无参数操作(激活、池化等) |
三、三种模型构建方法
1. 直接继承 nn.Module
- 逻辑:自定义类继承
nn.Module
,__init__
定义层,forward
写前向传播逻辑。 - 特点:灵活性最高,支持复杂结构(分支、跳跃连接)。
2. 使用 nn.Sequential
- 逻辑:按顺序传入层,自动执行前向传播,无需写
forward
。 - 实现方式:
- 可变参数:直接传层实例(无层名称)。
add_module
:为层命名,便于调试。OrderedDict
:用有序字典关联层名称与实例。
- 特点:代码简洁,仅支持线性层顺序。
3. 继承 nn.Module + 模型容器
- 逻辑:在自定义类中用
nn.Sequential
(线性打包)、nn.ModuleList
(列表管理)、nn.ModuleDict
(字典管理)分组层。 - 特点:平衡灵活性与模块化,适用于复杂网络。
四、自定义网络模块(以 ResNet 残差块为例)
1. 普通残差块(输入输出形状一致)
- 核心:两层 3×3 卷积 + 批量归一化,输入直接与输出相加(跳跃连接)。
2. 下采样残差块(形状不一致)
- 核心:增加 1×1 卷积调整输入形状,确保与输出可相加。
3. 组合构建 ResNet18
- 结构:初始卷积 + 最大池化 + 4 组残差块(普通块 + 下采样块)+ 全局平均池化 + 全连接层。
五、模型训练流程
- 加载预处理数据集(用
DataLoader
批量处理)。 - 定义损失函数(如分类用交叉熵损失)。
- 定义优化器(如 Adam,传入模型参数和学习率)。
- 循环训练:前向传播→算损失→反向传播→更新参数。
- 循环验证:切换模型为评估模式,计算验证集指标。
- 可视化结果:绘制损失、准确率曲线分析训练效果。