使用卷积神经网络检查特征提取中的专业化
卷积神经网络是使用机器学习进行图像分类任务的基石。然而,在进行分类之前,它们还执行另一个非常有用的任务,即从图像中提取相关特征。特征提取是CNN识别图像的关键模式以进行分类的方式。本文将展示如何使用TensorFlow和Keras函数式API进行特征提取的示例。但首先,为了系统化这些CNN概念,我们首先需要讨论像素空间。
背景
像素空间
像素空间正如其名称所示:它是将图像转换为值矩阵的空间,其中每个值对应一个像素。因此,当将原始图像输入CNN时,它被转换为一个由数字组成的矩阵。在灰度图像中,这些数字通常的取值范围是0(黑色)到255(白色),中间的值是灰色的阴影。在本文中,所有的图像都经过了归一化处理,也就是说,每个像素都被除以255,使其值位于区间[0, 1]。
CNN与像素空间
CNN在像素表示中对图像进行的处理包括应用滤波器并进行处理,以提取与最终“决策”相关的像素,也就是将图像归类到一个类别中。例如,在页面顶部的图像中,CNN对狮子的嘴巴、舌头、眼睛(以及一般的强边缘)非常关注,这些特征在我们进一步深入神经网络时被进一步提取。因此,可以说CNN在分类方面越专业,它越能识别图像的关键特征。
目标
有了这一点,目标是很简单的:看CNN的专业化水平在特征提取方面。
方法
为此,我使用相同的架构训练了两个CNN,但训练集大小不同:一个使用了50K个图像(智能型),另一个使用了10K个图像(虚拟型)。之后,我对CNN的层进行了切片,以查看算法看到的内容以及它对输入图像的理解。
数据集
此项目使用了广泛使用的图像数据集[1],这是一个公共领域的数据集,它包含60K个图像,分为10个类别,其中10K个图像用作保留验证集。这些图像的大小为32×32像素,它们是RGB彩色图像,即包含3个色彩通道。
为了防止数据泄露,我保留了一张图像用作特征识别的测试图像,因此该图像在训练中没有被使用。我向大家展示我们的实验对象:青蛙。
TensorFlow中的实现
下面的代码段显示了实现情况。为了正确地切割CNN的层,必须在TensorFlow中使用Keras功能API而不是Sequential API。它的工作方式类似级联,下一层在上一层之上调用。
import tensorflow as tffrom tensorflow.keras.models import Modelfrom tensorflow.keras.layers import Input, Conv2D, MaxPool2D, Dense, Dropout, Flattenfrom tensorflow.keras.callbacks import ModelCheckpoint, EarlyStoppingdef get_new_model(input_shape): ''' 此函数返回一个编译后的CNN,具有上面给出的规格。 ''' #定义CNN的体系结构 input_layer = Input(shape=input_shape, name='input') h = Conv2D(filters=16, kernel_size=(3,3), activation='relu', padding='same', name='conv2d_1')(input_layer) h = Conv2D(filters=16, kernel_size=(3,3), activation='relu', padding='same', name='conv2d_2')(h) h = MaxPool2D(pool_size=(2,2), name='pool_1')(h) h = Conv2D(filters=16, kernel_size=(3,3), activation='relu', padding='same', name='conv2d_3')(h) h = Conv2D(filters=16, kernel_size=(3,3), activation='relu', padding='same', name='conv2d_4')(h) h = MaxPool2D(pool_size=(2,2), name='pool_2')(h) h = Conv2D(filters=16, kernel_size=(3,3), activation='relu', padding='same', name='conv2d_5')(h) h = Conv2D(filters=16, kernel_size=(3,3), activation='relu', padding='same', name='conv2d_6')(h) h = Dense(64, activation='relu', name='dense_1')(h) h = Dropout(0.5, name='dropout_1')(h) h = Flatten(name='flatten_1')(h) output_layer = Dense(10, activation='softmax', name='dense_2')(h) #生成模型时,我们传递输入层和输出层 model = Model(inputs=input_layer, outputs=output_layer, name='model_CNN') #接下来,我们应用编译方法 model.compile(optimizer='adam', loss='categorical_crossentropy', metrics=['accuracy']) return model
图1下面显示了架构的规格说明。
所使用的优化程序是Adam,损失函数是分类交叉熵,评估所使用的指标仅仅是准确率,因为数据集是完全平衡的。
切割CNN
现在,我们可以切割两个CNN的一些关键层,以便检查图像的处理水平。下面是代码实现:
benchmark_layers = model_benchmark.layersbenchmark_input = model_benchmark.inputlayer_outputs_benchmark = [layer.output for layer in benchmark_layers]features_benchmark = Model(inputs=benchmark_input, outputs=layer_outputs_benchmark)
这里发生的情况如下:第一行访问模型的每个层,第二行返回整个CNN的输入层。然后,在第三行中,我们创建一个显示每个层输出的列表,最后,我们创建一个新模型,其输出是层的输出。通过这种方式,我们可以查看每层之间发生的情况。
以类似的方式编写了一个非常相似的代码来访问我们虚拟模型的层,因此在此将被省略。现在让我们继续查看我们的CNN在不同层次中处理的青蛙图像。
第一个卷积层
虚拟
图2显示了卷积层(conv2d_1)的16个过滤器的图像。我们可以看到这些图像并没有经过很大的处理,存在很多冗余。可以说这只是第一个卷积层,这就解释了处理不那么重的原因,这是一个公平的观察。为了解决这个问题,我们将查看基准的第一层。
基准
基准分类器显示了一个经过更多处理的图像,以至于大部分图像都无法再辨认。记住:这仅是第一个卷积层。
最后一个卷积层
虚拟
正如预期的那样,图像在这一点上已经无法再辨认了,因为我们已经经过了6个卷积层和2个池化层,这解释了图像尺寸的缩小。让我们看看基准的最后一层是什么样子。
基准
这个图像经过更多处理,到了大部分像素都是黑色的程度,这表明已选择了重要特征,而剩下的图像基本上被丢弃了。
与信息的关联
我们可以看到,对于网络的相同部分,处理程度是非常不同的。定性分析表明,当从输入中提取有用信息时,基准模型更加积极。比较第一个卷积层的结果,我们可以看到在虚拟分类器上,青蛙图像的输出要少扭曲得多,更加易于识别。
这表明,基准在预测类别时更有效地丢弃了图像中无用的元素,而不确定如何进行的虚拟分类器考虑了更多特征。从图6可以看出,基准(蓝色)比虚拟模型(红色)丢弃了更多的彩色像素,其颜色分布呈现出更长的尾部。
如果我们观察原始青蛙图像的像素分布,图7显示了一个更加对称的分布,大致集中在0.4左右。
从信息理论的角度来看,原始图像和卷积层之后的图像的概率分布差异代表了大量的信息增益。
从图6和图7进行对比,我们在前者中对要找到的像素更加确定,而在后者中不太确定。因此,存在信息增益。这只是对信息理论的非常简要和定性的探索,为一个广阔的领域打开了大门。要了解更多关于信息理论的信息(双关意味),请查看这个帖子。
最后,观察分类器答案中的不确定性的一种方法是查看类别上的概率分布。这是我们的卷积神经网络最后的softmax函数的输出。图8(左)显示基准算法更加确定类别,其分布集中在蛙类上;而图8(右)显示混淆的虚拟分类器,最高概率在错误的类别上。
这个分析展示了一个预期的结果:更大的训练集会导致更好的特征捕捉算法。
这个项目的笔记本在这里可用。
参考资料
[1] Krizhevsky, Alex, and Geoffrey Hinton. 从小图像中学习多层特征。 (2009年):7。
[2] M. Jogin 等,使用卷积神经网络(CNN)和深度学习进行特征提取 (2018年),IEEE Electronics、Information & Communication Technology(RTEICT)国际会议
[3] K. Simonyan, A. Zisserman,大规模图像识别的深度卷积网络 (2015年),发表于ICLR 2015的会议论文
[4] Z. Matthew 和 F. Rob. 可视化和理解卷积网络 (2013年),欧洲计算机视觉会议
[5] B. Jyostna 和 N. Veeranjaneyulu,使用深度卷积神经网络进行特征提取和分类 (2018年),《网络安全与移动性杂志》