卷积运算可以看作是卷积核在图像上的遍历。将内核的值按照逐个元素,乘以图像中的灰度值,并将结果相加即可得到该卷积的最终值。在应用中,我们可以使用垂直Sobel滤波器来检测颜色强度的明显变化。
△ 图12:应用垂直边缘滤波器对突出显示的红色区域进行卷积,从而在生成矩阵上获得红色最终值 但是这些卷积核与神经网络有什么关系?神经网络的卷积层实际上就是通过巧妙的方式来实现神经元之间的连接关系,进而实现一种分类器,其能够通过有监督学习来识别这些特殊的滤波器。在预处理步骤中,我们会使用一种特定结构的内核,因为我们了解何种结构的内核能够完成提取轮廓的任务。但在卷积神经网络中,我们会让训练算法自动找到特殊结构的滤波器,并能通过多级组合来表示越来越复杂的高级特征。 我们的神经网络结构 对于精灵分类任务,我使用了一个四层的卷积神经网络。 △ 图13:本文中精灵分类所用到的神经网络结构 上图中的每一层,都对应着卷积网络中的一个层。在每个层后,我们获得表示该层输出的状态张量,每个层的右侧写明了该张量维度。 然后,在卷积层通过卷积核进行卷积运算。在第一层,我们对输入图像应用32个维度为5的卷积核,产生了32个大小为60×60的输出矩阵。对图像应用卷积运算产生边界效应,造成输出矩阵维度减小。 我们还使用了最大池化层,通过对某个张量区域提取最大值,将其用单值代替。因此,在应用2×2最大池化操作后,我们得到新的张量,其大小只有原始张量的四分之一。 △ 图14:最大池化操作的示例 最后,我们将张量展开为一维向量,接以全连接层进行预测。最后一层的输出节点数为18,与精灵属性的个数相同。 训练和验证 为了训练精灵分类模型,我们将数据集划分为两个部分: 1)训练网络时将使用训练集,从数据中学习模型参数; 2)验证集用来验证所得到模型的预测性能。 这样,我们将能够通过正确率、测试误差来判断网络训练是否陷入过拟合。 但是我们不能通过随机划分来确定这两个数据集。因为在不同《口袋妖怪》游戏中,特别是在同一代的不同游戏之间,同一精灵的原画非常相似。 △ 图15:大比鸟在宝石版本(左)和钻石版本(右)里的原画。你能看出两者的区别吗? 如果对原始数据集进行随机划分,验证集和训练集中可能存在若干个样本几乎相同,这将导致对网络模型性能的高估。因此,我将整个精灵的全部图像集合都分配给同一个数据集,而不是将精灵图像随机划分。也就是说,如果喷火龙被分配给验证集,那么它的所有图像将被分在验证集,这样就可以消除了模型高估的问题。 我将20%的精灵作为测试集,80%的精灵作为训练集,atv,也就是训练集中有2727个精灵样本。 性能指标 本文将使用三个性能指标来评估该模型的分类性能: 1)准确度(accuracy):在预测过程中,能对精灵属性正确分类的百分比; 2)精度(precision):真正属于该类的图像占所有归于该类图像的百分比; 3)召回率(recall):该类正确归类的图像占该类全部图像的百分比; 虽然准确性已经能够评估所训练模型的大体质量,但是精确度和记忆力帮助我们衡量模型对每个类具体的预测效果。 第一个模型:简单训练 第一次尝试时,在保持训练集和验证集互相独立的条件下,用原始精灵图像对神经网络进行训练。 该算法运行了20步,只用了大约一分钟,训练正确率已经全部达到了100%。第一次训练结果如下图所示。 △ 图16:第一个模型对训练集的分类性能 (责任编辑:本港台直播) |