🐳 图像增广
type
status
date
slug
summary
tags
category
icon
password
Property
 
大型数据集是成功应用深度神经网络的先决条件。 图像增广在对训练图像进行一系列的随机变化之后,生成相似但不同的训练样本,从而扩大了训练集的规模。 此外,应用图像增广的原因是,随机改变训练样本可以减少模型对某些属性的依赖,从而提高模型的泛化能力。 例如可以以不同的方式裁剪图像,使感兴趣的对象出现在不同的位置,减少模型对于对象出现位置的依赖。 还可以调整亮度、颜色等因素来降低模型对颜色的敏感度。 可以说,图像增广技术对于AlexNet的成功是必不可少的。
 
 
notion image
notion image
notion image
🐳 LeNet
type
status
date
slug
summary
tags
category
icon
password
Property
 
 
LeNet是最早发布的卷积神经网络之一,因其在计算机视觉任务中的高效性能而受到广泛关注。这个模型是由贝尔实验室的研究员Yann LeCun在1989年提出的(并以其命名),目的是识别图像中的手写数字。 当时,Yann LeCun发表了第一篇通过反向传播成功训练卷积神经网络的研究,这项工作代表了十多年来神经网络研究开发的成果。
当时,LeNet取得了与支持向量机(support vector machines)性能相媲美的成果,成为监督学习的主流方法。 LeNet被广泛用于自动取款机(ATM)机中,帮助识别处理支票的数字。 时至今日,一些自动取款机仍在运行Yann LeCun和他的同事Leon Bottou在上世纪90年代写的代码呢!
总体来看,LeNet(LeNet-5)由两个部分组成:
  • 卷积编码器:由两个卷积层组成;
  • 全连接层密集块:由三个全连接层组成
该架构如下:
notion image
每个卷积块中的基本单元是一个卷积层、一个sigmoid激活函数和平均汇聚层。请注意,虽然ReLU和最大汇聚层更有效,但它们在20世纪90年代还没有出现。每个卷积层使用5×5卷积核和一个sigmoid激活函数。这些层将输入映射到多个二维特征输出,通常同时增加通道的数量。第一卷积层有6个输出通道,而第二个卷积层有16个输出通道。每个2×2池操作(步骤2)通过空间下采样将维数减少4倍。卷积的输出形状由批量大小、通道数、高度、宽度决定。
为了将卷积块的输出传递给稠密块,我们必须在小批量中展平每个样本。换言之,我们将这个四维输入转换成全连接层所期望的二维输入。这里的二维表示的第一个维度索引小批量中的样本,第二个维度给出每个样本的平面向量表示。LeNet的稠密块有三个全连接层,分别有120、84和10个输出。因为我们在执行分类任务,所以输出层的10维对应于最后输出结果的数量。
 
🐳 AlexNet 深度卷积神经网络
type
status
date
slug
summary
tags
category
icon
password
Property
 
 
LeNet提出后,卷积神经网络在计算机视觉和机器学习领域中很有名气。但卷积神经网络并没有主导这些领域。这是因为虽然LeNet在小数据集上取得了很好的效果,但是在更大、更真实的数据集上训练卷积神经网络的性能和可行性还有待研究。事实上,在上世纪90年代初到2012年之间的大部分时间里,神经网络往往被其他机器学习方法超越,如支持向量机
在计算机视觉中,直接将神经网络与其他机器学习方法进行比较也许不公平。这是因为,卷积神经网络的输入是由原始像素值或是经过简单预处理(例如居中、缩放)的像素值组成的。但在使用传统机器学习方法时,从业者永远不会将原始像素作为输入。在传统机器学习方法中,计算机视觉流水线是由经过人的手工精心设计的特征流水线组成的。对于这些传统方法,大部分的进展都来自于对特征有了更聪明的想法,并且学习到的算法往往归于事后的解释。
虽然上世纪90年代就有了一些神经网络加速卡,但仅靠它们还不足以开发出有大量参数的深层多通道多层卷积神经网络。此外,当时的数据集仍然相对较小。除了这些障碍,训练神经网络的一些关键技巧仍然缺失,包括启发式参数初始化、随机梯度下降的变体、非挤压激活函数和有效的正则化技术。
因此,与训练端到端(从像素到分类结果)系统不同,经典机器学习的流水线看起来更像下面这样:
  1. 获取一个有趣的数据集。在早期,收集这些数据集需要昂贵的传感器(当时最先进的图像也就100万像素)
  1. 根据光学、几何学、其他知识以及偶然的发现,手工对特征数据集进行预处理。
  1. 通过标准的特征提取算法,如SIFT(尺度不变特征变换)SURF(加速鲁棒特征)或其他手动调整的流水线来输入数据
  1. 将提取的特征送入最喜欢的分类器中,以训练分类器
 
