当前位置:   article > 正文

[学习笔记] python深度学习---第五章 深度学习用于计算机视觉_颜色深度轴为啥是3

颜色深度轴为啥是3

一、卷积运算

1. 密集连接层和卷积层的根本区别在于,Dense层从输入特征空间中学到的是全局模式(比如对于MNIST数字,全局模式就是涉及所有像素的模式),而卷积层学到的是局部模式,对于图像来说,学到的就是在输入图像的二维小窗口中发现的模式。

        神经网络具有两个性质:

  • 卷积神经网络学到的模式具有平移不变性(translation invariant)。卷积神经网络在图像右下角学到某个模式后,它可以在任何地方识别这个模式,比如左上角。对于密集连接网络来说,如果模式出现在新的位置,它只能重新学习这个模式。这使得卷积神经网络在处理图像时可以高效利用数据(因为视觉世界从根本上具有平移不变性),它只需要更少的训练样本就可以学到具有泛化能力的数据表示。
  • 卷积神经网络可以学到模式的空间层次结构(spatial hierarchies of patterns)。第一个卷积层讲学习较小的局部模式(比如边缘),第二个卷积层讲学习由第一层特征组成的更大的模式,以此类推。这使得卷积神经网络可以有效地学习越来越复杂、越来越抽象的视觉概念(因为视觉世界从根本上具有空间层次结构)。

        对于包含两个空间轴(高度和宽度)和一个深度轴(也叫通道轴)的3D张量,其卷积也叫特征图(feature map)。对于RGB图像,深度轴的维度大小等于3,因为图像有3个颜色通道:红色、绿色和蓝色。对于黑白图像(比如MNIST数字图像),深度等于1(表示灰度等级)。卷积运算从输入特征图中提取图块,并对所有这些图块应用相同的变换,生成输出特征图(output feature map)。该输出特征图仍是一个3D张量,具有宽度和高度,其深度可以任意取值,因为输出深度是层的参数,深度轴的不同通道不再像RGB深入那样代表特定颜色,而是代表过滤器(filter)。过滤器对输入数据的某一方面进行编码,比如,单个过滤器可以从更高层次编码这样一个概念:“输入中包含一张脸。”

        

2. 在MNIST示例中,第一个卷积层接收一个大小为(28,28,1)的特征图,并输出一个大小为(26,26,32)的特征图,即它在输入上计算32个过滤器。对于这32个输出通道,每个通道都包含一个26*26的数值网格,它是过滤器对输入的响应图(response map),表示这个过滤器模式在输入中不同位置的响应。这也是特征图这一术语的含义:深度轴的每个维度都是一个特征(或过滤器),而2D张量output[:, :, n]是这个过滤器在输入上的响应的二维空间(map)。

3. 卷积由以下两个关键参数所定义:

  • 从输入中提取的图块尺寸:这些图块的大小通常是3*3或5*5。
  • 输出特征图的深度:卷积所计算的过滤器的数量。

二、 卷积的工作原理

        在3D输入特征图上滑动(slide)这些3*3或5*5的窗口,在每个可能的位置停止并提取周围特征的3D图块[ 形状为(window_height, window_width, input_depth) ]。然后每个3D图块与学到的同一个权重矩阵[ 叫作卷积核(convolution kernel)]做张量积,转换成形状为(output_depth, )的1D向量。然后对所有这些向量进行空间重组,使其转换为形状为(height, width, output_depth)的3D输出特征图。输出特征图中的每个空间位置都对应于输入特征图中的相同位置(比如输出的右下角包含了输入右下角的信息)。

        注意,输出的宽度和高度可能与输入的宽度和高度不同。不同的原因可能有两点:

  • 边界效应,可以通过对输入特征图进行填充来抵消。
  • 使用了步幅(stride)。

1. 边界效应

       假设有一个5*5的特征图。其中只有9个方块可以作为中心放入一个3*3的窗口,这9个方块形成一个3*3的网格。因此,输出特征图的尺寸是3*3。它比输入尺寸小了一点,在本书中之前的例子中也可以看到这种边界效应的作用:开始的输入尺寸为28*28,经过第一个卷积层之后尺寸变为26*26。

