计算机视觉之深度学习:使用TensorFlow和Keras训练高级神经网络
上QQ阅读APP看书,第一时间看更新

1.1 理解深度学习

计算机视觉是一个有着悠久历史的领域。随着深度学习的出现,计算机视觉已被证明可用于各种应用。深度学习集合了人工神经网络(artificial neural network, ANN)的技术,后者是机器学习的一个分支。人工神经网络以人脑作为模型的基础,其中有一些节点相互连接并相互传递信息。在下面几节中,我们将通过理解常用的基本术语来详细讨论深度学习的工作原理。

1.1.1 感知机

人工神经元又称感知机(perceptron),它接收若干输入并执行加权求和以产生输出。感知机的权重在训练过程中基于训练数据确定。图1-1是感知机的图示。

图1-1

如图1-1所示,多个输入被加权并相加。在这个例子中,总和会经过一个单位阶跃函数用于二分类问题。该感知机只能通过从例子中学习权重来学习简单的功能。学习权重的过程称为训练。感知机的训练可以通过基于梯度的方法完成,1.1.4节将详细解释。感知机的输出可以经过激活函数或转移函数来传递,这将在下一节中解释。

1.1.2 激活函数

激活函数(activation function)使神经网络具有非线性。它决定感知机是否应被激发。在训练期间,激活函数在调整梯度方面发挥着重要作用。激活函数能以更高的幅度衰减梯度值,如下面介绍的sigmoid。激活函数这种非线性赋予了深度网络学习复杂函数的能力。除了在0点的修正单元,大多数激活函数都是连续函数和可微函数。连续函数输入中的每个小变化都会引起输出中的小变化。可微函数在定义域中的每个点都存在导数。

为了训练神经网络,激活函数必须是可微的。下面介绍一些激活函数。

如果你尚不明白“连续”和“可微”的意思,也不用担心。在随后的章节中,这些概念会变得更加清晰。

1.sigmoid

sigmoid可以被看作平滑的阶跃函数,因此可微。sigmoid可用于将任何值转换为概率,并可用于二分类问题。如图1-2所示,sigmoid将输入映射到范围为0~1的值。

图1-2

sigmoid函数中,相对于X值的变化,Y值的变化更小,因此将导致梯度逐渐消失。经过一番学习之后,变化可能非常小。下面将介绍另一个激活函数tanh。它是sigmoid的缩放版本,可在一定程度上避免梯度值消失的问题。

2.双曲正切函数

双曲正切函数tanh是sigmoid的缩放版本。与sigmoid一样,它是平滑和可微的。如图1-3所示,tanh将输入映射到范围为-1~1的值。

图1-3

它的梯度比sigmoid更稳定,因此很少引起梯度消失问题。sigmoid和tanh这两个激活函数都始终激发,使得相应的ANN很笨重。下面将引入另外一种激活函数,即修正线性单元(rectified linear unit, ReLU),它可以通过有时不激发来避免这个缺陷。

3.修正线性单元

修正线性单元可以让大数值通过,而让一些神经元处于不会激发的陈旧态。这为神经网络增加了稀疏性这个好的特性。如图1-4所示,ReLU将输入x映射到max(0, x),即将负的输入映射为0,而正的输入没有任何改变地输出。

图1-4

由于ReLU不是一直处在激发状态,因此可以加快训练速度。同时,由于该函数很简单,因此计算成本也最低。选择激活函数非常依赖于应用程序。尽管如此,ReLU面对大多数问题时都可以良好地工作。在下一节中,我们将通过学习如何将多个感知机堆叠在一起来学习更复杂的函数。

1.1.3 人工神经网络

人工神经网络(ANN)是感知机和激活函数的集合。多个感知机相互连接,从而形成隐藏层或隐藏单元。隐藏单元形成非线性基础,将输入层映射到低维空间中的输出层,这也称为ANN。ANN是从输入到输出的映射。该映射通过用带偏差的输入加权来计算。这些权重值、偏置(bias)值以及架构统称为模型。

权重值和偏置值由训练过程确定。训练开始时,用随机值初始化模型值。误差是通过使用损失函数(loss function)比较观测值与真实值来计算的。根据计算出的损失,在每一步调整权重。当误差不能进一步减小时,就停止训练。训练过程在训练期间学习特征。这些特征比原始图像有更好的表征。图1-5是人工神经网络(多层感知机)的图示。