机器学习研究人员相信机器学习既重要又美丽:优雅的理论去证明各种模型的性质。机器学习是一个正在蓬勃发展、严谨且非常有用的领域。然而,如果你和计算机视觉研究人员交谈,你会听到一个完全不同的故事。他们会告诉你图像识别的诡异事实——推动领域进步的是数据特征,而不是学习算法。计算机视觉研究人员相信,从对最终模型精度的影响来说,更大或更干净的数据集、或是稍微改进的特征提取,比任何学习算法带来的进步要大得多
🐳 VGG 使用块的网络
type
status
date
slug
summary
tags
category
icon
password
Property
 
 

VGG块

经典卷积神经网络的基本组成部分是下面的这个序列:
  1. 带填充以保持分辨率的卷积层
  1. 非线性激活函数,如ReLU
  1. 汇聚层,如最大汇聚层
 
而一个VGG块与之类似,由一系列卷积层组成,后面再加上用于空间下采样的最大汇聚层。在最初的VGG论文中,作者使用了带有卷积核、填充为1(保持高度和宽度)的卷积层,和带有汇聚窗口、步幅为2(每个块后的分辨率减半)的最大汇聚层。
定义一个名为vgg_block的函数来实现一个VGG块:
 
🐳 NiN 网络中的网络
type
status
date
slug
summary
tags
category
icon
password
Property
 
 
LeNet、AlexNet和VGG都有一个共同的设计模式:通过一系列的卷积层与汇聚层来提取空间结构特征;然后通过全连接层对特征的表征进行处理。 AlexNet和VGG对LeNet的改进主要在于如何扩大和加深这两个模块。 或者,可以想象在这个过程的早期使用全连接层。然而,如果使用了全连接层,可能会完全放弃表征的空间结构。 网络中的网络(NiN)提供了一个非常简单的解决方案:在每个像素的通道上分别使用多层感知机

全连接层的问题

卷积层需要较少的参数
但卷积层后的第一个全连接层的参数:
  • LeNet 16x5x5x120 = 48k
  • AlexNet 256x5x5x4096 = 26M
notion image
🐳 GoogLeNet 含并行连结的网络
type
status
date
slug
summary
tags
category
icon
password
Property
 

最好的卷积核超参数?

notion image
在2014年的ImageNet图像识别挑战赛中,一个名叫GoogLeNet的网络架构大放异彩。 GoogLeNet吸收了NiN中串联网络的思想,并在此基础上做了改进。 这篇论文的一个重点是解决了什么样大小的卷积核最合适的问题。 毕竟,以前流行的网络使用小到1×1,大到11×11的卷积核。 本文的一个观点是,有时使用不同大小的卷积核组合是有利的。
这里介绍一个稍微简化的GoogLeNet版本:省略了一些为稳定训练而添加的特殊特性,现在有了更好的训练方法,这些特性不是必要的。
 

Inception块