2. 填充

        如果你希望输出特征图的空间维度与输入相同,那么可以使用填充(padding)。填充是在输入特征图的每一边添加适当数目的行和列,使得每个输入方块都能作为卷积窗口的中心。

3. 卷积步幅

        影响输出尺寸的另一个因素是步幅。目前为止,对卷积的描述都假设卷积窗口的中心方块都是相邻的。但两个连续窗口的距离是卷积的一个参数,叫作步幅,默认值为1。也可以使用步进卷积(stride convolution),即步幅大于1的卷积。

        步幅为2意味着特征图的宽度和高度都被做了2倍下采样(除了边界效应引起的变化)。虽然步进卷积对某些类型的模型可能有用,但在实践中很少使用。为了对特征图进行下采样,我们不用步幅,而是通常使用最大池化(max-pooling)运算

4. 最大池化运算

        在卷积神经网络示例中,在每个MaxPooling2D层之后,特征图的尺寸都会减半。例如,在第一个MaxPooling2D层之前,特征图的尺寸是26*26,但最大池化运算将其减半为13*13。这就是最大池化的作用:对特征图进行下采样,与步进卷积类似。

        最大池化是从输入特征图中提取窗口,并输出每个通道的最大值。它的概念与卷积类似,但是最大池化使用硬编码的max张量运算对局部图块进行变换,而不是使用学到的线性变换(卷积核)。最大池化与卷积的最大不同之处在于,最大池化通常使用2*2的窗口和步幅2,其目的是将特征图下采样2倍。与此相对的是,卷积通常使用3*3窗口和步幅1。     

        这种架构有两个问题:

  • 不利于学习特征的空间层级结构。第三层的3*3窗口中只包含初始输入的7*7窗口中所包含的信息。卷积神经网络学到的高级模式相对于初始输入来说仍然很小,这可能不足以学会对数字进行分类。我们需要让最后一个卷积层的特征包含输入的整体信息。
  • 最后一层的特征图对每个样本共有22*22*64=30976个元素。这太多了,如果你将其展平并在上面添加一个大小为512的Dense层,那一层将会有1580万个参数。这对于这样一个小模型来说太多了,会导致严重的过拟合。

        简而言之,使用下采样的原因,一是减少需要处理的特征图的元素个数,二是通过让连续卷积层的观察窗口越来越大(即窗口覆盖原始输入的比例越来越大),从而引入空间过滤器的层级结构。

        注意,最大池化不是实现这种下采样的唯一方法。还可以在前一个卷积层中使用步幅来实现。此外,你还可以使用平均池化来代替最大池化,其方法是将每个局部输入图块变换为取该图块各通道的平均值,而不是最大值。但最大池化的效果往往比这些替代方法更好。简而言之,原因在于特征中往往编码了某种模式或概念在特征图的不同位置是否存在(因此得名特征图),而观察不同特征的最大值而不是平均值能够给出更多的信息。因此,最合理的子采样策略是首先生成密集的特征图(通过无步进的卷积),然后观察特征每个小图块上的最大激活,而不是查看输入的稀疏窗口(通过步进卷积)或对输入图块取平均,因为后两种方法可能导致错过或淡化特征是否存在的信息。

三、在小型数据集上从头开始训练一个卷积神经网络

​​​​​​​        在2000个训练样本上训练一个简单的小型卷积神经网络,不做任何正则化,为模型目标设定一个基准。这会得到71%的分类精度。此时主要的问题在于过拟合。然后,我们会介绍数据增强(data augmentation),它在计算机视觉领域是一种非常强大的降低过拟合的技术。使用数据增强之后,网络精度将提高到82%。

        应用于小型数据集的另外两个重要技巧:用预训练的网络做特征提取(得到的精度范围在90%~96%),对预训练的网络进行微调(最终精度为97%)。总而言之,这三种策略---从头开始训练一个小型模型、使用预训练的网络做特征提取、对预训练的网络进行微调---构成了你的工具箱,未来可用于解决小型数据集的图像分类问题。