图1-5

x的几个输入通过感知机组成的隐藏层传递,并进行求和以得到输出。万能逼近定理(universal approximation theorem)表明:这样一个神经网络可以逼近任何函数。隐藏层也可以称为密集层。每一层都可以具有一个上一节中介绍的激活函数。隐藏层和感知机的数量可以根据具体问题来选择。还有一些因素使这种多层感知机适用于多分类问题。多分类问题可尝试区分十多个类别。下面将探讨这些术语。

1.独热编码

在分类问题中,独热编码(one-hot encoding)是一种表示目标变量或类别的方法。目标变量可以由字符串标签转换为独热编码向量。一个独热向量在目标类别的索引处填充1,在其他地方填充0。例如,如果目标类别是猫和狗,它们可以分别用[1,0]和[0,1]表示。对于1000个类别,独热编码向量的大小为1000个整数,其中除一个数为1外全为0。独热编码不对目标变量的相似性做假设。下面将解释独热编码与softmax的组合,而这使ANN多分类成为可能。

2.softmax

softmax是迫使神经网络输出总和为1的一种方法。因此,softmax函数的输出值可以视为概率分布的一部分。这在多分类问题中很有用。softmax是一种特殊的激活函数,其输出总和为1。它通过将输出除以所有值的总和将输出转换为概率。可以通过计算softmax概率和独热编码之间的欧几里得距离来解决优化问题。但用于优化问题的一个更好的代价函数是下面的交叉熵。

3.交叉熵

交叉熵(cross-entropy)可用于比较softmax输出和独热编码输出之间的距离。交叉熵是一种损失函数,其误差必须最小化。神经网络估计给定数据映射到每个类别的概率。所映射的概率必须在正确的目标标签上取得最大值。交叉熵是负对数概率的总和。这里使用对数是为了提高数字值的稳定性。最大化函数值等同于最小化相同函数的负值。下面将介绍以下避免ANN过拟合的正则化方法。

❑丢弃

❑批归一化

❑L1和L2正则化

4.丢弃

丢弃(dropout)是避免过拟合ANN的一种正则化神经网络的有效方法。如图1-6所示,在训练期间,丢弃层通过随机移除部分隐藏单元来消减神经网络。

图1-6

注意神经元是如何随机训练的。丢弃也是组合多个神经网络的有效方式。对于每个训练案例,我们随机选择一些隐藏单元,以便针对每个案例得到不同的结构。这是装袋(bagging)和模型平均(model averaging)的极端情况。但是,在推断过程中,不应使用丢弃层,因为没有必要。

5.批归一化

批归一化(batch normalization,或称batch-norm)提高了神经网络训练的稳定性和性能。它对一层的输出进行零均值和标准差为1的归一化。这可以减少过拟合,并使网络训练更快。它在训练复杂神经网络中非常有用。

6.L1和L2正则化

L1惩罚权重的绝对值并使权重趋于为零。L2惩罚权重的平方值,并在训练期间倾向于使权重更小。这两种正则化方法都假设权重较小的模型更好。

1.1.4 训练神经网络

因为ANN包含若干个参数要优化,所以训练它颇有难度。更新权重的过程称为反向传播(backpropagation)。最小化错误的过程称为优化。下面将详细介绍它们。

1.反向传播

反向传播算法通常用于训练ANN。如图1-7所示,该算法根据计算出的误差向后更新权重。

图1-7

计算出误差后,可以使用梯度下降计算权重更新,如下所述。

2.梯度下降

梯度下降算法执行多维度优化。目标是达到全局最大值。梯度下降是许多机器学习模型中流行的优化技术。它用于改进或优化模型预测。梯度下降的一种实现称为随机梯度下降(stochastic gradient descent, SGD),它在神经网络中变得越来越流行。优化包括计算误差值并更新权重以实现最小误差。找到最小值的方向是损失函数梯度的负值。图1-8定性地显示了梯度下降过程。

图1-8

学习速率决定了每个步骤的大小。请注意,具有非线性激活函数的ANN将具有局部最小值。SGD在实践上可以更好地优化非凸的代价函数。

3.随机梯度下降