在GoogLeNet中,基本的卷积块被称为Inception块。这很可能得名于电影《盗梦空间》(Inception),因为电影中的一句话“我们需要走得更深”(“We need to go deeper”)
notion image
Inception块由四条并行路径组成。 前三条路径使用窗口大小为1×1、3×3和5×5的卷积层,从不同空间大小中提取信息。 中间的两条路径在输入上执行1×1卷积,以减少通道数,从而降低模型的复杂性。 第四条路径使用3×3最大汇聚层,然后使用1×1卷积层来改变通道数。 这四条路径都使用合适的填充来使输入与输出的高和宽一致,最后将每条线路的输出在通道维度上连结,并构成Inception块的输出。在Inception块中,通常调整的超参数是每层输出通道数。
 
🐳 批量归一化
type
status
date
slug
summary
tags
category
icon
password
Property
 

为什么需要批量归一化?

  1. 数据预处理的方式通常对最终结果产生巨大影响,直观地说,标准化可以很好地与优化器配合使用,因为它可以将参数的量级进行统一
  1. 对于典型的多层感知机或卷积神经网络。当训练时,中间层中的变量(例如,多层感知机中的仿射变换输出)可能具有更广的变化范围:不论是沿着从输入到输出的层,跨同一层中的单元,或是随着时间的推移,模型参数的随着训练更新变幻莫测。 批量规范化的发明者非正式地假设,这些变量分布中的这种偏移可能会阻碍网络的收敛。 直观地说,我们可能会猜想,如果一个层的可变值是另一层的100倍,这可能需要对学习率进行补偿调整。
  1. 更深层的网络很复杂,容易过拟合。 这意味着正则化变得更加重要
 
notion image
 
🐳 ResNet 残差网络
type
status
date
slug
summary
tags
category
icon
password
Property
 
一般认为,经过训练的深度神经网络能够将数据特征逐层抽象,最终提取出完成任务所需要的特征/表示,最终使用一个学习器,就可以完成最终任务——因此深度学习也被叫做表示/特征学习
在“层层抽象”的直觉下,很自然的想法就是,训练一个很深的前馈神经网路,来完成任务。直观上看,更深的神经网络,在非线性激活函数的加持下,拥有更大的假设空间,因此当然“更有可能”包含了一个最优解。但是在实际使用时,训练又成了一个难题。除了过拟合问题以外,更深的神经网络会遇到如下两个难题,我姑且按照物理史的比喻将其称为深度神经网络的“两朵乌云”:梯度弥散/爆炸和网络退化问题。
梯度弥散/爆炸问题导致模型训练难以收敛,但是这个问题很大程度上已经被标准初始化和中间层正规化方法有效控制了,这些方法使得深度神经网络可以收敛。深度神经网络面临的另一朵乌云是网络退化问题:
在神经网络可以收敛的前提下,随着网络深度增加,网络的表现先是逐渐增加至饱和,然后迅速下降
也许可以对网络单元进行一定的改造,来改善退化问题?这也就引出了残差网络的基本思路。
 

函数类

假设有一类特定的神经网络架构,包括学习速率和其他超参数设置。对于所有,存在一些参数集(例如权重和偏置),这些参数可以通过在合适的数据集上进行训练而获得。 现在假设是真正想要找到的函数,如果是,那我们可以轻而易举的训练得到它,但通常不会那么幸运。 相反,我们将尝试找到一个函数,这是我们在中的最佳选择。 例如,给定一个具有特性和标签的数据集,我们可以尝试通过解决以下优化问题来找到它:
那么,怎样得到更近似真正的函数呢? 唯一合理的可能性是,我们需要设计一个更强大的架构。换句话说,我们预计“更近似”。 然而,如果,则无法保证新的体系“更近似”。 事实上, 可能更糟:
notion image
🐳 DenseNet 稠密连接网络
type
status
date
slug
summary
tags
category
icon
password
Property
 
 
ResNet极大地改变了如何参数化深层网络中函数的观点。 稠密连接网络(DenseNet)在某种程度上是ResNet的逻辑扩展

从ResNet到DenseNet