1. 构建网络

2. 数据预处理

        在数据输入神经网络之前,应该将数据格式化为经过预处理的浮点数张量。数据预处理步骤大致如下:

(1)读取图像文件。

(2)将JPEG文件解码为RGB像素网格。

(3)将这些像素网格转换为浮点数张量。

(4)将像素值(0~255范围内)缩放到[0,1]区间。

        Keras拥有自动完成这些步骤的工具。Keras有一个图像处理辅助工具的模块,位于Keras.preprocessing.image。它包含ImageDataGenerator类,可以快速创建Python生成器,能够将硬盘上的图像文件自动转换为预处理好的张量批量。 

Python生成器        

        是一个类似于迭代器的对象,一个可以和for...in运算符一起使用的对象。注意,生成器会不停地生成这些批量,它会不断循环目标文件夹中的图像。因此,你需要在某个时刻终止(break)迭代循环。

        利用生成器,我们让模型对数据进行拟合。我们将使用fit_generator方法来拟合,它在数据生成器上的效果和fit相同。它的第一个参数应该是一个Pyhton生成器,可以不停地生成输入和目标组成的批量,比如train_generator。因为数据是不断生成的,所以Keras模型要知道每一轮需要从生成器中抽取多少个样本。这是steps_per_epoch参数的作用:从生成器中抽取steps_per_epoch个批量后(即运行了steps_per_epoch次梯度下降),拟合过程将进入下一次轮次。

        

3. 使用数据增强

        过拟合的原因是学习样本太少,导致无法训练出能够泛化到新数据的模型。如果拥有无限的数据,那么模型能够观察到数据分布的所有内容,这样就永远不会过拟合。数据增强是从现有的训练样本中生生更多的训练数据,其方法是利用多种能够生成可信图像的随机变换来增加(augment)样本。其目标是,模型在训练时不会两次查看完全相同的图像。这让模型能够观察到数据的更多内容,从而具有更好的泛化能力。

        关于一些参数的含义:

  • rotation_range是角度值(在0~180范围内),表示图像随机旋转的角度范围。
  • width_shift和height_shift是图像在水平或垂直方向上平移的范围(相对于总宽度或总高度的比例)。
  • shear_range是随机错切变换的角度。
  • zoom_range是图像随机缩放的范围。
  • horizontal_flip是随机将一半图像水平翻转。如果没有水平不对称的假设(比如真实世界的图像),这种做法是有意义的。
  • fill_mode是用于填充新创建像素的方法,这些新像素可能来自于旋转或宽度/高度平移。

        如果你使用这种数据增强来训练一个新网络,那么网络将不会两次看到同样的输入。但网络看到的输入仍然是高度相关的,因为这些输入都来自于少量的原始图像。你无法生成新信息,而只能混合现有信息。因此,这种方法可能不足以完全消除过拟合。为了进一步降低过拟合,你还需要向模型中添加一个Dropout层,添加到密集连接分类器之前。

        通过使用正则化方法和调节网络参数(比如每个卷积层的过滤器个数或网络中的层数),你可以得到更高的精度。但是如果想要进一步提高精度,就需要使用预训练的模型

四、预训练的卷积神经网络

        想要将深度学习应用于小型图像数据集,一种常用且非常高效的方法是使用预训练网络。预训练网络(pretrained network)是一个保存好的网络,之前已在大型数据集上训练好。如果这个原始数据集足够大且足够通用,那么预训练网络学到的特征的空间层次结构可以有效地作为视觉世界的通用模型,因此这些特征可用于各种不同的计算机视觉问题,即使这些新问题涉及的类别和原始任务完全不同。

        使用预训练网络有两种方法:特征提取(feature extraction)和微调模型(fine-tuning)。

