前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >课后作业(二):如何用一个只有一层隐藏层的神经网络分类Planar data

课后作业(二):如何用一个只有一层隐藏层的神经网络分类Planar data

作者头像
企鹅号小编
发布2018-01-31 10:09:43
1.5K0
发布2018-01-31 10:09:43
举报
文章被收录于专栏:人工智能人工智能人工智能

来源:sandipanweb

编译:Bot

编者按:之前,论智曾在TOP 10:初学者需要掌握的10大机器学习(ML)算法介绍了一些基础算法及其思路,为了与该帖联动,我们特从机器学习热门课程HSE的Introduction to Deep Learning和吴恩达的Neural Networks and Deep Learning中挑选了一些题目,演示Python、TensorFlow和Keras在深度学习中的实战应用。

“课后作业”第二题如何用一个只有一层隐藏层的神经网络分类Planar data,来自吴恩达deeplearning.ai。注:本文所列代码都不是完整答案,请根据注释思路自行填空。

在这个任务中,我们需要从头开始训练一个单隐藏层神经网络,并和另一个由logistic算法训练的分类器对比差异。

我们的目标是:

实现一个只有一层隐藏层的二分类神经网络;

使用非线性激活函数,如tanh;

计算交叉熵损失;

实现前向传播和反向传播。

数据集

下图是我们要处理的“flower”二分类数据集,红蓝两种颜色表示两种不同的数据类型。训练样本大小m=400。

简单Logistic回归

在建立一个完整的神经网络前,我们先来看看Logistic回归在这个问题上的实现方法。我们可以直接用sklearn的内置函数来进行分类,输入以下代码在数据集上训练分类器:

在训练时,我们还需要绘制分类器的决策边界和输出准确率,这就意味着要在上述代码后加上以下内容:

Logistic回归准确率(正确标记数据点的百分比):47%。

注:由于这个数据集不是线性可分的,所以Logistic回归的表现不太好,47%的准确率太低了,希望神经网络能有更好的表现。

神经网络模型

由于Logistic回归效果不佳,所以我们要用python numpy从头搭建并训练一个只有一层隐藏层的神经网络。

根据吴老师的题设,我们的模型应该长这样:

而搭建神经网络的一般方法是:

定义神经网络结构(定义输入神经元、隐藏神经元,等等);

初始化模型参数;

Loop。

实现前向传播

计算损失

实现反向传播并获得梯度

更新参数(梯度下降)

定义神经网络结构

定义三个变量及layer_sizes函数,其中:

n_x:输入层节点(神经元、单元)数;

n_h:隐藏层节点数;

n_y:输出层节点数。

初始化模型参数

执行函数initialize_parameters()。

说明:

Loop

执行forward_propagation()。

说明:

请看上稳重模型图下方的数学算式;

使用sigmoid()函数;

使用np.tanh()函数,numpy库里有现成的;

必须进行的步骤:(1)用parameters[".."]从“parameters”中(initialize_parameters()的输出)中检索出所有参数;(2)实现前向传播,计算Z[1]、A[1]、Z[2]Z[1]、A[1]、Z[2]和A[2]A[2](数据集中所有样本的预测值的向量);

将反向传播所需的值存储在“cache”中,“cache”会被BP算法定义为一个输入。

执行compute_cost()计算损失值J(吴恩达喜欢把loss写成代价cost),这里有多种计算交叉熵损失的方法。

在进行前向传播期间,我们计算获得了一些值并缓存在“cache”中,现在它们可用来实现反向传播。

实现函数backward_propagation()

说明:反向传播通常是深度学习中最难(涉及大量数学计算)的部分,由于本文是习题解答,所以我们不会对它做详细介绍。下图是一张关于反向传播的课程幻灯片,我们会使用图片右侧的6个方程,来构建一个向量化的实现。

执行更新规则,进行梯度下降,我们必须用(dW1, db1, dW2, db2)来更新(W1, b1, W2, b2)。

一般梯度下降规则:θ = θ - α(∂J / ∂θ ),其中α为学习率,θ表示参数。

下图是Adam Harley制作的一张动图,显示梯度下降算法在不同学习率上的表现,其中有良好学习率时曲线收敛,反之则曲线发散。

nn_model()

建立神经网络模型nn_model(),并集成之前的成果。需要注意的一点是,这些分步进行的函数必须以正确的顺序放进模型中。

预测

用predict()来使模型进行预测,并用前向传播输出预测损失。

接下来就可以运行我们的神经网络模型了:

每隔1000次迭代输出的损失示例:

准确率:90%。

与Logistic回归相比,神经网络模型的准确率非常高,它精准区分了每片花瓣上数据的所属类别,证明它能学习高度非线性的决策边界。

调整隐藏层大小

之前我们示例的都是包含4个节点的隐藏层,让我们调整节点数量,具体看看模型的分类表现。

可以发现,在过拟合(20)出现之前,较大的模型(隐藏层包含更多节点)能更好地适应训练集,而在“flower”中表现最优的似乎是包含5个节点的模型,它的分类更合理,而且也没有出现过拟合。对于这个问题,我们可以用正则化(regularization)来减少大型模型的缺陷,比如实现一个性能良好的隐藏层中包含50个节点的神经网络模型。

本文来自企鹅号 - 全球大搜罗媒体

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文来自企鹅号 - 全球大搜罗媒体

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档