6.4.使用卷积网络对空间进行分析
在围棋中,你经常会看到一些特定的局部棋形。人类玩家已经学会识别几十种棋形,并经常给它们起一些令人回味的名字(比如老虎口,双关,或我个人最喜欢的,花六)。要像人类一样做出决定,我们的围棋A I还必须认识到许多的局部棋形。现在有一种特殊类型的神经网络,称为卷积网络,它是专门为检测像这样的空间形状而设计的。卷积神经网络(CNNs)有很多游戏以外的应用:你会发现它们被应用到图像、音频,甚至文字。本节演示如何构建CNN并将其应用于围棋游戏数据。首先,我们要介绍卷积的概念。接下来,我们将展示如何在Keras中构建CNNs,最后,我们展示处理卷积层输出的有用方法。
6.4.1.什么卷积是直观的?
卷积层和我们构建的网络是从计算机视觉的传统操作中得到他们的名字:卷积。卷积是一种直观的变换图像或应用过滤器的方法。对于两个相同大小的矩阵,通过以下方法计算简单卷积:
- 将这两个矩阵里的元素对应相乘
- 计算先前矩阵所有值的和
这样一个简单卷积的输出是一个标量值。图6.5显示了这样一个操作的示例,将两个3×3矩阵卷积起来计算标量。
这些简单的卷积本身并不能马上对你有帮助,但它们可以用来计算更复杂的卷积,而更复杂的卷积对你的用例是有用的。现在我们一开始不从两个相同大小的矩阵开始,让我们固定第二个矩阵的大小,并任意增加第一个矩阵的大小。在这个场景中,您将第一个矩阵称为输入图像,第二个矩阵称为卷积内核,或简单的内核(有时您也会看到使用的过滤器)。由于内核比输入图像小,您可以在输入图像的许多块上计算简单的卷积。在图6.6中,你看到这样一个卷积操作,一个10×10的输入图像与一个3×3内核在相互作用。
图6.6中的示例可能会给您第一个提示,来说明为什么卷积对我们来说是有趣的。输入图像是由中心4×8块的1被0包围的10×10矩阵。被选择的内核,矩阵的第一列(-1,-2,-1)为第三列(1,2,1)的相反数,中间列均为0。因此,以下几点是正确的:
- 无论何时将此内核应用于输入图像的3×3块,其中所有像素值相同,其卷积的输出将是0。
- 当您将此卷积内核应用于图像块时,左列的值比右列高,卷积将是负的。
- 当您将此卷积内核应用于一个图像块时,右列的值比左边高,卷积将是正的。
卷积内核被选择去检测输入图像中的垂直边缘。一个物体左边边缘将有正值,而右边边缘是负值。这正是您可以在图6.6中的卷积结果中看到的。
图6.6中的内核是许多应用程序中使用的经典内核,称为Sobel内核。如果你把这个内核翻转90度,你最终会得到一个水平边缘检测器。同样,您可以定义使图像模糊或锐化、检测角和任何其他事情的卷积内核,其中许多内核可以在标准图像处理库中找到。
有趣的是看到卷积可以用来从图像数据中提取有价值的信息,这正是您打算从围棋数据中预测下一步落子所要做的事情。虽然在前面的例子中,我们选择了一个特定的卷积核,但是卷积方式是在神经网络中使用这些核通过反向传播从数据中学习得到的。
到目前为止,我们已经讨论了如何将一个卷积核应用于一个输入图像。一般来说,将许多内核应用于许多图像以产生许多输出图像是有用的。为什么可以这样做?假设您有四个输入图像并定义了四个内核,然后你可以计算每个输入和输出图像的卷积之和。在下面的内容中,您将调用这样的卷积特征映射的输出图像。现在,如果您想要五个而不是一个结果的特征映射,你需要五个内核。利用n×m个卷积内核将n个输入图像映射到m个特征映射,称为卷积层。图6.7就说明了这种情况。
这样看来,卷积层是一种将多个输入图像转换为输出图像的方法,从而提取输入的相关空间信息。特别地,你可能有预想到,卷积层可以被链化,从而形成有卷积层的神经网络。通常,仅由卷积层和Dense层组成的网络被称为卷积神经网络,或者简单地说是卷积网络
深度学习中的张量
我们需要指出的是,卷积层的输出是一堆图像。虽然这样子是有帮助的,但还有更多的事情要做。正如向量(1D)由个别条目组成,它们不仅仅是一堆数字。同样,矩阵(2D)由列向量组成,但其具有固定的二维结构,可用于矩阵乘法和其他操作(如卷积)。一个卷积层的输出具有三维结构。卷积层中的滤波器具有更多的一维,并且具有4D结构(每个输入和输出图像组合的二维滤波器),而且它并没有停止——先进的深度学习技术可以处理更高维度的数据结构。
在线性代数中,向量和矩阵的高维等价物是张量,在附录A有更多的细节。想得到张量的更多具体知识,但我们不能在这里讨论张量的定义,这本书的剩下部分中,你不需要知道任何正式的张量定义。但是,张量给了我们方便的术语,我们在后面的章节中将会使用。例如,从卷积层输出的图像集合可被称为3-Tensor,卷积层中的4D滤波器形成4-Tensor,因此你可以说卷积是一种运算一个4-Tensor(卷积滤波器)在一个3-Tensor(输入图像)上工作,并将其转换为另一个3-Tensor。
更一般地,你可以说顺序神经网络是逐步变换不同维数张量的一种机制。这种利用张量在网络中“流动”来输入数据的思想正是由此产生了TensorFlow这个名字,它是谷歌最受欢迎的机器学习库,你将可以用来运行你的Keras模型。
请注意,在所有这些讨论中,我们只讨论了如何通过卷积层提供数据,而没有讨论反向传播将如