一. 密集连接层和卷积层的根本区别是

  1. Dense层从输入特征空间中学到的是全局模式(涉及所有像素的模式)
  2. 卷积层学到的局部模式,对图像来说学到的就是在输入图像的二维小窗口中发现的模式。

. 卷积神经网络具有以下2个有趣的性质

       1.具有平移不变性(因为视觉世界从根本上具有平移不变性)。CNN在图像某个位置学到的模式,可以在图像任何其他位置识别这个模式,这使得CNN在处理图像时可以高效利用数据。而对Dense而言,如果模式出现在新的位置,会重新学习这个模式。这就是所谓的数据共享

       2.模式的空间层次结构(因为视觉世界从根本上具有空间层次结构)随着卷积层的不断增加,实际上可以看作是模式的不断叠加过程,构建成更大的模式。这使得CNN可以有效的学习越来越复杂、越来越抽象的概念。

. 卷积由以下2个关键参数所定义

       1.从输入中提取的图块尺寸:这些图块的大小通常是3*3或5*5。

       2.输出特征图的深度:卷积所计算的过滤器的数量。

       卷积的工作原理:在3D输入特征图上滑动(slide)这些3*3或5*5的窗口,在每个位置停止并提取周围特征的3D图块[形状(window_height, window_width, in_depth)]。然后每个3D图块与学到的同一个权重矩阵/卷积核张量积,转换成形状(out_depth, )1D向量。然后对所有这些向量进行空间重组,使其转换为形状为 (height, width, out_depth) 3D 输出特征图。输出特征图中的 每个空间位置都对应于输入特征图中的相同位置(比如输出的右下角包含了输入右下角的信 )。举个例子,利用 3×3 的窗口,向量 output[i, j, :] 来自 3D 图块 input[i-1:i+1, j-1:j+1, :] 。如下图:

【Keras之父】DL用于CV

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

         1.边界效应:可以通过对输入特征图进行图进行填充(padding)来抵消。

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

         对于 Conv2D 层,可以通过 padding 参数来设置填充,这个参数有两个取值:

        "valid" 表示不使用填充(只使用有效的窗口位置)-----默认值

        "same" 表示填充后输出的宽度和高度与输入相同。

         2.使用了步幅(stride), 稍后会给出其定义。

         但两个连续窗口的距离是卷积的一个参数,叫作步幅,默认值为 1。也可 以使用步进卷积(stride convolution),即步幅 > 1 的卷积。虽 然步进卷积对某些类型的模型可能有用,但在实践中很少使用。熟悉这个概念是有好处的。

         为了对特征图进行下采样(down sample),通常不用步幅stride,而是通常使用最大池化(max-pooling)运算。

~~~~~~~~~~~~~~最大池化运算~~~~~~~~~~~~~~~~~

         在每个MaxPooling2D层之后,特征图的尺寸都会减半。最大池化的作用: 对特征图进行下采样,与步进卷积类似

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

****为什么要用最大池化对特征图下采样? ------卷积基(convolutional base)

****为什么不删除最大池化层,一直保留较大的特征图?

使用下采样的原因:

         1.减少需要处理的特征图的元素个数

         2.通过让连续卷积层的观察窗口越来越大(即窗口覆盖原始输入的比例越来越大),从而引入空间过滤器的层级结构。

         Down sample(下采样/降低/缩小采样)方法:

         1. stride步幅。实践中很少使用,原因?

         2.Max Pooling Value: 每个局部输入图块变换为取该图块各个通道的最大值。****

         3.Average Pooling Value: 2不同,取的是平均值。

         原因在于特征中往往编码了某种模式或概念在特征图的不同位置是否存在(因此得 名特征图),而观察不同特征的最大值而不是平均值能够给出更多的信息。最合理的子采样策略是首先生成密集的特征图(通过无步进的卷积),然后观察特征每个小图块上的最大**, 而不是查看输入的稀疏窗口(通过步进卷积)或对输入图块取平均,因为后两种方法可能导致错过或淡化特征是否存在的信息

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

         用于解决在CV领域中针对小型数据集的图像分类( image classification)过拟合(over fitting)的问题:

          A. 数据增强(data augmentation) : 从头开始训练一个小型模型。

          B. 使用预训练的网络做特征提取(feature extract)

          C. 对预训练的网络进行微调( fine-tuning)

