深度学习----编程练习 1.2.2 基于神经网络思维的逻辑回归

基于神经网络思维的逻辑回归

欢迎来到你第一个编程作业!你将会建立一个逻辑回归分类器识别猫。本次作业将带领你怎样以神经网络思维实现它,同时你也会对深度学习有一个直观的印象。

介绍:

  • 不要在你的代码中使用循环(for/while),除非介绍中明确要求你这么做。

你将能学到:

  • 建立学习算法的常用结构,包括:
    • 初始化参数
    • 计算成本函数和它的梯度
    • 使用一个优化算法(梯度下降)
  • 将以上 3 个函数按照正确的顺序放到一个主要的模型函数中。

1 - 开发包(packages)

首先,让我们先运行下面的单元来输入本次作业中你需要用到的所有开发包。

  • numpy 是 Python 科学计算中基本的开发包
  • h5py 是一个作用于 H5 文件数据的常用开发包
  • [matplotlib]((http://matplotlib.org) 是 Python 中一个著名的绘图库
  • PILscipy 在这里用于最后使用你自己的图像测试你的模型

在这里插入图片描述

2 - 问题集概述

问题陈述: 你会得到一个数据 (“data.h5”) 包含:

- 一个训练集 m_train,图像被被标为猫 (y = 1) 或者 不是猫 (y = 0)
- 一个测试集 m_test,图像被标为猫或者不是猫
- 每个图像的形状(shape)是 (num_px, num_px, 3) ,3 是 3通道 (RGB)。因此,每个图像是一个
正方形(长 = num_px)以及(高 = num_px)

你将会建立一个简单的图像识别算法,它能正确判断图像是不是一只猫。

首先,让我们对数据集更熟悉一些,通过下面的代码下载数据。
在这里插入图片描述
我们在图像数据的最后添加 “orig”,之后我们先对他们进行处理。在处理之后,我们的命名将是 train_x 和 test_set_x(标签 train_set_y 和 test_set_y 不需要任何处理)

train_set_x_orig 和 test_set_x_orig 的每一行都是代表一个图像的数组。你可以通过运行下面的代码来查看一个样本。你也可以改变 index 值重新运行来查看其他的图片。
在这里插入图片描述
在深度学习中的许多 bug 都来自于矩阵/向量 不满足。如果你可以使你的矩阵/向量变为一条线,你将会在排除许多 bug 上走一大步。

练习: 查找以下变量的值:

  • m_train (训练样本的数量)
  • m_test (测试样本的数量)
  • num_px (等于训练图像的高/宽)

记住,train_set_x_orig 是一个形状为(m_train, num_px, num_px, 3)的 numpy-array 数组。例如,你可以通过 train_set_x_orig.shape[0] 得到 m_train
在这里插入图片描述
为了方便起见,你现在需要重构图像形状(num_px, num_px, 3)为一个形状(num_px ∗ * num_px ∗ * 3, 1)的 numpy 数组,它的每一行代表一个展开的图像。它应当有 m_train 列。

**练习:**重构训练和测试数据集,由此图像大小 (num_px, num_px, 3) 被展开成一个形状为(num_px ∗ * num_px ∗ * 3, 1)的向量。

在你想要将矩阵 X (a, b, c, d) 展开成矩阵 matrix_X_flatten (b ∗ * c ∗ * d, a)时,可以使用这样一个小技巧:

X_flatten = X.reshape(X.shape[0], -1).T  #X.T 是 X 的转置

在这里插入图片描述
为了表示图像颜色,必须为每一个像素指定红、绿、蓝通道(RGB),因此像素值实际是区间 0-255 的 3 个数字组成的向量。

在机器学习中一种常见的处理步骤是对数据集进行集中化和标准化,意思是,每个样本减去整个 numpy 数组的均值后除以整个 numpy 数组的标准差。但是对于图像数据集,这将更加简单方便并且表现也很好。你只需要将数据集的每一行除以 255就可以了。

你需要记住:
对一个新数据集预处理的步骤是:

  • 计算问题(m_train, m-test, num_px,…)的维度和形状
  • 重构数据。例如现在每个样本是一个(num_px ∗ * num_px ∗ * 3, 1)的向量
  • 数据标准化

3 - 学习算法的常见结构

你将使用神经网络思维建立一个逻辑回归。下面的图片解释了为什么逻辑回归实际上是一个非常简单的神经网络在这里插入图片描述
例如 x {x} x (1) z ( i ) = w T x ( i ) + b z^{(i)} = w^{T}x{(i)} + b \tag{1} z(i)=wTx(i)+b(1)
(2) y ^ ( i ) = a ( i ) = s i g m o i d ( z ( i ) ) \hat{y}^{(i)} = a^{(i)} = sigmoid(z^{(i)}) \tag{2} y^(i)=a(i)=sigmoid(z(i))(2)
(3) L ( a ( i ) , y ( i ) ) = − y ( i ) l o g ( a ( i ) ) − ( 1 − y ( i ) ) l o g ( 1 − a ( i ) ) \mathcal{L}(a^{(i)}, y^{(i)}) = -y^{(i)}log(a^{(i)}) - (1 - y^{(i)})log(1 - a^{(i)}) \tag{3} L(a(i),y(i))=y(i)log(a(i))(1y(i))log(1a(i))(3)
损耗就由以上所有训练样本求和得出:
(6) J = 1 m ∑ i = 1 m ( a ( i ) , y ( i ) ) J = \frac{1}{m}\sum_{i = 1}^m \mathcal(a^{(i)}, y^{(i)}) \tag{6} J=m1i=1m(a(i),y(i))(6)

**主要步骤:**在本次练习中,你将会执行以下步骤:

- 初始化模型参数
- 通过最小化成本函数为模型学习参数
- 使用学习好的参数进行预测(在测试集)
- 分析结果并得出结论

4 - 构建算法的各个部分

建立一个神经网络的主要步骤是:

  1. 确定模型结构(例如输入特征的数量)
  2. 初始化模型参数
  3. 循环:
    • 计算当前损失(前向传播)
    • 计算当前梯度(反向传播)
    • 更新参数(梯度下降)

你通常分 1-3 次构建,之后将他们共同放入一个函数中。我们称这个函数为 model()

4.1 - 帮助函数

**练习:**使用 “Python Basics” 中的代码实现 sigmoid().你已经看过上面的图像了,你需要计算 s i g m o i d ( w T x + b ) = 1 1 + e − ( w T x + b ) sigmoid(w^{T}x + b) = \frac{1}{1+e{-(w^{T}x + b)}} sigmoid(wTx+b)=1+e(wTx+b)1做预测。使用 np.exp()在这里插入图片描述

4.2 - 初始化参数

**练习:**在下面的单元中实现初始化参数。你不得不将 w 初始化一个零向量。如果你不知道使用什么 numpy 函数,试试 Numpy 库文件 np.zeros()
在这里插入图片描述

4.3 - 前向传播和反向传播

现在你的参数已经被初始化,你可以为学习算法做 “前向” 和 “反向” 传播这一步了。

练习: 实现一个 propagate() 函数,计算损耗函数和它的梯度

提示:
前向传播

  • 得到 X
  • 计算 A = σ ( w T X + b ) = ( a ( 0 ) , a ( 1 ) , . . . , a ( m − 1 ) , a ( m ) ) {A = \sigma(w^{T}X + b) = (a^{(0)}, a^{(1)}, ..., a^{(m-1)}, a^{(m)})} A=σ(wTX+b)=(a(0),a(1),...,a(m1),a(m))
  • 计算损耗函数: J = − 1 m ∑ i = 1 m y ( i ) l o g ( a ( i ) ) + ( 1 − y ( i ) ) l o g ( 1 − a ( i ) ) {J = -\frac{1}{m}\sum_{i = 1}^m y{(i)}log(a^{(i)}) + (1 - y^{(i)})log(1 - a^{(i)})} J=m1i=1my(i)log(a(i))+(1y(i))log(1a(i))

这有你将要使用的两个公式:
(7) ∂ J ∂ w = 1 m X ( A − Y ) T \frac{\partial J}{\partial w} = \frac{1}{m}X(A - Y)^{T} \tag{7} wJ=m1X(AY)T(7)
(8) ∂ J ∂ b = 1 m ∑ i = 1 m ( a ( i ) − y ( i ) ) \frac{\partial J}{\partial b} = \frac{1}{m}\sum_{i = 1}^m(a^{(i)} -y^{(i)}) \tag{8} bJ=m1i=1m(a(i)y(i))(8)
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

最优化

  • 你已经初始化的参数
  • 你也能够计算损失函数和他的梯度
  • 现在你想要使用梯度下降算法更新参数

**练习:**实现优化函数。目标是通过最小化成本函数 J {J} J 学习 w {w} w b {b} b。对于一个参数 θ {\theta} θ,更新的规则是 θ = θ − α d θ {\theta = \theta - \alpha d\theta} θ=θαdθ. α 是 学 习 率 {\alpha 是学习率} α

在这里插入图片描述在这里插入图片描述
在这里插入图片描述
练习: 之前的函数将会输出 w 和 b。我们能够使用 w 和 b 预测数据集 X 的标签。实现 predict() 函数。计算预测值需要两步:

  1. 计算 Y ^ = A = σ ( w T X + b ) {\hat{Y} = A = \sigma(w^TX + b)} Y^=A=σ(wTX+b)
  2. 将输入转换为一个 0(如果 activation <= 0.5)或者 1(如果 activation > 0.5),将预测值存储到 Y_prediction 如果你希望的话,可以在一个 for 循环中使用 if/else 语句(也有向量化的方法)。

在这里插入图片描述在这里插入图片描述
需要记住的是:
你已经实现了下列函数:

  • 初始化(w, b)
  • 优化损失迭代学习参数(w,b)
  • 计算成本函数和梯度
  • 使用梯度下降算法更新参数
  • 使用学习后的 (w,b)预测给出样本集的标签

5 - 将所有函数放入到一个模型中

你将会看到整个模型是怎样通过将所有砖块(之前实现的函数)按照正确的顺序放在一起构成的。
**练习:**实现模型函数。使用下面的标记。

  • Y_prediction 是你在测试集所得的预测值
  • Y_prediction_train 是训练集所得的预测值
  • w, costs, grads 是 optimize() 的输出

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
**注:**训练准确度接近 100%。如果你检查一下:你的模型正在运行,并且最大化的拟合你的训练数据。测试误差是 68%。这对于这个简单的模型来说还算不错,我们使用的数据集很小,并且逻辑回归是一个线性分类器。但是别担心,你将会在下周建立一个更好的分类器!
同样,你可以很清晰的看到你的模型过拟合了训练数据,接下来你将学习如何处理过拟合,例如使用正则化。使用下面的代码你可以查看测试集的数据。
在这里插入图片描述
让我们画出成本函数和梯度:
在这里插入图片描述
**解释:**你可以看到成本函数在下降。它表明参数正在被学习。可是,你看到你可能使用训练集训练模型太过了。返回这个单元,并尝试减少迭代的次数。你可能看到训练集准确度度上升,但是测试集准确下降。这叫做过拟合



之后的选做就不再做了。学习率在机器学习中已经讲过了,其实它举的例子并不好,不应该在训练集测试学习率。

在本次作业中你需要记住的是:

  1. 处理数据很重要
  2. 你分别是实现了每一个函数 initialize(), propagate(), optimize()。之后你建立了一个模型。
  3. 改变学习率将会给算法带来巨大的改变
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值