概述
本篇详细记录了如何使用 Python 语言基于 Logistic 回归搭建一个简单的单层神经网络,并实现猫图的识别。
本篇中的单层神经网络在训练集与测试集上分别获得了 95.7% 与 74.0% 的正确率。
转自猴开发博客:深度学习(三)实战:动手实现猫图识别
本篇将在 Jupyter Nootbook 中使用 Python 语言进行编程。
简单来说, Jupyter 是一个交互式笔记本,可以在一个 Jupyer 笔记本文件中同时记录 Markdown 笔记与添加可分段执行的代码块。
Jupyter Notebook 是一个基于网页的用于交互计算的应用程序。其可被应用于全过程计算:开发、文档编写、运行代码和展示结果。(摘自官方介绍)
Jupyter Notebook(此前被称为 IPython notebook)是一个交互式笔记本,支持运行 40 多种编程语言。Jupyter Notebook 的本质是一个 Web 应用程序,便于创建和共享文学化程序文档,支持实时代码,数学方程,可视化和 markdown。 用途包括:数据清理和转换,数值模拟,统计建模,机器学习等等。(摘自百度百科)
3.0 数据导入
本篇使用的数据摘自吴恩达深度学习课程,可以在本篇末尾获取下载。在搭建神经网络之前,不如先看一看数据是怎样的。
from lr_utils import load_dataset
train_X_orig, train_Y, test_X_orig, test_Y, classes = load_dataset()
其中 load_dataset 就将数据进行了导入,如果你好奇数据是怎么导入的,可以在下图中查看代码细节,但是目前为止你并不需要关心数据是怎么导入的,以及数据来源是什么,因为这些都不是本篇的重点,你要关注内容的应该是神经网络在编程中到底是如何实现的,当你真正实现了你的神经网络之后,只需要将数据按照你的网络需要进行格式处理并输入就行了。在本篇当中你直接将数据下载下来并使用上面的一行代码导入进行使用即可。
导入数据后的第一件事情,应该关心数据的存储结构,下面几行代码输出了训练集输入(train_set_x_orig)、训练集输出(train_set_y)、测试集输入(test_set_x_orig)及测试集输出(test_set_y)的形状。
print ("Shape of train_set_x_orig: " + str(train_set_x_orig.shape))
print ("Shape of train_set_y: " + str(train_set_y.shape))
print ("Shape of test_set_x_orig: " + str(test_set_x_orig.shape))
print ("Shape of test_set_y: " + str(test_set_y.shape))
输出结果是:
Shape of train_X_orig: (209L, 64L, 64L, 3L)
Shape of train_Y: (1L, 209L)
Shape of test_X_orig: (50L, 64L, 64L, 3L)
Shape of test_Y: (1L, 50L)
由此不难获得几点信息:
-
训练集中有209个训练元素;测试集中有50个测试元素。
即 m t r a i n = 209 m_{train} = 209 mtrain=209, m t e s t = 50 m_{test} = 50 mtest=50。 -
训练集和测试集的图像宽高均为 64 × 64 64 \times 64 64×64。
而 3 L 3L 3L 代表的是 R G B RGB RGB 三通道。如果对图像在计算机当中的存储形式有所了解的话,应该对 R G B RGB RGB 不陌生,电脑屏幕上的所有颜色,都由这红色®绿色(G)蓝色(B)三种色光按照不同的比例混合而成。
通过 matplotlib.pyplot 中提供的 imshow 函数可以将一幅 RGB 图像显示出来:
import matplotlib.pyplot as plt
# 显示训练集中的第 index 个训练图像
index = 102
plt.imshow(train_set_x_orig[index])
print ("y = " + str(train_set_y[:, index]) + ", it's a '" + classes[int(train_set_y[:, index])] + "' picture.")
可以看到,在训练集中的第103个样本图像是一张猫图。其中输出的结果 “y = [1]” 表示这张图片的标注是 “1”,也就表示 “是” 的意思。不妨再看一看第104个样本,可以看到不是猫图,而对应的输出结果也变成了 “y = [0]”。
3.1 数据处理
在前面已经完成了数据集的导入,并且查看了训练集当中的两个样本图像及对应的图像标注。但是这些数据目前为止还不方便我们使用,下面看一看如何将其调整为合适的格式。
对于单个训练样本而言,所有的输入按照列矩阵的形式传入网络,即输入 x x x 的是 n x × 1 n_x \times 1 nx×1 维的矩阵,但是一幅 64 × 64 64 \times 64 64×64 图像的在数据集中是以 64 × 64 × 3 64 \times 64 \times 3 64