. DL with small data set

         深度学习的一个基本特征就是能够独立地训练数据中找到有趣的特征,无人为的特征工程,而这只在拥有大量训练样本时才能实现,这种说法部分正确。由于CNN学到的是局部的、平移不变性的特征,它对感知问题可以高效的利用数据。虽然数据相对较少,但在非常小的图像数据集上从头训练一个CNN,仍然可以得到不错的结果而且无须任何自定义的特征工程

         此外DL模型本质上具有高度的可复用性,如已有一个在规模数据集上训练的图像分类模型或语音转文本模型,只需要做很小的修改就能将其复用于不同的问题。特别是在CV领域,许多预训练的模型(通常都是在ImageNet数据集上训练得到的)现在都可以公开下载。

         1.使用数据增强 Using data augmentation

         用ML处理Image几乎都会用到的方法。定义:从现有的训练样本中生成更多的训练数据,其方法是利用多种能够生成可信图像的随机变换来增加(augment)样本。其目标是模型在训练时不会两次查看相同的图像。 Keras文档中部分参数:

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

         这种做法不会生成新的信息,而只能混合现有的信息,因为这些输入都来自于少量的原始图像。为了进一步降低过拟合Overfitting,需要向模型中添加一个dropout层,添加到Dense分类器之前。

2.使用预训练的CNN Using a pretrained convnet

        想要将DL应用于小型图像数据集,常用并且非常高效的方法:使用预训练网预训练网络:一个保存好的网络,之前已在大型数据集上(通常是大规模图像分类任务)训练好的

         如果这个原始数据集足够大且足够通用,那么预训练网络学到的特征 的空间层次结构可以有效地作为视觉世界的通用模型,因此这些特征可用于各种不同的计算机 视觉问题,即使这些新问题涉及的类别和原始任务完全不同。常见的架构有:VGG16 or VGG19、ResNet50、Inception、Inception-ResNet、Xception、MobileNet等。

         使用预训练的网络有2种方法:特征提取和微调模型。

         2.1 特征提取 Feature extraction

         定义:使用之前网络学到的表示来从新样本中提取出有趣的特征,然后将这些特征输入到一个新的分类器,从头开始训练用于Image分类的CNN包含2部分:1是一系列的池化层和卷积层,也称为是卷积基/convolutional base2是一个密集连接分类器对于卷积神经网络而言,特征提取就是取出之前训练好的网络的卷积基

 【Keras之父】DL用于CV

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

****为什么仅重复使用卷积基?能否也重复使用密集连接分类器?*****

        一般来说,应该避免这么做。原因在于卷积基学到的表示可能更加通用,因此更适合重复使用。卷积神经网络的特征图表示通用概念在图像中是否存在,无论面对什么样的计算机视觉问题,这种特征图都可能很有用。但是,分类器学到的表示必然是针对于模型训练的类别,其中仅包含某个类别出现在整张图像中的概率信息。此外,密集连接层的表示不再包含物体在输入图像中的位置信息。密集连接层舍弃了空间的概念,而物体位置信息仍然由卷积特征图所描述。如果物体位置对于问题很重要,那么密集连接层的特征在很大程度上是无用的。

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

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

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

          部分Code如下:

          from keras import models

          from keras import layers

          model = models.Sequential()

          model.add(layers.Dense(256, activation='relu', input_dim=4 * 4 * 512))

          model.add(layers.Dropout(0.5))

          model.add(layers.Dense(1, activation='sigmoid'))

          只需要处理2个Dense层,即使在CPU上运行,每轮的时间<1s.虽然dropout比率相当大,但是模型几乎从一开始就过拟合Overfitting。因为对于每个输入图像只需运行一次卷积基,而卷积基是目前流程中计算代价最高的,其优点 速度快,计算代价低

          2.1.2 使用数据增强的快速特征提取

          它的速度更慢,计算代价高,但在训练期间可以使用数据增强。这种方法是:扩展conv_base模型,然后在输入数据上P2P运行模型,只在有GPU的情况下才能尝试运行。

          from keras import models

          from keras import layers

          model = models.Sequential()

          model.add(conv_base)

          model.add(layers.Flatten())          

          model.add(layers.Dense(256, activation='relu'))

          model.add(layers.Dense(1, activation='sigmoid'))

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

         2.2微调模型Fine-tuning

         模型微调(fine-tuning),与特征提取互为补充。对于用于特征提取的冻结的模型基,微调是指将其顶部的几层“解冻”,并将这解冻的几层和新增加的部分联合训练。之所以叫作微调,是因为它只是略微调整了所复用模型中更加抽象的表示,以便让这些表示与手头的问题更加相关