五、特征提取

        特征提取是使用之前网络学到的表示来从新样本中提取出有趣的特征。然后将这些特征输入一个新的分类器,从头开始训练。

        用于图像分类的卷积神经网络包含两部分:首先是一系列池化层和卷积层,最后是一个密集连接分类器。第一部分叫作模型的卷积基(convolutional base)。对于卷积神经网络而言,特征提取就是取出之前训练好的网络的卷积基,在上面运行新数据,然后在输出上面训练一个新的额分类器。

        注意:

        (1)我们能重复使用卷积基,但是我们不应该重复密集连接分类器。因为卷积基学到的表示可能更加通用,因此更适合重复使用。

        (2)某个卷积层提取的表示是通用性(以及可复用性)取决于该层在模型中的深度。模型中更靠近底部的层(先添加到模型中的层)提取的是局部的、高度通用的特征图(比如视觉边缘、颜色和纹理),而更靠近顶部的层(后添加到模型中的层)提取的是更加抽象的概念(比如“猫耳朵”或“狗眼睛”)。因此,如果你的新数据集与原始模型训练的数据集有很大差异,那么最好只使用模型的前几层来做特征提取,而不是使用整个卷积基。

1. 不使用数据增强的快速特征提取

        (1)首先,运行ImageDataGenerator实例,将图像及其标签提取为Numpy数组。我们需要调用conv_base模型的predict方法来从这些图像中提取特征。

        (2)提取到的特征形状后,需要将其输入到密集连接分类器中,所以首先必须将其形状展平。例如特征形状为(simple, 4, 4, 512),展平为(simple, 8192)。

        (3)定义密集连接分类器(注意要使用dropout正则化),并在刚刚保存的数据和标签上训练这个分类器。

2. 使用数据增强的特征提取

        这种方法的速度更快,计算代价更高,但在训练期间可以使用数据增强。注意,这种方法只在有GPU的情况下能尝试运行,如果没有GPU的话就使用上一种方法。

        (1)在编译和训练模型之前,一定要“冻结”卷积基。冻结(freeze)一个或多个层是指在训练过程中保持其权重不变。如果不冻结的话,卷积基之前学到的表示将会在训练过程中被修改。因为其上添加的Dense层是随机初始化的,所以非常大的权重更新将会在网络中传播,对之前学到的表示造成很大破坏。

        在Keras中,冻结网络的方法是将其trainable属性设为False。注意,为了让这些修改生效,你必须先编译模型。如果在编译之后修改了权重的trainable属性,那么应该重新编译属性,否则这些修改将被忽略。

        (2)开始训练模型,同时对模型使用数据增强。

六、微调模型

        微调模型(fine-tuning)是与特征提取互为补充。对于用于特征提取的冻结的模型基,微调是指将其顶部的几层“解冻”,并将这解冻的几层和新增加的部分联合训练。

        (1)只有分类器已经训练好了,才能微调卷积基的顶部几层。如果分类器没有训练好,那么训练期间通过网络传播的误差信号会特别大,微调的几层之前学到的表示都会被破坏。因此,微调网络的步骤如下:

  • 在已经训练好的基网络(base network)上添加自定义网络。
  • 冻结基网络。
  • 训练所添加的部分。
  • 解冻基网络的一些层。
  • 联合训练解冻的这些层和添加的部分。

        在做特征提取的时候已经完成了前三个步骤。只需要从第四个步骤开始继续往下做。

        (2)解冻基网络的一些层,这个步骤需要考虑到一个问题。卷积基中更靠底部的层编码的是更加通用的可复用特征,而更靠近顶部的层编码的是更专业化的特征。微调这些更专业化的特征更加有用,因为它们需要在你的问题上改变用途。微调更靠底部的层,得到的回报会更少。同时,训练的参数越多,过拟合的风险越大。

        (3)在解冻某些卷积层后,可以开始微调网络。可以使用学习率非常小的RMSProp优化器来实现。之所以让学习率很小,是因为对于微调的这几层表示,我们不想其变化范围太大。太大的权重更新可能会破坏这些表示。

        

