Numpy 实现全连接神经网络

神经网络与深度学习实验报告

一、实验名称

Numpy 实现全连接神经网络

二、实验要求

用 python 的 numpy 模块实现全连接神经网络。网络结构为一个输入层、一个隐藏层、一个输出层。隐藏层的激活函数为 Relu 函数,输出层的激活函数为 softmax 函数,损失函数为交叉熵。
Numpy 实现全连接神经网络_第1张图片

图1-网络结构示意图

三、实验目的

通过学习的前馈神经网络基本原理(网络结构,损失函数,参数学习),使用numpy实现神经网络,进一步加深对神经网络的理解。掌握神经网洛原理和方法。

四、实验过程

4.1前馈神经网络

4.1.1环境配置

所需的包有:numpy,tensorflow,keras
在这里插入图片描述

4.1.2准备数据

采用手写字体数据集mnist,训练数据集包含60000个样本,测试数据集包含10000个样本,每张图片由28x28个像素点构成,每个像素点用一个灰度值表示,在这里,将28x28得像素展开为一个一维向量,并对每个像素值进行标准化处理,标签为0-9。
在这里插入图片描述

4.1.3定义矩阵乘法类

矩阵乘法类包括向前传播计算隐藏层的输入矩阵X和反向传播计算权重矩阵W和输入矩阵X的梯度,由输出矩阵Y的梯度grad_y计算而来,得到loss关于X矩阵和W矩阵的梯度,grad_x和grad_w
Numpy 实现全连接神经网络_第2张图片

4.1.3定义Relu类,Softmax类,交叉熵类

Relu类包括向前传播计算激活值,作为下一层的输入矩阵X,反向传播根据输出值Y的梯度grad_y计算损失函数梯度。Softmax类作为输出层的激活函数,交叉熵类作为损失函数的计算。
Numpy 实现全连接神经网络_第3张图片
Numpy 实现全连接神经网络_第4张图片

4.1.4定义模型

包括网络权重矩阵的初始化,模型向前传播和反向传播计算loss关于权重矩阵W的梯度
Numpy 实现全连接神经网络_第5张图片

4.1.5计算训练集准确率,迭代,计算测试集loss和准确率函数

根据Softmax值计算准确率,根据交叉熵损失函数计算loss,根据梯度值更新权重矩阵。
Numpy 实现全连接神经网络_第6张图片

4.1.5模型训练与评价

划分训练集和测试集,标签处理,设置迭代次数,记录准确率和loss值。
Numpy 实现全连接神经网络_第7张图片

4.2更改神经网络拓扑结构、激活规则和学习算法

4.2.1改变激活函数(sigmoid激活函数)

原始代码中采用的是Relu函数,Relu优点: relu函数在大于0的部分梯度为常数,所以不会产生梯度消失现象.。而对于sigmod函数,在正负饱和区的梯度都接近于0,可能会导致梯度消失现象。Relu函数的导数计算更快,所以使用梯度下降时比Sigmod收敛起来要快很多。Relu缺点:Relu死亡问题。Sigmod优点:具有很好的解释性,将线性函数的组合输出为0,1之间的概率。Sigmodu缺点:激活函数计算量大,反向传播求梯度时,求导涉及除法。反向传播时,在饱和区两边导数容易为0,即容易出现梯度消失的情况,从而无法完成深层网络的训练。自定义Sigmoid函数类,将激活函数更改,代码如下:
Numpy 实现全连接神经网络_第8张图片

4.2.2改变学习算法(小批量梯度下降)

原始代码中采用的是批量梯度下降算法,每次需要计算所有样本的交叉熵损失函数,当样本数过大时,计算量大,随机梯度下降法的缺点是无法利用计算机的并行计算能力。小批量梯度下降算法(Mini-Batch Gradient Descent)是批量梯度下降和随机梯度下降的折中。每次迭代时,选取小部分样本来计算梯度并更新参数。这样既可以兼顾随机梯度下降法的有点,也可以提高训练效率。在实际应用中,小批量梯度下降算法有收敛快、计算开销小的优点。具体代码如下:
Numpy 实现全连接神经网络_第9张图片

4.2.3改变网络结构(增加层数和神经元个数)

为了使模型精度更高,增加了网络层数,由一层隐藏层变为两层隐藏层,神经元个数为100,具体代码如下:
Numpy 实现全连接神经网络_第10张图片

五、实验结果
Numpy 实现全连接神经网络_第11张图片
Numpy 实现全连接神经网络_第12张图片

六、实验总结

本次实验通过numpy实现了前馈神经网络的搭建与训练过程,将数学理论推导通过代码实现,加深了对神经网络的理解,同时通过对神经网络拓扑结构、激活规则和学习算法的更改,比较前后模型学习能力,与理论知识相结合,有很大的收获。根据实验结果对比分析得到了如下心得体会:
(1) 随着网络层数的加深和神经元个数的增加,模型的拟合能力会变强。
(2) Sigmoid激活函数在收敛速度上不如Relu函数,原因应该是Sigmoid函数两端饱和,易发生梯度消失问题,在本次实验中效果一般。
(3) 小批量梯度下降算法比批量梯度下降算法收敛速度快很多,且模型的准确率更高。
(4) 综合模型采用激活函数,3层神经网络(2层隐藏层),小批量梯度下降算法,模型的收敛速度快,在eopch为20时就已基本收敛,且准确率最高,在训练集和测试集上分别为0.95358和0.9494。

在实验的过程中也遇到了问题,当加深神经网络或增加神经元个数时,输出层Softmax函数在计算时会发生上溢出,但是输入时,像素值已经进行了标准化,通过查阅资料以及和同学讨论后发现,可能是因为权重初始化时值较大,随着神经网络层数的增加,向前传播不断累积,导致最后输出时值较大,做指数运算后数值太大导致溢出,解决方案有:减小初始化权重值并适当增大学习率,从Softmax函数计算做出改变。

你可能感兴趣的:(神经网络与深度学习,numpy,神经网络,python)