应用于图像分类的深度神经网络:应用

完成本节后,您将完成第4周的最后编程任务,也完成本课程的最后编程任务!

您将使用您在之前的作业中实施的函数来构建深度网络,并将其应用于猫与非猫分类。 希望相对于之前的逻辑回归实现,您将看到精度的提高。

完成这项任务后,您将能够:

建立和应用深度神经网络监督学习。

1 – 包

Let's first import all the packages that you will need during this assignment.

  • numpy is the fundamental package for scientific computing with Python.

  • matplotlib is a library to plot graphs in Python.

  • h5py is a common package to interact with a dataset      that is stored on an H5 file.

  • PIL and      scipy are used here      to test your model with your own picture at the end.

  • dnn_app_utils provides the      functions implemented in the "Building your Deep Neural Network: Step      by Step" assignment to this notebook.

  • np.random.seed(1) is used to keep      all the random function calls consistent. It will help us grade your work.

2 – 数据集

您将使用与“Logistic回归作为神经网络”(作业2)相同的“猫与非猫”数据集。 您之前建立的模型在分类猫和非猫图像时的测试准确率为70%。 希望你的新模型能更好地发挥作用!

Problem Statement: You are given a dataset ("data.h5") containing:

– a training set of m_train images labelled as cat (1) or non-cat (0)
– a test set of m_test images labelled as cat and non-cat
– each image is of shape (num_px, num_px, 3) where 3 is for the 3 channels (RGB).

让我们更熟悉数据集。 通过运行下面的单元格加载数据。

 

以下代码将显示数据集中的图像。 随意更改索引并重新运行单元格多次以查看其他图像。

 

以下代码显示样本集的尺寸信息

像往常一样,在将图像馈送到网络之前,您会重塑图像的向量并对其进行标准化。代码在下面的单元格中给出。

1517667135794468.jpg

 

12288就是之前我们reshape向量时讲的,RGB的三个向量乘3,即64*64*3。

 

 

3 – 模型的结构

现在您已经熟悉数据集了,现在是构建一个深层神经网络来区分猫图像和非猫图像的时候了。

你将建立两个不同的模型,就像之前那个PART.1中一样,一个2层模型一个L层模型。

然后将要比较这两个模型。关于结构图在PART.1中都已经叙述,在此不再重述。

3.1 – 2层深度神经网络模型

对于2层模型来说,它可以被简单概括为: INPUT -> LINEAR -> RELU -> LINEAR -> SIGMOID -> OUTPUT.

关于2层模型的结构图做出下面解释:
– 输入是一个(64,64,3)的图像,然后reshape为(12288,1)。注意这是一个样本的向量
– 相应的矢量[x0,x1,…,x12287]T接下来就右乘权重矩阵W1,W1的尺寸为(n[l],12288)。要牢记权重矩阵的维度规律
– 然后,添加一个偏差项,并采用激活函数(采用RELU)获得以下向量: [a[1]0,a[1]1,…,a[1]n[1]1]T.
– 重复上述过程,得到每一个节点的值
– 继续将上面的结果的过程乘第二个权重矩阵W2,然后增加偏差项。
– 最后,利用sigmoid函数得到结果。如果结果大于0.5,则是猫,否则不是猫。

3.2 -L层深度神经网络模型

很难用以上的表示方法来表示一个L层深度神经网络模型。但是,在这里我们提供了一个简化的模型:

1517667181127511.jpg

模型可以被简单表述为: [LINEAR -> RELU] × (L-1) -> LINEAR -> SIGMOID

关于L层模型的结构图做出下面解释:
– 输入是一个(64,64,3)的图像,然后reshape为(12288,1)。注意这是一个样本的向量
– 相应的向量 [x0,x1,…,x12287]T 与权重矩阵W[1]相乘,增加偏差项b[1]。 结果被称为线性单元。
– 接下了对这个线性单元做RELU。然后这个过程重复做所需要的次数。
– 最后,利用sigmoid函数得到结果。如果结果大于0.5,则是猫,否则不是猫。

3.3 – 通用算法

按照下面的算法顺序来创建模型:

1.  初始化参数/定义超参数
2.循环num_iterations:
 (1)正向传播
 (2)计算成本函数
 (3)反向传播
 (4)更新参数(使用参数和backprop中的梯度)
4.使用训练的参数来预测标签

Let's now implement those two models!

4 – 两层深度网络

Question: 利用之前的作业中你已经完成的辅助函数安装下面的顺序来完成一个2层的深度神经网络: LINEAR -> RELU -> LINEAR -> SIGMOID。这些函数主要是:

 

训练集训练:

3.jpg

测试集测试:

predictions_test = predict(test_x, test_y, parameters)

精确度为72%

注意:您可能会注意到,以较少的迭代(例如1500)运行模型可以提高测试集的准确性。 这叫做“早停”,我们将在下一个课程中进行讨论。 提前停止是防止过拟合的一种方法。

恭喜! 看来你的2层神经网络比逻辑回归实现(70%,第二周作业数值)有更好的表现(72%)。 让我们看看你是否能用L层模型做得更好。

5 – L层深度网络

Question: 利用之前的作业中你已经完成的辅助函数安装下面的顺序来完成一个L层的深度神经网络: LINEAR -> RELU -> LINEAR -> SIGMOID。这些函数主要是:

 [LINEAR -> RELU]××(L-1) -> LINEAR -> SIGMOID. The functions you may need and their inputs are:

训练集做训练:

1517667505604757.png

训练集预测准确度代码:

测试集预测准确度代码:

准确度:0.8

恭喜! 看起来你的5层神经网络比同样的测试集上的2层神经网络(72%)有更好的性能(80%)。

这对于这个任务来说是很好的表现。 不错的工作!

在下一课“改善深度神经网络”中,您将学习如何通过系统地搜索更好的超参数(learning_rate,layers_dims,num_iterations,以及在下一课程中学习的其他参数)来获得更高的准确性。

6 – 结果分析

首先,我们来看一些L层模型中标记不正确的例子。

1517667623747031.png

模型往往做得不好的几种类型的图像包括:

  1. 猫身体在一个不寻常的位置

  2. 猫出现在相似颜色的背景下

  3. 不寻常的猫的颜色和物种

  4. 相机角度问题

  5. 图片的亮度问题

  6. 比例变化(猫的图像非常大或很小)