来源: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个节点的神经网络模型。
领取专属 10元无门槛券
私享最新 技术干货