用Python实现单隐层神经网络实验报告

实验目的:
(1) 了解神经网络的向量、矩阵表示
(2) 构建具有单隐藏层的2类分类神经网络
①定义神经网络结构(输入单元的数量,隐藏单元的数量等)。
②初始化模型的参数
③循环(实现前向传播、计算得失、实现向后传播、更新参数(梯度下降))
④整合(将前面定义的函数合并到一个nn_model()函数中)
⑤预测(构建好nn_model()并学习正确的参数之后,便可以预测新的数据)
(3) 使用具有非线性激活功能的激活函数(如Tanh)
(4) 计算交叉熵损失(损失函数)
实验环境:
1、64 位电脑,8G 以上内存、win10 系统
2、Spyder (Anaconda)
实验理论:。
(1) 搭建神经网络模型如下图:
用Python实现单隐层神经网络实验报告_第1张图片
(2) 对第i个训练样本的计算方法如下:
用Python实现单隐层神经网络实验报告_第2张图片
(3) 交叉熵:衡量两个分布的差异(用于计算损失中da的计算)
在这里插入图片描述
(4) tanh求导函数的推导过程(用于误差反向传播dz的计算z)
用Python实现单隐层神经网络实验报告_第3张图片
(5) sigmoid求导函数推导过程
在这里插入图片描述在这里插入图片描述在这里插入图片描述
(6) 构建向量化实现所需的六个方程:
用Python实现单隐层神经网络实验报告_第4张图片
实验步骤及结果:
一、 导入软件包
在这里插入图片描述
二、 加载和查看数据集
1、先将一个花的图案加载到变量X和Y中,再使用matplotlib可视化数据集
用Python实现单隐层神经网络实验报告_第5张图片
测试运行:
用Python实现单隐层神经网络实验报告_第6张图片
实验结果:
用Python实现单隐层神经网络实验报告_第7张图片
2、查看简单的Logistic回归的分类结果
在这里插入图片描述
测试运行:
在这里插入图片描述
实验结果:
用Python实现单隐层神经网络实验报告_第8张图片
三、 定义神经网络结构
定义神经网络结构(n_x输入单元的数量,n_h隐藏单元的数量(这里设置为4,n_y输出层单元的数量)。
用Python实现单隐层神经网络实验报告_第9张图片
测试运行
用Python实现单隐层神经网络实验报告_第10张图片
实验结果:
在这里插入图片描述
四、 初始化模型的参数
①用随机值初始化权重矩阵:np.random.randn(a,b)*0.01来随机初始化一个维度为(a,b)的矩阵;②将骗向量初始化为零:np.zeros((a,b))用零初始化矩阵(a,b)
用Python实现单隐层神经网络实验报告_第11张图片
测试运行:
用Python实现单隐层神经网络实验报告_第12张图片
实验结果:
用Python实现单隐层神经网络实验报告_第13张图片
五、 循环
1、前向传播
①可以使用sigmoid()函数,也可使用np.tanh()函数。②使用字典类型的parameters(initialize_parameters() 的输出)检索每个参数。③实现向前传播, 计算Z[1],A[1],Z[2],A[2]( 训练集里面所有例子的预测向量)。
④反向传播所需的值存储在“cache”中,cache将作为反向传播函数的输入。
用Python实现单隐层神经网络实验报告_第14张图片
测试运行:
在这里插入图片描述
实验结果:
在这里插入图片描述
2、计算得失
①使用np.multiply()然后使用np.sum()
logprobs = np.multiply(np.log(A2),Y)
cost = - np.sum(logprobs) # 不需要使用循环就可以直接算出来。
②直接使用np.dot()
用Python实现单隐层神经网络实验报告_第15张图片
测试运行:
在这里插入图片描述
实验结果:
在这里插入图片描述
3、向后传播
在这里插入图片描述
用Python实现单隐层神经网络实验报告_第16张图片用Python实现单隐层神经网络实验报告_第17张图片
测试代码:
用Python实现单隐层神经网络实验报告_第18张图片
实验结果:
用Python实现单隐层神经网络实验报告_第19张图片
4、更新参数
我们需要使用(dW1, db1, dW2, db2)来更新(W1, b1, W2, b2)。
更新算法如下:$ \theta = \theta - \alpha \frac{\partial J }{ \partial \theta }$
α \alphaα:学习速率 θ \thetaθ :参数
我们需要选择一个良好的学习速率,我们可以看一下下面这两个图(由Adam Harley提供):
用Python实现单隐层神经网络实验报告_第20张图片用Python实现单隐层神经网络实验报告_第21张图片
用Python实现单隐层神经网络实验报告_第22张图片
测试运行:
用Python实现单隐层神经网络实验报告_第23张图片
实验结果:
用Python实现单隐层神经网络实验报告_第24张图片
六、 整合
把上面的东西整合到nn_model()中,神经网络模型必须以正确的顺序使用先前的功能
用Python实现单隐层神经网络实验报告_第25张图片
测试运行:
用Python实现单隐层神经网络实验报告_第26张图片
实验结果:
用Python实现单隐层神经网络实验报告_第27张图片
参数更新完之后就可以进行预测了
七、 预测
构建predict()来使用模型进行预测, 使用向前传播来预测结果。
predictions = KaTeX parse error: Undefined control sequence: \ at position 46: …1 & 激活值> 0.5 \\̲ ̲ 0 & \text…
用Python实现单隐层神经网络实验报告_第28张图片
测试运行:
在这里插入图片描述
实验结果:
在这里插入图片描述
八、 正式运行
测试运行:
在这里插入图片描述
实验结果:
用Python实现单隐层神经网络实验报告_第29张图片
九、 更改隐藏层节点数量
我们上面的实验把隐藏层定为4个节点,现在我们更改隐藏层里面的节点数量,看一看节点数量是否会对结果造成影响。
① 较大的模型(具有更多隐藏单元)能够更好地适应训练集,直到最终的最大模型过度拟合数据。
② 最好的隐藏层大小似乎在n_h = 5附近。实际上,这里的值似乎很适合数据,而且不会引起过度拟合。
③ 我们还将在后面学习有关正则化的知识,它允许我们使用非常大的模型(如n_h = 50),而不会出现太多过度拟合。
测试代码:
用Python实现单隐层神经网络实验报告_第30张图片
实验结果:
用Python实现单隐层神经网络实验报告_第31张图片
用Python实现单隐层神经网络实验报告_第32张图片

十、 可选深度
(1)当改变sigmoid激活或ReLU激活的tanh激活时会发生什么?
(2)改变learning_rate的数值会发生什么
(3)如果我们改变数据集呢?
1、更改数据集
测试代码:
用Python实现单隐层神经网络实验报告_第33张图片
实验结果:
用Python实现单隐层神经网络实验报告_第34张图片
2、对更改后的数据集再次整合
测试运行:
在这里插入图片描述
实验结果:
用Python实现单隐层神经网络实验报告_第35张图片
实验分析:
单隐层神经网络的实现一般要执行以下几个部分:
1、 加载数据集:将一个花的图案加载到变量X和Y中,再使用matplotlib可视化数据集,并查看简单的Logistic回归的分类结果。
2、 定义神经网络结构:n_x输入单元的数量,n_h隐藏单元的数量(这里设置为4,n_y输出层单元的数量。
3、 初始化模型的参数:①用随机值初始化权重矩阵:np.random.randn(a,b)*0.01来随机初始化一个维度为(a,b)的矩阵;②将骗向量初始化为零:np.zeros((a,b))用零初始化矩阵(a,b)。
4、 前向传播:①可以使用sigmoid()函数,也可使用np.tanh()函数。②使用字典类型的parameters(initialize_parameters() 的输出)检索每个参数。③实现向前传播, 计算Z[1],A[1],Z[2],A[2]( 训练集里面所有例子的预测向量)。④反向传播所需的值存储在“cache”中,cache将作为反向传播函数的输入。
5、 计算得失:①使用np.multiply()然后使用np.sum()
logprobs = np.multiply(np.log(A2),Y)
cost = - np.sum(logprobs) # 不需要使用循环就可以直接算出来。
②直接使用np.dot()
6、 向后传播: 在这里插入图片描述
7、 更新参数:使用(dW1, db1, dW2, db2)来更新(W1, b1, W2, b2)。
8、 整合:把上面的东西整合到nn_model()中,神经网络模型必须以正确的顺序使用先前的功能
9、 预测:构建predict()来使用模型进行预测, 使用向前传播来预测结果。
10、 正式运行
源代码可以到我的资源->单隐层神经网络.zip中下载

你可能感兴趣的:(机器学习,神经网络)