基于 BP 神经网络的人脸朝向预测系统
项目简介
本项目是一个基于 MATLAB 开发环境的神经网络教学与实践系统。项目核心利用经典的反向传播(Back Propagation, BP)算法,构建并训练一个三层全连接神经网络,用于实现对人脸图像朝向(左、右、上、下、正面)的自动分类与预测。
该系统未依赖 MATLAB 深度学习工具箱的高级封装函数,而是通过底层矩阵运算手动实现了前向传播、误差计算、梯度反向传播及权重更新过程。这种设计旨在帮助用户深入理解神经网络的数学原理和内部运作机制,适合神经网络初学者进行算法研究与代码复现。
功能特性
1. 数据生成与预处理
- 模拟数据生成:内置模拟数据生成功能,能够自动生成带有特定光照特征(如左侧亮代表向左,中心高斯分布代表正面)的人脸模拟图像,包含随机噪声以测试模型鲁棒性。
- 数据标准化:对输入图像数据进行 Min-Max 归一化处理,将数值映射至 [0, 1] 区间,加速网络收敛。
- 数据集划分:支持将数据集随机打乱,并按照 8:2 的比例自动划分为训练集和测试集。
- 向量化处理:将二维图像矩阵(32x32)展平为一维向量(1024维),适配全连接神经网络的输入格式。
2. 网络构建与配置
- 三层网络结构:构建了标准的输入层、隐含层、输出层的 BP 神经网络架构。
- 参数可调:支持用户自定义关键超参数,包括图像尺寸、隐含层神经元数量(默认64)、学习率(0.05)、动量因子(0.9)及最大迭代次数(1500)。
- 激活函数:网络层间采用 Sigmoid 激活函数,增加非线性映射能力。
- 权重初始化:采用 Xavier/Glorot 初始化方法初始化权重矩阵,配合全零偏置初始化,防止训练初期的梯度消失或爆炸。
3. 模型训练(带可视化)
- 误差反向传播:实现了基于均方误差(MSE)的梯度计算与反向传播算法。
- 动量梯度下降:在标准梯度下降基础上引入了动量项(Momentum),有效利用历史梯度信息,加快收敛速度并抑制震荡。
- 早停机制:设定目标误差阈值(0.001),当训练误差低于该值时自动停止训练。
- 实时监控:训练过程中实时绘制 MSE 收敛曲线,直观展示模型的学习过程。
4. 预测与评估
- 分类预测:利用训练好的网络对测试集进行前向传播,通过 Output 层最大概率值确定预测类别。
- 性能指标:计算并输出测试集的整体识别准确率(Accuracy)。
- 混淆矩阵:绘制自定义混淆矩阵热力图,展示模型在不同类别上的分类情况(真值 vs 预测值)。
- 可视化抽样:随机抽取测试集中的 9 个样本进行可视化展示,并在图像上方标注“真实标签”与“预测标签”,若预测错误则以红色字体高亮示警。
系统要求
- MATLAB R2016a 或更高版本(需支持基本的绘图与矩阵运算)。
- 无需额外的神经网络工具箱(System 纯手写实现)。
详细实现逻辑与算法说明
主流程 (main)
- 参数初始化:设定随机种子以保证结果可复现,定义网络结构参数(输入 1024 节点,输出 5 节点对应 5 个方向)。
- 数据准备:调用生成函数创建 600 个样本,进行归一化和乱序划分。
- 前向传播训练:
* 计算隐含层输出:输入 × 权重1 + 偏置1 -> Sigmoid 激活。
* 计算输出层输出:隐含层输出 × 权重2 + 偏置2 -> Sigmoid 激活。
- 误差计算与反向传播:
* 计算输出层误差项 Delta,利用 Sigmoid 导数公式
f(x)*(1-f(x))。
* 将误差反向传播至隐含层,计算隐含层 Delta。
* 计算权重和偏置的梯度。
- 权重更新:应用公式
W_new = W_old + lr * gradient + momentum * prev_gradient 更新参数。 - 可视化更新:每隔一定 Epoch 刷新误差曲线图。
- 测试与分析:在测试集上运行一次前向传播,通过
max 函数获取分类结果,计算准确率并绘制评估图表。
关键辅助函数
- init_bp_network:负责网络的初始化。使用 Xavier 初始化公式
(rand - 0.5) * 2 * sqrt(6 / (nin + nout)) 生成分布合理的初始权重,确保信号在网络中传输时方差保持一致。 - active_func:实现了 Sigmoid 激活函数,用于引入非线性因素。同时保留了扩展 Tanh 或 Linear 的接口结构。
- preprocess_data:数据预处理管道。执行类型转换、最大最小归一化(
(X-min)/(max-min))、随机打乱索引以及数据集切分。 - generate_synthetic_data:模拟数据生成器。
* 根据预设的 5 种类别(左、右、上、下、正),生成对应的灰度梯度图像或高斯光斑图像。
* 叠加随机高斯噪声,模拟真实环境中的干扰。
* 将生成的二维图像矩阵直接展平为行向量,作为数据集输出。
- confusion_matrix_custom:手动统计预测结果与真实标签的对应关系,生成 5x5 的混淆矩阵用于绘图。
使用方法
- 确保 MATLAB 当前工作目录中包含
main.m 文件。 - 直接运行
main 函数。 - 系统将自动开始:
* 生成模拟数据。
* 弹出图形窗口显示训练过程中的误差下降曲线。
* 训练结束后,更新图形窗口,显示混淆矩阵和随机抽样的预测结果对比图。
* 在命令行窗口输出最终的测试集准确率。