七、可视化中间激活

        可视化中间激活,是指对于给定输入,展示网络中各个卷积层和池化层输出的特征图(层的输出通常被称为该层的激活,即激活函数的输出)。

        需要注意几点:

  • 第一层是各种边缘探测器的集合。在这一阶段。激活几乎保留了原始图像中的所有信息。
  • 随着层数的加深,激活变得越来越抽象,并且越来越难以直观地理解。它们开始表示更高层次的概念,比如“猫耳朵”和“猫眼睛”。层数越深,其表示中关于图像视觉内容的信息就越少,而关于类别的信息就越多。
  • 激活的稀疏度(sparsity)随着层数的加深而增大。在第一层里,所有过滤器都倍输入图像激活,但在后面的层里,越来越多的过滤器是空白的。也就是说,输入图像中找不到这些过滤器所编码的模式。

        深度神经网络可以有效地作为信息蒸馏管道(information distillation pipeline),输入原始数据,反复对其进行变换,将无关信息过滤掉(比如图像的具体外观),并放大和细化有用的信息(比如图像的类别)。

八、可视化卷积神经网络的过滤器

        想要观察卷积神经网络学到的过滤器,另一种简单的方法是显示每个过滤器所响应的视觉模式。这可以通过在输入空间中进行梯度上升来实现:从空白输入图像开始,将梯度下降应用于卷积神经网络输入图像的值,其目的是让某个过滤器的响应最大化。得到的输入图像是选定过滤器具有最大响应的图像。

        这个过程很简单:我们需要构建一个损失函数,其目的是让某个卷积层的某个过滤器的值最大化;然后,我们要使用随机梯度下降来调节输入图像的值,以便让这个激活值最大化。

        这些过滤器可视化包含卷积神经网络的层如何观察世界的很多信息:卷积神经网络中每一层都学习一组过滤器,以便将其输入表示为过滤器的组合。这类似傅立叶变换将信号分解为一组余弦函数的过程。随着层数的加深,卷积神经网络中的过滤器变得越来越复杂,越来越精细。

  • 模型第一层(block1_conv1)的过滤器对应简单的方向边缘和颜色(还有一些是彩色边缘)。
  • block2_conv1层的过滤器对应边缘和颜色组合而成的简单纹理。
  • 更高层的过滤器类似于自然图像中的纹理:羽毛、眼睛、树叶等。

九、可视化类激活的热力图

        这种可视化方法,有助于了解一张图像的哪一部分让卷积神经网络做出了最终的分类决策。这有助于对卷积神经网络的决策过程进行调试,特别是出现分类错误的情况下,这种方法还可以定位图像的特定目标。这种通用的技术叫作类激活(CAM,class activation map)可视化,它是指对输入图像生成类激活的热力图。类激活热力图是与特定输出类别相关的二维分数网格,对任何输入图像的每个位置都要进行计算,它表示每个位置对该类别的重要程度。

十、本章总结

1. 卷积神经网络使用预计算机视觉任务的最佳机器学习模型。即使在非常小的数据集上也可以从头开始训练一个卷积神经网络,而且得到的结果还不错。

2. 在小型数据集上的额主要问题是过拟合。在处理图像数据时,数据增强是一种降低过拟合的强大方法。

3. 利用特征提取,可以很容易将现有的卷积神经网络复用于新的数据集。对于小型图像数据集,这是一种很有价值的方法。

4. 作为特征提取的补充,还可以使用微调,将现有模型之前学到的一些数据表示应用于新问题。这种方法可以进一步提高模型性能。

5. 卷积神经网络通过学习模块化模式和概念的层次结构来表示视觉视觉。

6. 卷积神经网络学到的表示很容易可视化,卷积神经网络不是黑盒。

7. 可以将卷积神经网络学到的过滤器可视化,也可以将类激活热力图可视化。


----今天不学习,明天变废物----

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小桥流水78/article/detail/792344
推荐阅读
相关标签
  

闽ICP备14008679号