目录
我的结构
我曾经在一次使用BP神经网络预测碳排放的时候,采用了5-12-8-1的结构。也就是
输入层(5)→ 隐含层1(12)→ 隐含层2(8)→ 输出层(1)
但是我为什么要这样设置,这样设置的目的是什么?
✅ 一套相对“规范”的 BP 神经网络设计流程如下:
① 明确任务类型
-
回归任务(如预测碳排放量):输出层一般 1 个神经元,激活函数用
linear
-
分类任务:输出层根据类别数量设置,激活函数通常用
softmax
或sigmoid
② 确定输入层结构
-
输入层的神经元数 = 特征数量
👉 比如你有 5 个特征,就设置input_dim=5
③ 设计隐藏层数量和神经元个数
这部分没有唯一答案,但可以遵循以下原则:
🧩 A. 隐藏层层数:
-
1 层隐藏层对大多数简单或中等复杂问题已经足够
-
2 层可以拟合更复杂的非线性关系
-
超过 2 层(深层网络)通常需要大量数据 + 正则化 + 更强硬件支持
🧩 B. 每层神经元个数:
可以结合下面这几个方法选择:
方法 | 原则 |
---|---|
经验公式(启发式) | 如 |
逐步试验 | 从小到大(如:5→10→15),逐步比较效果 |
网格搜索(Grid Search) | 在多个结构组合中自动找出效果最好的一组 |
避免过拟合 | 神经元越多 → 拟合能力越强 → 容易过拟合,需配合正则化 |
④ 选择激活函数
-
隐藏层常用:
ReLU
(快、抗梯度消失) -
输出层:
-
回归问题:
linear
-
二分类:
sigmoid
-
多分类:
softmax
-
⑤ 模型编译设置
-
损失函数:
-
回归:
mean_squared_error
-
分类:
binary_crossentropy
/categorical_crossentropy
-
-
优化器:推荐使用
Adam
-
指标:如
mae
,mse
,accuracy
等
⑥ 模型训练参数
-
Epochs(训练轮数):一般 30-200,需结合 loss 曲线看是否收敛
-
Batch size:一般 4、8、16、32 等;小数据可用小 batch
⑦ 训练效果验证
-
使用训练集 / 验证集 或 交叉验证方式评估
-
画出 loss 曲线,观察是否过拟合
-
尝试不同结构比较预测结果(如 MAE、RMSE)
string流程图
明确任务类型(回归/分类)
↓
确定输入层节点数
↓
隐藏层层数 + 每层节点数设计
↓
选择激活函数(ReLU、linear等)
↓
选择损失函数与优化器
↓
设置训练参数(Epoch、Batch)
↓
模型训练 + 效果可视化
↓
微调结构 → 最终模型
我的结构如此设置的原因
🔹 输入层(5 个神经元):
这很明确,对应的是你模型的 5 个输入特征:
-
工业碳排放(万吨)
-
人口数量(万人)
-
自然增长率
-
单位GDP能耗(吨标准煤/万元)
-
GDP
👉 所以这里设置 5 个输入神经元是固定的,不能随便改。
🔹 第一隐藏层(12 个神经元):
这是最关键的一层。为什么设置为 12?
📌 设计原则:
-
必须大于输入特征数(通常是 2~3 倍左右),才能捕捉复杂特征组合。
-
不能太多,否则容易过拟合、训练慢、计算资源浪费。
✅ 设置为 12 的理由:
-
5 个特征之间可能存在复杂的组合和非线性关系,我们让第一层「宽一点」,提供充足的“特征抽象能力”。
-
12 是 5 的 2.4 倍,比较符合经验设计公式:
-
👉 但这个经验值只是参考,具体还要结合实验调优。
🔹 第二隐藏层(8 个神经元):
为什么又加一层?为什么是 8?
-
作用是进一步压缩第一层抽象出的信息,让网络学会“更深层次”的特征组合。
-
通常在第一层之后再加一层,可以让模型更有层次地抽象输入,提升泛化能力。
-
设置为 8 是因为:
-
稍小于前一层(12 → 8),逐步收缩;
-
还能保持较好的非线性建模能力;
-
减少过多参数,防止过拟合。
-
✅ 多一层相比只用一层通常在非线性问题(如碳排放)中会更有优势。
🔹 输出层(1 个神经元):
很简单,最终我们只需要预测一个值:碳排放量
👉 所以,输出层必须是 1 个节点,且使用 线性激活函数,适合预测连续值。
📊 总结结构设计逻辑:
层级 | 神经元数 | 设置理由 |
---|---|---|
输入层 | 5 | 与输入特征数一致 |
隐含层1 | 12 | 保证足够表达能力,提取复杂特征组合 |
隐含层2 | 8 | 精炼信息、增强非线性建模能力 |
输出层 | 1 | 预测一个连续值:碳排放 |
💡 补充:怎么进一步优化这个结构?
你现在是基于经验设置的结构,是一个不错的起点。但要做到更精准预测,后期可以:
-
用**交叉验证(cross-validation)**来尝试不同结构;
-
使用 网格搜索/自动超参数优化(如Keras Tuner);
-
观察训练曲线是否过拟合或欠拟合,适当加减神经元或层数;
-
加入 正则化 或 Dropout 等手段提高模型泛化能力。
关于经验公式
我提到的这个“经验设计公式”是神经网络结构设计中常用的一种启发式规则(经验法则),用来帮助我们在没有大量调参的前提下,初步估计隐藏层神经元数量。
📐 常见的经验公式之一:
-
H:隐藏层神经元数(推荐值)
-
:输入特征数(即输入层的神经元数量)
-
:输出值数量(通常是 1)
✅ 举个例子:
假如你的输入是 5 个特征,输出是一个碳排放值(回归问题):
👉 结果大概是 4~5 个神经元
但这只是一个起点,你可以根据实际复杂度适当加大(比如你现在用了 12),尤其是当你觉得数据之间非线性很复杂时。
🧠 其它经验规则还有:
经验公式 | 含义 |
---|---|
几何均值法,适用于需要压缩特征时 | |
不要太多神经元,防止过拟合 | |
kkk 为常数(如0~10),适度偏大的设置 |
❗注意事项:
这些经验值 并不是理论定律,它们只是根据历史研究、经验总结出来的“常见好用范围”,真正最优的结构还是需要:
-
交叉验证
-
实验评估误差
-
可解释性分析
比如你可以尝试设置不同的结构:5-6-1、5-10-1、5-12-8-1,对比预测效果,再做选择。
📌 总结一句话:
经验公式帮我们快速起步、避免乱猜,但要真正获得最佳效果,还是需要结合实验和数据分布来微调结构。你现在采用的结构就属于从经验出发,加入模型表达能力考虑后的升级版。