深度学习----编程练习 1.3 一个隐层的平面数据分类
一个隐层的平面数据分类
欢迎来到第三周的编程练习,是时候建立你的第一个神经网络了,它有一个隐藏层。你将会看到本次的模型与你之前实现的逻辑回归有非常大的不同。
你将会学习怎样
- 使用一个单一的隐藏层实现一个 2 元分类器
- 使用一个非线性**函数单元,例如 tanh
- 计算交叉熵损失
- 实现前向和反向传播
1 - 开发包
让我们先导入你在本次作业中即将使用的开发包
- numpy 是 Python 科学计算中一个基础的开发包
- sklearn 为数据最小化和数据分析提供简单有效的工具
- matplotlib 是 Python 中一个绘图库
- testCases 提供一些测试样本来评估你函数的正确性
- planar_units 提供作业中许多有用的函数
2 - 数据
首先,让我们从你将要处理的数据开始,下面的代码将会下载一个“花形的” 2 类数据集到变量 X和 Y 中
使用 matplotlib
可视化数据。一些红色的标签(y = 0)和蓝色的标签(y = 1)使得数据看起来一个“花”。你的目标是建立一个模型拟合这个数据。
注意:这里作业源代码有错误。原因是:plt.scatter 绘图函数中变量 c 需要为一个数组,而 Y 是一个矩阵。使用 np.squeeze(Y) 将 Y 转换为一个数组
你已经得到:
- 一个numpy- 数组(矩阵)X,包含你的变量(x1, x2)
- 一个numpy- 数组(向量)Y,包含你的标签(红色:0,蓝色:1)
让我们先对你的数据是什么有一个更好的印象
练习: 你有多少训练样本?或者说,变量 X 和 Y 的 shape
是多少?
提示:如何得到 numpy 数组的形状? (help)
3 - 简单的逻辑回归
在建立一个完整的神经网络之前,让我们首先看看逻辑回归是如何处理这个问题的。你可以使用 sklearn 的内置函数来完成。循行下面的代码,为数据训练一个逻辑回归分类器。
虽然不知道为什么,之后的 Y 都需要改成 Y.ravel(),也看了一些大神们的解释,可能由于刚接触 Python,没看懂。
你现在可以绘制决策边界了(这里也是,改了 Y 就没事了)
解释: 数据不是线性可分的,所以逻辑回归表现的不是很好。希望一个神经网络可以做的更好。
**PS:**实际上逻辑回归是可以做非线性划分的,我不懂 Python,所以这里不知道该怎么做,但是之前机器学习用 Matlab 就实现了非线性划分
4 - 神经网络模型
逻辑回归对于 “花形数据” 的表现不是很好,你正在训练一个单隐层的神经网络
这是模型:
计算:
例如对于一个样本
提示: 建立一个神经网络常用的方法是:
- 定义神经网络的结构(数据单元,隐藏单元,等等)
- 初始化模型参数
- 循环:
- 实现前向传播
- 计算损失函数
- 实现反向传播得到梯度
- 更新参数(梯度下降算法)
你经常建立一个帮助函数计算 1 - 3 步骤,之后将他们放入到我们称之为 nn_model()
函数中。一旦你建立 nn_model()
并且学习到正确的参数,你就可以对一个新的数据做出预测
4.1 - 定义神经网络的结构
练习: 定义 3 个变量:
- n_x: 输入层的大小
- n_h: 隐藏层的大小
- n_y: 输出层的大小
提示: 使用 X 和 Y 的形状寻找 n_x 和 n_y ,同样,对隐藏层硬编码的大小是 4
4.2 - 初始化模型参数
练习: 实现 initialize_parameters
函数
介绍:
- 确保你从参数的尺寸是正确的。如果需要,请参考上面的神经网络图
- 你将会使用随机值初始化权重矩阵
- 使用 :np.random.randn(a, b) * 0.01 随机初始化尺寸为(a,b)的矩阵
- 你将会把偏差向量初始化为 0
- 使用:np.zeros((a, b)) 初始化 尺寸为(a, b) 的 0 矩阵
- 使用:np.zeros((a, b)) 初始化 尺寸为(a, b) 的 0 矩阵
4.3 循环
**问题:**实现 forward_propagation
介绍:
- 查看上面你的分类器的数学陈述
- 你可以使用函数
sigma()
。它是 notebook 的内置(已经导入了的)函数 - 你可以使用函数
np.tanh()
。它是 numpy 库的一部分。 - 你需要实现的步骤是:
- 从 “参数” 词典中取出每一个参数(通过使用
parameters[".."]
,它为initialize_parameters()
的输出) - 实现前向传播。计算 (你对训练集所有样本的预测值在向量)。
- 反向传播中需要的值存储在
cache
中,cache
将会作为反向传播函数的输入。
现在,你已经计算了 (在 Python变量 “A2”),它包含每个样本的 ,接下来你可以计算损失函数:
**练习:**实现 compute_cost()
计算 成本函数 J
介绍:
- 有许多方法能实现交叉熵损失函数。为了帮助你,我们给出我们怎样实现:
logprobs = np.multiply(np.log(A2),Y)
cost = - np.sum(logprobs) # no need to use a for loop!
你可以使用 np.multiply()
之后使用 np.sum()
或者直接使用 np.dot()
。
(这里使用 np.dot 怎么都通不过,可能是之前运行的残留。Y = (1,400),而之前 A2(1,3))????np.multiply
怎么过的? 没搞懂
在前向传播过程中使用 cache计算,你现在可以实现反向传播了
**问题:**实现函数 backward_propagation
介绍: 反向传播经常是深度学习中最难(最多的数学计算)的部分。为了帮助你,这有一张反向传播课程的幻灯片。因为你正在建立一个向量化的实现,你将会想要使用幻灯片右边的 6 个方程
- 小技巧:
- 为了计算 dZ1 你将需要计算 因为 是 tanh **函数。如果 那么。因此你可以使用
(1 - np.power(A1, 2))
.计算
- 为了计算 dZ1 你将需要计算 因为 是 tanh **函数。如果 那么。因此你可以使用
**问题:**实现更新尺度。使用梯度下降算法。你将会为了更新(W1,b1,W2,b2)使用(dW1,db1, dW2, db2)
一般梯度下降规则: 是学习率, 代表一个参数
$ \theta = \theta - \alpha \frac{\partial J }{ \partial \theta }$ where is the learning rate and represents a parameter.
**说明:**有一个好的学习率以及一个坏的学习率的梯度下降算法,图片来自于 Adam Harley
(这个搞不了,自己去练习上看吧)
4.4 - 将 4.1,4.2 和 4.3 放入 nn_model() 中
问题: 在 nn_model
中建立你的神经网络模型
介绍: 神经网络模型必须将所提供的函数按照正确的顺序放入
4.5 预测
**问题:**使用你的模型通过建立 predict()
进行预测,使用前向传播预测结果。
记住: redictions =
例如,如果你想要将矩阵 X 根据阈值设置成 0 和 1,你可能需要使用 X_new = (X > threshold)
是时候运行模型,并且看他在平面数据上表现的怎么样了。运行下面的代码测试你的模型
相比于逻辑回归,准确度真的很高。模型已经学习了花的叶型!神经网络甚至能够学习非线性决策边界,不像逻辑回归。
现在,让我们尝试几个隐藏层的大小
4.6 改变隐藏层的规模(选做)
运行下面的代码。他可能会花费 1- 2分钟。你将会看到不同隐藏层大小的模型的表现
解释:
- 大的模型(使用更多的隐藏单元)能够更好的拟合训练集,直到最终最大的模型过拟合数据
- 最好的隐藏层尺寸似乎是在 n_h = 5 附近。事实上,一个附近的值似乎正好拟合数据且没有过拟合。
- 你之后将学习正则化,他让你能够使用更大的模型(例如,n_h = 50)且不会过拟合
你已经学到:
- 建立一个完整的单隐层神经网络
- 很好的使用非线性单元
- 实现前向和反向传播并且训练网络
- 看到隐藏层尺寸变化的影响,包括过拟合。
之后的不再做了