任意函数的泰勒展开式把这个函数分解成越来越高阶的项。在接近0时,
同样,ResNet将函数展开为
也就是说,ResNet将分解为两部分:一个简单的线性项和一个复杂的非线性项。 那么再向前拓展一步,如果想将拓展成超过两部分的信息呢? 一种方案便是DenseNet。
notion image
ResNet和DenseNet的关键区别在于,DenseNet输出是连接(用图中的[,]表示)而不是如ResNet的简单相加。 因此,在应用越来越复杂的函数序列后,我们执行从 到其展开式的映射:
🐳 微调
type
status
date
slug
summary
tags
category
icon
password
Property
 
 
 
假如想识别图片中不同类型的椅子,然后向用户推荐购买链接。
一种可能的方法是首先识别100把普通椅子,为每把椅子拍摄1000张不同角度的图像,然后在收集的图像数据集上训练一个分类模型。 尽管这个椅子数据集可能大于Fashion-MNIST数据集,但实例数量仍然不到ImageNet中的十分之一。 适合ImageNet的复杂模型可能会在这个椅子数据集上过拟合。 此外,由于训练样本数量有限,训练模型的准确性可能无法满足实际要求。为了解决上述问题,一个显而易见的解决方案是收集更多的数据,但是收集和标记数据可能需要大量的时间和金钱(为了收集ImageNet数据集,研究人员花费了数百万美元的研究资金)。 尽管目前的数据收集成本已大幅降低,但这一成本仍不能忽视。
另一种解决方案是应用迁移学习(transfer learning)将从源数据集学到的知识迁移到目标数据集。 尽管ImageNet数据集中的大多数图像与椅子无关,但在此数据集上训练的模型可能会提取更通用的图像特征,这有助于识别边缘、纹理、形状和对象组合。 这些类似的特征也可能有效地识别椅子。
 

步骤

微调包括以下四个步骤:
  1. 在源数据集(例如ImageNet数据集)上预训练神经网络模型,即源模型
  1. 创建一个新的神经网络模型,即目标模型。这将复制源模型上的所有模型设计及其参数(输出层除外)。假定这些模型参数包含从源数据集中学到的知识,这些知识也将适用于目标数据集。还假设源模型的输出层与源数据集的标签密切相关;因此不在目标模型中使用该层。
🐳 目标检测和边界框
type
status
date
slug
summary
tags
category
icon
password
Property
 
 
 

边界框

 
通常使用边界框(bounding box)来描述对象的空间位置。
边界框是矩形的,由矩形左上角的以及右下角的坐标决定。 另一种常用的边界框表示方法是边界框中心的轴坐标以及框的宽度和高度
notion image
notion image
 
🐳 锚框
type
status
date
slug
summary
tags
category
icon
password
Property
 
 
目标检测算法通常会在输入图像中采样大量的区域,然后判断这些区域中是否包含我们感兴趣的目标,并调整区域边界从而更准确地预测目标的真实边界框(ground-truth bounding box)。 不同的模型使用的区域采样方法可能不同, 这里介绍其中的一种方法:以每个像素为中心,生成多个缩放比和宽高比(aspect ratio)不同的边界框,这些边界框被称为锚框(anchor box)

生成多个锚框

假设输入图像的高度为,宽度为。以图像的每个像素为中心生成不同形状的锚框:缩放比例为,宽高比为。那么锚框的宽度和高度分别是 (当中心位置给定时,已知宽和高的锚框是确定的)
设置许多缩放比(scale)取值和许多宽高比(aspect ratio)取值 ,生成多个不同形状的锚框。当使用这些比例和长宽比的所有组合以每个像素为中心时,输入图像将总共有锚框。 尽管这些锚框可能会覆盖所有真实边界框,但计算复杂性很容易过高。 在实践中只考虑包含的组合:
也就是说,以同一像素为中心的锚框的数量是,对于整个输入图像将共生成个锚框
notion image