除了每次仅用部分样本数据进行训练以外,SGD与梯度下降相同。相应的参数称为小批次规模(mini-batch size)。理论上,即使只有一个样本也可以用于训练。在实践中,最好尝试不同个数的样本数据。在下一节中,我们将讨论卷积神经网络,它能比标准ANN更好地处理图像数据。

1.1.5 尝试TensorFlow游乐场

TensorFlow游乐场(playground)是神经网络的交互式可视化平台。访问playground.tensorflow.org网站,通过更改参数来查看先前提到的术语是如何协同工作的。图1-9是TensorFlow游乐场的截图。

图1-9

如图1-9所示,可以改变学习速率、激活函数、正则化、隐藏单元和各个层,看看会如何影响训练过程。我们可以花一些时间调整参数,以直观地了解神经网络是怎样处理各种数据的。

1.1.6 卷积神经网络

卷积神经网络(convolutional neural network, CNN)类似于前面描述的神经网络。CNN具有权重、偏置项和经过非线性激活函数的输出。一般的神经网络接收输入后,神经元全连接到下一层。同一层内的神经元不共享任何连接。如果对图像使用一般的神经网络,由于神经元数量庞大,它们的规模会非常大,导致过拟合。因为图像规模很大,所以不能将这种神经网络直接用于图像。增加模型的规模需要大量的神经元。可以认为图像是具有高度、宽度和深度尺寸的容积(volume)。深度是图像的通道,即红色、蓝色和绿色。CNN的神经元以容积方式排列以利用容积的优势。每个层都将输入容积转换为输出容积,如图1-10所示。

图1-10

卷积神经网络通过变换对编码滤波。学习到的滤波器可以检测图像中的特征或模式。层越深,模式越抽象。一些分析表明,这些层具有检测边缘、角落和模式的能力。CNN各层中的可学习参数比上一节中描述的密集层要少。

1.核

核(kernel)是用于卷积图像的参数卷积层。卷积操作如图1-11所示。

图1-11

核有两个参数,称为步幅(stride)和尺寸(size)。尺寸可以是矩形的任何一维。步幅是每次移动的像素数量。步幅长度为1时生成几乎相同尺寸的图像,而步幅长度为2时生成的图像只有原本尺寸的一半。额外填充(padding)图像将有助于实现相同尺寸的输入。

2.最大池化

池化层位于卷积层之间。池化层通过采样在层间减小图像大小。最大池化(max pooling)的采样通过在窗口中选择最大值来完成。平均池化(average pooling)对窗口内的值做平均运算。池化也是一种正则化技术,可以避免过拟合。池化在特征的所有通道上进行。池化也可以以不同的步幅进行。

窗口的大小是CNN感受野(receptive field)的一个度量。图1-12显示了最大池化的示例。

图1-12

CNN是所有计算机视觉深度学习模型中最重要的组成部分。毫不夸张地说,没有CNN,任何计算机都不可能有视觉。在接下来的几节中,我们将讨论几个可用于一些应用的先进层设计。

说明:可访问https://www.youtube.com/watch?v=jajksuQW4mc,了解CNN和最大池化操作的可视化效果。

1.1.7 循环神经网络

循环神经网络(recurrent neural network, RNN)可对序列信息建模。它不假设数据量很大。它从一系列序列数据的先前数据输出中执行相同的任务。这也可以认为是记忆。RNN无法记住更长的序列或时间。它在训练过程中展开,如图1-13所示。

图1-13

由上图可知,其操作步骤每次都要展开和训练。在反向传播过程中,随着时间的推移,梯度会消失。为了克服这个问题,可以使用长短期记忆网络(long short-term memory, LSTM)来记住更长的时间段。

1.1.8 长短期记忆网络

长短期记忆网络可以存储更长时间的信息,因此它可以高效地获取长期效率。图1-14说明了LSTM单元(cell)的设计。

图1-14

LSTM有几个门:遗忘门、输入门和输出门。遗忘门保持了以前的状态信息。输入门使用输入更新当前状态。输出门决定信息传递到下一个状态。遗忘和保留重要事物的能力使LSTM能够在更长的时间内记住信息。

你已经学会了贯穿整本书的深度学习术语。下一节将介绍如何在计算机视觉的背景下使用深度学习。