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

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

十、 可选深度
(1)当改变sigmoid激活或ReLU激活的tanh激活时会发生什么?
(2)改变learning_rate的数值会发生什么
(3)如果我们改变数据集呢?
1、更改数据集
测试代码:
在这里插入图片描述
实验结果:
在这里插入图片描述
2、对更改后的数据集再次整合
测试运行:
在这里插入图片描述
实验结果:
在这里插入图片描述
实验分析:
单隐层神经网络的实现一般要执行以下几个部分:
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中下载

  • 2
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值