C# DNN神经网络 -- 多层感知机(MLP)

那么我采用的是鸢尾花数据集,用于DNN训练
用前向传播 + 反向传播
前向传播:
输入层(4) → 隐藏层1(8) → 隐藏层2(4) → 输出层(3)
每一层按照这个计算
z = W(权重矩阵) · a_prev + b(偏置向量)
a = Activate(z)(Activate是激活函数例如:ReLU/Tanh/LeakyReLU)
在输出层(3) 最后一层我选不做激活,直接输出原始分数(logits),然后通过 Softmax 函数将分数转为概率:
Softmax(z)k = e^{z_k} / Σj e^{z_j}
这样每个输出节点值都在 [0,1] 之间,且总和为1,正好作为分类概率
反向传播:
我用的是交叉熵损失函数(Cross-Entropy Loss)来衡量预测和真实标签的差距
Loss = -Σ_k y_k · log(p_k)
y_k 是 one-hot 真实标签(如 [1,0,0]),p_k 是预测概率
其实核心(链式法则)就是从输出层开始,把损失对每一层参数的梯度逐层往回传,计算出每个权重和偏置应该调整的方向和大小。
步骤如下
1.输出层误差 δ_output = p - y
2.逐层回传:δhidden = (WT · δnext) [把误差通过权重反向投影到前一层]⊙ Derivative(a)[乘以激活函数的导数(因为链式法则需要)]
3.梯度计算:每一层权重的梯度 = δ · a_prevT,偏置的梯度 = δ
4.用这些梯度更新权重:W ← W - learning_rate · gradient
训练流程:
1.数据准备
2.权重初始化
3.小批量训练,建议每次取16个样本计算梯度
4.梯度下降
5.迭代 我这里epoch 2000[重复2000轮] 每轮打乱数据顺序,避免模型记忆固定顺序
后来加了检查,也弄了一部分工艺级做法,训练时间变长了

主要技术来源:
https://learn.microsoft.com/zh-cn/archive/msdn-magazine/2017/august/test-run-deep-neural-network-io-using-csharp