深度学习----编程练习 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 - 神经网络模型

逻辑回归对于 “花形数据” 的表现不是很好,你正在训练一个单隐层的神经网络

这是模型:
在这里插入图片描述
计算:
例如对于一个样本 x ( i ) {x^{(i)}} x(i)
(1) z [ 1 ] ( i ) = W [ 1 ] x ( i ) + b [ 1 ] ( i ) z^{[1] (i)} = W^{[1]} x^{(i)} + b^{[1] (i)}\tag{1} z[1](i)=W[1]x(i)+b[1](i)(1)
(2) a [ 1 ] ( i ) = tanh ⁡ ( z [ 1 ] ( i ) ) a^{[1] (i)} = \tanh(z^{[1] (i)})\tag{2} a[1](i)=tanh(z[1](i))(2)
(3) z [ 2 ] ( i ) = W [ 2 ] a [ 1 ] ( i ) + b [ 2 ] ( i ) z^{[2] (i)} = W^{[2]} a^{[1] (i)} + b^{[2] (i)}\tag{3} z[2](i)=W[2]a[1](i)+b[2](i)(3)
(4) y ^ ( i ) = a [ 2 ] ( i ) = σ ( z [ 2 ] ( i ) ) \hat{y}^{(i)} = a^{[2] (i)} = \sigma(z^{ [2] (i)})\tag{4} y^(i)=a[2](i)=σ(z[2](i))(4)
在这里插入图片描述
(6) J = − 1 m ∑ i = 0 m ( y ( i ) log ⁡ ( a [ 2 ] ( i ) ) + ( 1 − y ( i ) ) log ⁡ ( 1 − a [ 2 ] ( i ) ) ) J = - \frac{1}{m} \sum\limits_{i = 0}^{m} \large\left(\small y^{(i)}\log\left(a^{[2] (i)}\right) + (1-y^{(i)})\log\left(1- a^{[2] (i)}\right) \large \right) \small \tag{6} J=m1i=0m(y(i)log(a[2](i))+(1y(i))log(1a[2](i)))(6)

提示: 建立一个神经网络常用的方法是:

  1. 定义神经网络的结构(数据单元,隐藏单元,等等)
  2. 初始化模型参数
  3. 循环:
  • 实现前向传播
  • 计算损失函数
  • 实现反向传播得到梯度
  • 更新参数(梯度下降算法)

你经常建立一个帮助函数计算 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 矩阵
      在这里插入图片描述
      在这里插入图片描述

4.3 循环

**问题:**实现 forward_propagation
介绍:

  • 查看上面你的分类器的数学陈述
  • 你可以使用函数 sigma()。它是 notebook 的内置(已经导入了的)函数
  • 你可以使用函数 np.tanh()。它是 numpy 库的一部分。
  • 你需要实现的步骤是:
  1. 从 “参数” 词典中取出每一个参数(通过使用 parameters[".."],它为 initialize_parameters() 的输出)
  2. 实现前向传播。计算 Z [ 1 ] , A [ 1 ] , Z [ 2 ] , 和 A [ 2 ] {Z^{[1]}, A^{[1]}, Z^{[2]}, 和 A^{[2]}} Z[1],A[1],Z[2],A[2](你对训练集所有样本的预测值在向量)。
  • 反向传播中需要的值存储在 cache 中,cache 将会作为反向传播函数的输入。
    在这里插入图片描述
    在这里插入图片描述
    现在,你已经计算了 A [ 2 ] {A^{[2]}} A[2] (在 Python变量 “A2”),它包含每个样本的 a [ 2 ] ( i ) {a^{[2](i)}} a[2](i) ,接下来你可以计算损失函数:

(13) J = − 1 m ∑ i = 0 m ( y ( i ) log ⁡ ( a [ 2 ] ( i ) ) + ( 1 − y ( i ) ) log ⁡ ( 1 − a [ 2 ] ( i ) ) ) J = - \frac{1}{m} \sum\limits_{i = 0}^{m} \large{(} \small y^{(i)}\log\left(a^{[2] (i)}\right) + (1-y^{(i)})\log\left(1- a^{[2] (i)}\right) \large{)} \small\tag{13} J=m1i=0m(y(i)log(a[2](i))+(1y(i))log(1a[2](i)))(13)