【Keras之父】DL用于CV
         冻结卷积基是为了能够在上面训练一个随机初始化的分类器。同理,只有上面的分类器已经训练好了,才能微调卷积基的顶部几层。如果分类器没有训练好,那么训练期间通过网络传播的误差信号会特别大,微调几层之前学到的表示都会被破坏。因此,微调网络步骤如下:

         (1) 在已经训练好的基网络(base network)上添加自定义网络。

         (2) 冻结基网络。

         (3) 训练所添加的部分。

         (4) 解冻基网络的一些层。

         (5) 联合训练解冻的这些层和添加的部分。

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

**********为什么不微调更多层?为什么不微调整个卷积基?************

         1.卷积基中更靠底部的层编码的是更加通用的可复用特征,而更靠顶部的层编码的是更专业化的特征。微调这些更专业化的特征更加有用,因为它们需要在新问题上改变用途。微调更靠底部的层得到的回报会更少。

         2.训练的参数越多,过拟合的风险越大。卷积基有 1500 万个参数,所以在小型数据集上训练这么多参数是有风险的。

         在这种情况下,一个好策略就是仅微调卷积基最后的两三层

          如果损失没有降低,那么精度怎么能保持稳定或提高呢?

          答:影响精度的是损失值的分布,而不是平均值。因为精度是模型预测的类别概率的二进制阀值。即从平均损失中无法看出,但模型也仍然可能在改进。

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

.CNN可视化

         深度学习模型是“黑盒”,即模型学到的额表示很难用人类可以理解的方法来提取和呈现。卷积神经网络学到的表示非常适合可视化,很大程度上是因为它们是视觉概念的表示深度神经网络学到的表示的普遍特征: 随着层数的加深,层所提取的特征变得越来越抽象。下面3种最容易理解也最有用的方法:

         1.可视化卷积神经网络的中间输出(中间**): 有助于理解卷积神经网络连续的层如何 对输入进行变换,也有助于初步了解卷积神经网络每个过滤器的含义。

         可视化中间**是指对于给定输入,展示网络中各个卷积层和池化层输出的特征图(层的输出通常被称为该层的**,即**函数的输出)需要注意的以下几点:

          1.1 第一层是各种边缘探测器的集合。在这一阶段,**函数输出几乎保留了原始图像中的所有信息。

        1.2随着层数的加深,**变得越来越抽象,并且越来越难以直观地理解。它们开始表示更高层次的概念。层数越深,其表示中关于图像视觉内容的信息就越少,而关于类别的信息就越多

         1.3 **的稀疏度(sparsity)随着层数的加深而增大。在第一层里,所有过滤器都被输入图像**,但在后面的层里,越来越多的过滤器是空白的。也就是说,输入图像中找不到这些过滤器所编码的模式。

         更高的层**包含关于特定输入的信息越来越少,而关于目标的

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

         2. 可视化卷积神经网络的过滤器: 有助于精确理解卷积神经网络中每个过滤器容易接受的 视觉模式或视觉概念。主要是指通过在输入空间中进行梯度上升来实现: 从空白输入图像开始,将梯度下降应用 于卷积神经网络输入图像的值,其目的是让某个过滤器的响应最大化得到的输入图像是选定过滤器具有最大响应的图像

         CNN层都学习一组过滤器,以便将其输入表示为过滤器的组合。这类似于傅里叶变换将信号分解为一 组余弦函数的过程。随着层数的加深,CNN中的过滤器变得越来越复杂,越来越精细。

         3. 可视化图像中类**的热力图: 有助于理解图像的哪个部分被识别为属于某个类别,从 而可以定位图像中的物体。

          类**图(CAMclass activation map)可视化是指对输入图像生 成类**的热力图。类**热力图是与特定输出类别相关的二维分数网格,对任何输入图像的每个位置都要进行计算,它表示每个位置对该类别的重要程度。

        给定一张输入图像,对于一个 卷积层的输出特征图,用类别相对于通道的梯度对这个特征图中的每个通道进行加权。直观上 可以这么理解,就是用“每个通道对类别的重要程度”对“输入图像对不 同通道的**强度”的空间图进行加权,从而得到了“输入图像对类别的**强度”的空间图。

【Keras之父】DL用于CV