用1层隐藏层的神经网络分类二维数据
欢迎来到第3周的编程作业。 现在是时候建立你的第一个神经网络了,它将具有一层隐藏层。 你将看到此模型与你使用逻辑回归实现的模型之间的巨大差异。
你将学到如何:
- 实现具有单个隐藏层的2分类神经网络
- 使用具有非线性激活函数的神经元,例如tanh
- 计算交叉熵损失
- 实现前向和后向传播
1 安装包
让我们首先导入在作业过程中需要的所有软件包。
- numpy是Python科学计算的基本包。
- sklearn提供了用于数据挖掘和分析的简单有效的工具。
- matplotlib 是在Python中常用的绘制图形的库。
- testCases提供了一些测试示例用以评估函数的正确性
- planar_utils提供了此作业中使用的各种函数
# Package imports
import numpy as np
import matplotlib.pyplot as plt
from testCases import *
import sklearn
import sklearn.datasets
import sklearn.linear_model
from planar_utils import plot_decision_boundary, sigmoid, load_planar_dataset, load_extra_datasets
%matplotlib inline
np.random.seed(1) # set a seed so that the results are consistent
2 数据集
首先,让我们获取处理的数据集。 以下代码会将“flower” 2分类数据集加载到变量 X
和 Y
中。
使用matplotlib可视化数据集。 数据看起来像是带有一些红色(标签y = 0)和一些蓝色(y = 1)点的“花”。 我们的目标是建立一个适合该数据的分类模型。
# Visualize the data:
plt.scatter(X[0, :], X[1, :], c=Y[0, :], s=40, cmap=plt.cm.Spectral);
现在你有:
- 包含特征(x1,x2)的numpy数组(矩阵)X
- 包含标签(红色:0,蓝色:1)的numpy数组(向量)Y。
首先让我们深入地了解一下我们的数据。
练习:数据集中有多少个训练示例? 另外,变量“ X”和“ Y”的“shape”是什么?
提示:如何获得numpy数组的shape维度?
X有400个样本,每个样本有2个特征。
3 简单Logistic回归
在构建完整的神经网络之前,首先让我们看看逻辑回归在此问题上的表现。 你可以使用sklearn的内置函数来执行此操作。 运行以下代码以在数据集上训练逻辑回归分类器。
# Train the logistic regression classifier
clf = sklearn.linear_model.LogisticRegressionCV();
clf.fit(X.T, Y[0, :].T);
现在,你可以运行下面的代码以绘制此模型的决策边界:
# Plot the decision boundary for logistic regression
plot_decision_boundary(lambda x: clf.predict(x), X, Y)
plt.title("Logistic Regression")
# Print accuracy
LR_predictions = clf.predict(X.T)
print ('Accuracy of logistic regression: %d ' % float((np.dot(Y,LR_predictions) + np.dot(1-Y,1-LR_predictions))/float(Y.size)*100) +
'% ' + "(percentage of correctly labelled datapoints)")
说明:由于数据集不是线性可分类的,因此逻辑回归效果不佳。 让我们试试是否神经网络会做得更好吧!
4 神经网络模型:
从上面我们可以得知Logistic回归不适用于“flower数据集”。现在你将训练带有单个隐藏层的神经网络。
这是我们的模型:
数学原理:
根据所有的预测数据,你还可以如下计算损失J:
提示:
建立神经网络的一般方法是:
1.定义神经网络结构(输入单元数,隐藏单元数等)。
2.初始化模型的参数
3.循环:
- 实现前向传播
- 计算损失
- 后向传播以获得梯度
- 更新参数(梯度下降)
我们通常会构建辅助函数来计算第1-3步,然后将它们合并为nn_model()
函数。一旦构建了nn_model()
并学习了正确的参数,就可以对新数据进行预测
4.1 定义神经网络
练习:定义三个变量:
- n_x:输入层的大小
- n_h:隐藏层的大小(将其设置为4)
- n_y:输出层的大小
提示:使用shape来找到n_x和n_y。 另外,将隐藏层大小硬编码为4。