**练习:**实现 compute_cost() 计算 成本函数 J

介绍:

  • 有许多方法能实现交叉熵损失函数。为了帮助你,我们给出我们怎样实现 − ∑ i = 0 m y ( i ) log ⁡ ( a [ 2 ] ( i ) ) - \sum\limits_{i=0}^{m} y^{(i)}\log(a^{[2](i)}) i=0my(i)log(a[2](i)):
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 你将需要计算 g [ 1 ] ′ ( Z [ 1 ] ) g^{[1]'}(Z^{[1]}) g[1](Z[1]) 因为 g [ 1 ] ( . ) g^{[1]}(.) g[1](.) 是 tanh 激活函数。如果 g [ 1 ] ( . ) g^{[1]}(.) g[1](.) 那么 g [ 1 ] ′ ( z ) = 1 − a 2 g^{[1]'}(z) = 1-a^2 g[1](z)=1a2。因此你可以使用 (1 - np.power(A1, 2)).计算
      g [ 1 ] ′ ( Z [ 1 ] ) g^{[1]'}(Z^{[1]}) g[1](Z[1])

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

**问题:**实现更新尺度。使用梯度下降算法。你将会为了更新(W1,b1,W2,b2)使用(dW1,db1, dW2, db2)

一般梯度下降规则: θ = θ − α ∂ J ∂ θ \theta = \theta - \alpha \frac{\partial J }{ \partial \theta } θ=θαθJ α \alpha α 是学习率, θ \theta θ代表一个参数

$ \theta = \theta - \alpha \frac{\partial J }{ \partial \theta }$ where α \alpha α is the learning rate and θ \theta θ represents a parameter.

**说明:**有一个好的学习率以及一个坏的学习率的梯度下降算法,图片来自于 Adam Harley
(这个搞不了,自己去练习上看吧)

在这里插入图片描述

4.4 - 将 4.1,4.2 和 4.3 放入 nn_model() 中

问题:nn_model 中建立你的神经网络模型
介绍: 神经网络模型必须将所提供的函数按照正确的顺序放入

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

4.5 预测

**问题:**使用你的模型通过建立 predict() 进行预测,使用前向传播预测结果。

记住: redictions = y p r e d i c t i o n = 1 activation > 0.5 = { 1 if  a c t i v a t i o n > 0.5 0 otherwise y_{prediction} = \mathbb 1 \text{{activation > 0.5}} = \begin{cases} 1 & \text{if}\ activation > 0.5 \\ 0 & \text{otherwise} \end{cases} yprediction=1activation > 0.5={10if activation>0.5otherwise

例如,如果你想要将矩阵 X 根据阈值设置成 0 和 1,你可能需要使用 X_new = (X > threshold)

在这里插入图片描述
是时候运行模型,并且看他在平面数据上表现的怎么样了。运行下面的代码测试你的模型
在这里插入图片描述
在这里插入图片描述
相比于逻辑回归,准确度真的很高。模型已经学习了花的叶型!神经网络甚至能够学习非线性决策边界,不像逻辑回归。
现在,让我们尝试几个隐藏层的大小

4.6 改变隐藏层的规模(选做)

运行下面的代码。他可能会花费 1- 2分钟。你将会看到不同隐藏层大小的模型的表现
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
解释:

  • 大的模型(使用更多的隐藏单元)能够更好的拟合训练集,直到最终最大的模型过拟合数据
  • 最好的隐藏层尺寸似乎是在 n_h = 5 附近。事实上,一个附近的值似乎正好拟合数据且没有过拟合。
  • 你之后将学习正则化,他让你能够使用更大的模型(例如,n_h = 50)且不会过拟合

你已经学到:

  • 建立一个完整的单隐层神经网络
  • 很好的使用非线性单元
  • 实现前向和反向传播并且训练网络
  • 看到隐藏层尺寸变化的影响,包括过拟合。



之后的不再做了

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值