欢迎光临散文网 会员登陆 & 注册

一种识别性神经网络的设计思路

2023-04-23 12:41 作者:T-Sherry  | 我要投稿

当我们要设计一个用于识别不同事物的神经网络时,首先我们要明确的两个问题是,这个神经网络在识别过程中具有什么样的作用,以及它应当具备什么样的结构。虽然我们都明白它的作用是识别,但是在具体的场景中,它在识别过程中需要完成的事情确实有所区别的。

不过整体而言,我们要构建的是至少应当是这样一个的系统:它已经得知了某些事物的存在,并且知道了这些事物各自的特征,而当我们向它输入一些关于某个事物的特征的信息时,它应当在它所知道的信息范围内匹配出一个最佳结果,识别出是哪一个具体的事物。如果我们成功构造出了这样的一个系统,那么放在人脸识别的具体场景中,就是它已经认识了一些人的脸,得知了这些人的脸各自有哪些特征,并且当我们输入一张人脸的照片时,它可以通过图像来完成在认识的人脸之集合中的匹配,从而告诉我们此为何人,或者,告诉我们这张照片不是已知的任何一个人的脸。

之后,我们便以人脸识别为例,探讨一种识别性的神经网络的设计思路,其它场景下则与之类似。

现在摆在我们面前的有这样的三个问题:①我们要让机器去认识人脸,但是机器是怎么认识这些人的脸的呢?②我们知道不同的脸有不同的特征,但是我们怎么知道要比较的是哪些特征呢?③就算我们知道了要比较的是哪些特征,我们又如何量化这些特征,如何知道一个人的脸在这些特征的种类上的取值是多少呢?

这些,实际上就是一个高维向量空间中的比较问题。不同的特征的种类,例如瞳孔间距、鼻梁高度、嘴唇高度与宽度之比等,这些特征完全可以看作一个个特征的维度,是一个高维的向量空间中的维度。而每某个人在某个特征维度上的情况,就是在该维度下的坐标取值,一张人脸的照片,经过一番特征提取后就变成了在这个空间中的一个点。

所以当我们对一张以前没见过的照片进行识别是,提取其特征得到了一个点的坐标后,只要和已知的点比较一下,选最近的那个,我们就能以此为理由说,这个人就是他。距离的计算和一般的直角坐标系一致,因为我们构造的高维空间中每一根坐标轴上一定有一个基向量,而这些基向量一定是线性无关的。于是,距离的计算变成了同种坐标差的平方和再开方,但为了节省时间,反正距离是大于等于0的,不妨把最后一步直接省略,比较平方和的大小,挑最小的那一个。

现在,我们来看上面三个问题怎么解答。

第一个问题,机器是怎么认识人的脸的?我们只需要提前对要识别的人拍照,经过预处理之后输入到这个神经网络内,这个神经网络再一张张地提取其中的特征便是。而这些照片合照片中人的名字,就是我们训练它用到的数据集。

我们知道平时的照片都是点阵的照片,毕竟以人脸识别为例的话,我们对人脸进行拍照,一般来说拍出来的照片都是纯粹的点阵图,或者压缩过的点阵图,而不是矢量图。而像素的组成其实就是颜色空间的坐标组成。如果是彩色的RGB图像,那么一方面这张照片本质是个像素的矩阵,另一方面这个像素的矩阵本质上是三个像素值的矩阵之和,而且还是三个同类型的矩阵。只不过加起来时不是简单的代数相加,而是三个相互正交的分量上的相加。

为了简化计算和避免干扰,有时候我们也可以把这些照片变成灰度图像,那么它本质上就是一个像素值的矩阵了,像素值即灰度。

我们拍到的照片很多时候是不能直接输入到神经网络内部的,因为照片不符合神经网络的要求,这就需要一些预处理。比如,我们的神经网络整体上保持着一个结构,它的结构决定了绝大多数情况下我们得把图片的尺寸调整到某一固定大小。这就是仿射变换。此外还可能有腐蚀和膨胀、降噪、像素值归一化等操作,为接下来的训练和识别做准备。

