第2章 神经网络的编程基础
2.1 二分类
本节将讨论二分类。举一个二分类问题的例子,假如有一张图片作为输入,如图2-1所示的这只猫,如果识别这张图片为猫,则输出标签1作为结果;如果识别出不是猫,则输出标签0作为结果。用字母y表示输出的结果标签。
图2-1 二分类
为了保存一张图片,需要保存三个矩阵,它们分别对应图片中的红、绿、蓝三种颜色通道。如果图片大小为64×64像素,那么就有三个规模为64×64的矩阵,分别对应图片中红、绿、蓝三种像素的强度值。为了便于表示,这里只画出三个很小的矩阵,注意它们的规模为5×4而不是64×64,如图2-2所示。
图2-2 保存图片的矩阵示意图
为了把这些像素值放到一个特征向量中,需要将这些像素值提取出来,然后放入一个特征向量x。为了把这些像素值转换为特征向量x,需要像下面这样定义一个特征向量x来表示这张图片,把所有的像素都取出来,例如255、231等,直到取完所有的红色像素,接着是255,134,…,255、134等。如果图片的大小为64×64像素,那么向量x的总维度将是64×64×3,这是三个像素矩阵中像素的总量。在这个例子中结果为12288。现在用nx=12288来表示输入特征向量的维度,有时候为了简洁,直接用小写的n来表示输入特征向量x的维度。所以二分类问题的目标就是学习一个分类器,它以图片的特征向量作为输入,然后预测输出结果y为1还是0,也就是预测图片中是否有猫。
接下来说明一些符号的定义:
1)x表示一个nx维数据,为输入数据,维度为(nx,1);
2)y表示输出结果,取值为(0,1);
3)(x(i),y(i))表示第i组数据,可能是训练数据,也可能是测试数据,此处默认为训练数据;
4)X=[x(1),x(2),…,x(m)]表示所有的训练数据集的输入值,放在一个nx×m的矩阵中,其中m表示样本数目;
5)Y=[y(1),y(2),…,y(m)]对应表示所有训练数据集的输出值,维度为1×m。
用一对(x,y)表示一个单独的样本,x代表nx维的特征向量,y表示标签(输出结果)只能为0或1。而训练集将由m个训练样本组成,其中(x(1),y(1))表示第一个样本的输入和输出,(x(2),y(2))表示第二个样本的输入和输出,直到最后一个样本(x(m),y(m)),然后所有的这些一起表示整个训练集。有时候为了强调这是训练样本的个数,会写作Mtrain,当涉及测试集时,会使用Mtest来表示测试集的样本数。
最后为了能把训练集表示得更紧凑一点,定义一个用大写X表示的矩阵,它由输入向量x(1)、x(2)等组成,如图2-3所示,放在矩阵的列中。把x(1)作为第一列放在矩阵中,x(2)作为第二列,x(m)放到第m列,然后就得到了训练集矩阵X。所以这个矩阵有m列,m是训练集的样本数量,将这个矩阵的高度记为nx,注意有时候可能因为其他某些原因,矩阵X会由训练样本按照行堆叠起来而不是列,x(1)的转置直到x(m)的转置,但是在实现神经网络的时候,使用左边的这种形式,会让整个实现的过程变得更加简单。
图2-3 训练集矩阵X
那么输出标签y呢?同样的道理,为了能更加容易地实现一个神经网络,将标签y放在列中将会使得后续计算非常方便,所以定义大写的Y等于y(1),y(2),…,y(m),在这里是一个规模为1乘以m的矩阵,使用Python将表示为Y. shape=(1,m),表示这是一个规模为1乘以m的矩阵。
一个好的符号约定能够将不同训练样本的数据很好地组织起来。不仅包括x或者y,还包括之后看到的其他的量。将不同的训练样本的数据提取出来,然后就像刚刚对x或者y所做的那样,将它们堆叠在矩阵的列中。