【吴恩达课后编程作业】第三周作业 (附答案、代码)隐藏层神经网络 神经网络和深度学习
上一篇:【课程1 - 第二周作业】 ✌✌✌✌ 【目录】 ✌✌✌✌ 下一篇:【课程1 - 第三周作业】
首先说明一下,大学生一枚,最近在学习神经网络,写这篇文章只是记录自己的学习历程,起总结复习的作用,别无它意,本文参考了zsffuture的博客、布衣先生real的博客、孔小爽的博客、何宽的博客以及Github上fengdu78老师的文章进行学习
✌ 我们要实现一个能够分类样本点的神经网络
- numpy:常用数学工具库
- matplotlib:python的画图工具
- LogisticRegression:逻辑回归模型
- lightgbm:lgb模型
- cross_val_score:交叉验证
✌ 加载训练测试数据集
- X:特征矩阵
- Y:标签
✌ 打印数据集的详细数据
查看输出结果:
✌ 神经网络介绍
现在我们的准备工作已经做好了,接下来就是搭建神经网络
单一样本的损失:
计算所有样本的平均损失值:
搭建神经网络的主要步骤是:
- 定义模型结构(例如输入特征的数量)
- 初始化模型的参数
- 不断迭代(调整参数):
3.1 计算当前损失(正向传播)
3.2 计算当前梯度(反向传播)
3.3 更新参数(梯度下降)
✌ 定义sigmoid函数
因为我们要做的是二分类问题,所以到最后要将其转化为概率,所以可以利用sigmoid函数的性质将其转化为0~1之间
✌ 定义各网络层的节点数
这里我们为什么要获取各个层的节点数呢?
原因是在初始化w、b等参数时需要确定其维度,以便于后面的传播计算
✌ 定义初始化w、b的函数
在进行梯度下降之前,要初始化w和b的值,但是这里会有个问题,为了方便我们会把w、b的值全部初始化为0,这样做是不正确的,原因是:如果都为0,会导致在传播计算时,模型对称,各个节点的参数不起作用,可以自己推到一下
所以我们要给w、b进行随机取值
本文参数维度:
- W1:(4,2)
- b1:(4,1)
- W2:(1,4)
- b2:(1,1)
✌ 定义向前传播函数
神经网络分为正向传播和反向传播
正向传播计算求出损失函数,然后反向计算各个梯度
然后进行梯度下降,更新参数
计算公式:
✌ 定义损失函数
损失函数为交叉熵,数值越小,表明模型越优秀
计算公式:
✌ 定义向后传播函数
反向计算各个梯度
然后进行梯度下降,更新参数
计算公式:
第一层的参数同理,这里要记住计算各参数梯度,就是高数中的链式法则,这也就是为什么叫做向后传播,想要计算前一层的参数导数值就要先计算出后一层的梯度值
记住这个一切都OK!!!
✌ 定义整个传播过程
一个传播流程包括:
- 向前传播
- 计算损失函数
- 向后传播
3.1 计算梯度
3.2 更新参数
✌ 定义优化器函数
目标是通过最小化损失函数 J来学习 w 和 b 。对于参数 λ,更新规则是 ,其中 λ 是学习率。
num_iter代表梯度下降时的迭代次数,就是w的改变次数,求取损失函数的最小值,即全局最优解,这里可能会产生局部最优解,会影响模型结果,这里不与阐述,可以选择其他较好的优化器
大多数优化器都是基于梯度下降这种方法,只不过具体的数学计算有些不同
✌ 定义预测函数
上面optimizer函数会输出已经训练好的w、b参数,我们可以利用它们进行预测新的样本集
进行预测两个步骤:
- 利用概率将其转化为0-1类别
- 将结果存储到y_pred中
✌ 定义模型函数
我们已经将所需要的所有函数已经封装好了,现在需要一个训练函数调用它们,完成模型的训练,model的作用就是如此
✌ 分割数据集
✌ 进行测试
我们将我们处理好的训练测试集传入,测试下模型的效果,并每迭代100次打印下损失函数的值,观察模型效果是否得到了优化
查看输出结果:
✌ 测试简易神经网络(逻辑回归模型)
我们想要对比下加入了隐藏层和不加隐藏层的效果,我们需要建立一个不带隐藏层的神经网络,不过为了方便(懒得搭了),我们直接调用sklearn中的LogisticRegression库,其实是一样的,参数采取默认参数,如果参数调整一下,模型效果可能会更好
查看输出结果:
✌ 测试LGB模型
查看输出结果: