我们先看,在如下场景中的一些关于"层"的表达:
"模型共三层,第一层LSTM提取时序,两层全连接做特征映射压缩"
"第3层Dropout会截断梯度,第1层LSTM参数量最大"
"封装lstm_block()、dense_block(),内部自动堆叠Dense/BN/Dropout全套网络层"
这里的"层"实际上有两类,且用在不同的语景中,即:
- 写注释、需求沟通、汇报 → 使用业务分层
例:"模型共三层,第一层LSTM提取时序,两层全连接做特征映射压缩" - 计算参数量、梯度调试、层冻结、模型可视化 → 使用网络分层
例:"第3层Dropout会截断梯度,第1层LSTM参数量最大" - 代码封装、复用组件 → 以业务分层 为单元封装函数
例:封装lstm_block()、dense_block(),内部自动堆叠Dense/BN/Dropout全套网络层。
本文讨论一下二者的关联。
一、概念区分
1. 网络分层(底层硬件/框架定义,最小执行单元)
以Keras/TensorFlow底层API为标准:每一次 model.add(xxxLayer) 都代表1个独立网络层 ,是模型运算、参数存储的最小单元。
细分两类网络层:
- 主干计算层:携带可训练权重,负责特征变换(LSTM、Dense)
- 辅助功能层:无/少量可训练参数,用于优化训练(BatchNormalization、Dropout、Activation)
2. 业务分层(工程/业务视角,功能聚合块)
按统一业务目标 ,把连续一组网络层打包为1个"业务层/功能块",不关心内部有多少底层网络层,只关注整块完成的任务。
同一业务分层内,固定一套标准化层堆叠范式,方便统一调参、阅读、复用。
二、二者核心关联
- 一对多关系:1个业务分层 = 多个连续堆叠的底层网络层;
- 包含关系:业务分层是高层逻辑封装,网络分层是底层实现零件;
- 设计约束:同一块业务分层内,层堆叠遵循固定范式(主干层+激活+BN+Dropout);
- 阅读逻辑 :对外沟通、注释、汇报用业务分层 ;调参、统计参数量、排查梯度问题用网络分层。
三、结合LSTM客流模型举例
模型代码分层对照
python
def build_model():
model = Sequential()
# ========== 业务分层1:时序特征提取块(LSTM业务层)==========
model.add(LSTM(512, input_shape=(X_train.shape[1], X_train.shape[2]))) # 网络层1:主干LSTM
model.add(BatchNormalization()) # 网络层2:BN辅助层
model.add(Dropout(0.2)) # 网络层3:Dropout辅助层
# 本业务分层:共3个底层网络层,目标:提取客流时序周期依赖
# ========== 业务分层2:高维非线性映射块(256维全连接业务层)==========
model.add(Dense(256)) # 网络层4:主干Dense
model.add(Activation("relu")) # 网络层5:激活辅助层
model.add(BatchNormalization()) # 网络层6:BN辅助层
model.add(Dropout(0.2)) # 网络层7:Dropout辅助层
# 本业务分层:共4个底层网络层,目标:放大时序特征非线性区分度
# ========== 业务分层3:低维特征压缩块(64维全连接业务层)==========
model.add(Dense(64)) # 网络层8:主干Dense
model.add(Activation("relu")) # 网络层9:激活辅助层
# 本业务分层:共2个底层网络层,目标:压缩冗余特征,提纯关键客流表征
return model
对照表
| 业务分层(功能块) | 包含的底层网络分层(model.add单元) | 分层业务目标 |
|---|---|---|
| 1. LSTM时序提取层 | LSTM + BN + Dropout(3层网络层) | 捕捉10分钟粒度客流的日/周时序波动 |
| 2. 256维映射全连接层 | Dense256 + ReLU + BN + Dropout(4层网络层) | 对时序特征做高维非线性变换 |
| 3. 64维压缩全连接层 | Dense64 + ReLU(2层网络层) | 降维过滤噪声,浓缩有效预测特征 |
四、其它通用场景示例
示例1:CNN图像分类经典块(残差块)
- 业务分层:1个残差卷积块(1个业务层)
- 内部网络分层:Conv2d + BN + ReLU + Conv2d + BN + 残差Add(6个网络层)
示例2:普通单隐藏层DNN
python
# 业务分层:2块(输入映射层、输出预测层)
model.add(Dense(128)) # 网络层1
model.add(ReLU()) # 网络层2
model.add(Dropout(0.1))#网络层3 # 业务分层1:隐藏特征映射块(3个网络层)
model.add(Dense(1)) # 网络层4 # 业务分层2:输出回归块(1个网络层)