NKUMachineLearning-lab3.2-神经网络反向传播
### NKUMachineLearning-lab3.2-神经网络反向传播 #### 实验目标与背景 本实验的主要目的是实现一个神经网络模型以解决手写数字识别的问题。具体来说,实验包含两个主要部分: 1. **前向传播**:构建一个神经网络模型,使用预设的参数实现前向传播,进而识别0到9的手写数字。 2. **反向传播**:通过实现反向传播算法来优化神经网络的参数,进一步提高模型识别手写数字的能力。 #### 实验数据 实验中使用的数据集包括: - **ex3data1.txt**:包含5000个20×20像素的手写数字灰度图像的训练样本。每个图像被展开成一个400维的向量,标签存储在最后一列。 - **theta1.txt & theta2.txt**:分别为神经网络的第一层和第二层参数。 #### 实验步骤 ##### 1. 前向传播 **1.1 读取数据** 需要读取数据集和预设参数。使用`loadtxt`函数读取`ex3data1.txt`中的数据,并将其存储为`ex3data1`。然后分别使用`X`存储前400列数据(图像数据),使用`y`存储第401列数据(标签)。接着,读取`theta1.txt`和`theta2.txt`中的数据,存储为`theta1`和`theta2`。 **1.2 可视化数据** 从5000张图片中随机选择100张进行可视化,以便直观地理解数据集的性质。 **1.3 神经网络前向传播** 神经网络模型包含三层:输入层、隐藏层和输出层。输入层有400个单元(对应20×20的图像像素),隐藏层有25个单元,输出层有10个单元。在这一部分,需要实现`feedforward_propagation(X, Theta1, Theta2)`函数,完成前向传播。特别需要注意的是,传入的`X`要求为一维数组,即实现单个样本的前向传播。完成后,运行准确率预测代码,模型应能达到约97.5%的准确率。 ##### 2. 反向传播 **2.1 读取并可视化数据** 这一部分与前面的可视化步骤相似,但数据文件格式为`.mat`,使用`scipy`库中的`loadmat()`函数读取。`.mat`文件格式比`.txt`格式具备更高的读写速度,更节省空间且能更好地保存结构化数据。同样地,对数据进行可视化,以确保数据的正确性。 **2.2 模型表示** 与前向传播相同的神经网络结构:输入层400个单元、隐藏层25个单元、输出层10个单元。需要对输入数据`x`进行处理,增加一个维度以方便偏置项的计算。此外,还需要对标签`y`进行one-hot编码。 **2.3 正则化的神经网络** 在这一部分,需要完成用于训练网络的主要函数。这些函数包括: - **前向传播函数** `feedForwardProp(Theta1, Theta2, x)`:与之前实验中的前向传播实现类似,但注意这次`x`为二维数组,即传入的是5000×400的特征矩阵。 - **损失计算函数** `nnCostReg(all_theta, x, y, lmd)`:计算正则化的损失函数,这里的`all_theta`是指所有参数组成的向量,`x`是输入特征矩阵,`y`是one-hot编码后的标签矩阵,`lmd`是正则化系数。 - **梯度计算函数**:计算损失函数关于各个参数的梯度。 #### 总结 本实验涵盖了神经网络的基本构造及其训练过程,包括前向传播和反向传播两个关键环节。通过实现这些步骤,不仅可以了解神经网络的工作原理,还能掌握如何使用这些工具解决实际问题——例如手写数字识别。实验不仅要求学生能够正确地构建和训练神经网络模型,还要求他们理解并实施正则化策略,这对于防止过拟合非常重要。整个实验过程不仅锻炼了编程技巧,还加深了对神经网络及其应用的理解。
- 粉丝: 44
- 资源: 6
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助