第二个问题,机器是怎么知道要比较的是哪些种类的特征的?换句话说,在线性代数上这个问题就是:我们需要构造一个什么样的高维空间

这个问题分为两部分:维度有多高我们怎么知道?坐标轴具体是哪几根?第一个子问题的答案决定了特征的种类数目,第二个子问题决定了其中的基向量是哪几个。不同的人脸对应于不同的坐标的点,我们也清楚这其中每一个坐标都对应于一个从原点出发的向量。但是我们采用的坐标系一定是单位直角坐标系I吗?设这个空间是n维的,我们采用的基向量一定是最基本的(1,0,0,……0,0), (0,1,0,……0,0),……,(0,0,0,……0,1)吗?绝大多数情况下不是。

我们已经获取了大量的预处理后的图像,现在要做的就是构造映射关系,进行从矩阵到向量的变换。此时,我们已经构造了从人到人脸,再到拍摄的照片,再到预处理后的图像,再到具体的矩阵的复合映射关系,而且从人到矩阵的映射还是一个双射。现在我们要做的就是将这个复合映射延伸到向量,进一步延伸到具体的点上。

向量和点的映射是天然就有的,从原点出发就能看出这么一个双射。现在要面对的就是矩阵到向量,还能从向量到矩阵的双射关系了。

怎么构造呢?一种最简单的方式是这样的:比如一个m×n的矩阵转化为一个mn维的列向量,就是将最左边一列不动,第二列原模原样写在第一列下面,第三列原模原样写在第二列下面……第n列原模原样写在第(n-1)列下面,自上而下读起来,就是一个mn维的列向量。如此,矩阵内的每一个数都能保留,只要记住了m和n的取值,就能保证从矩阵到列向量之间不存在任何的信息损失。

如此,完成了从人,到人脸,再到矩阵和向量的多重映射关系。

现在寻找合适的基向量来画对应的坐标轴,以及求维度就有方法了。我们可以将数据集中的每一个矩阵全部转化为这样的向量,从左往右连起来就是一个矩阵。要找基向量,只需要对数据集中的向量求极大无关组,而维度便是这个矩阵的秩。

第三个问题,提取的特征然后转化为坐标?

要算照片在高维向量空间内的坐标,其实就是,要对照片所对应的向量在这样的极大无关组中,用基向量进行线性表示至于如何进行线性表示,假设我们要研究的是向量,现在将那些基向量从左往右连起来构成矩阵A,设在A中向量用向量表示,那么有Ax=r,为了方便我们还可以求出A的特征值m,利用Ax=mx探讨。

如果我们输入一张新的照片,那么只需要将其转化为对应的矩阵和列向量,解方程便得到了坐标,这样就完成了识别过程。

理解了这个神经网络要做什么,才能理解神经网络该具有什么样的结构。神经网络是由大量的神经元构成的。一个神经元在本质上就是一个乘加模块,它可以以软件的形式,程序中的对象存在,也可以以硬件的形式,一段乘加电路而存在。

比如现在我们设置这样一种神经元,它有d对数据输入端,也就是2d个数据输入端,还有一个输出结果的数据输出端。

然后我们设有一个行向量和一个列向量,其维度都是d的整数倍,不妨设有kd的维度。现在我们向神经元输入一个行向量的其中d个数值,再输入另一个列向量对应的d个数值,神经元会对其分别相乘再相加,只要我们准备好k个神经元,再准备一个具有k个数据输入和一个数据输出端的加法模块,就能完成内积的计算,当然,这个还可以用于卷积的计算,也可以扩展为矩阵乘法的运算。

由于神经网络的工作中主要是各种乘加运算,或矩阵乘法,或卷积,所以大量的神经元可以胜任这些工作。


一种识别性神经网络的设计思路的评论 (共 条)

分享到微博请遵守国家法律