第 1 章 入门

第 1 章 入门

计算机视觉是理解或操作图像和视频的科学。计算机视觉有很多应用,包括自动驾驶、工业检验和增强现实。对于计算机视觉,深度学习的使用可以分为多个类别:图像和视频中的分类、检测、分割和生成。在本书中,我们将学习如何为计算机视觉应用训练深度学习模型,并将其部署在多个平台上。TensorFlow将贯穿全书,这是一个流行的用于深度学习的Python库,我们将用它来实现示例。

本章涉及以下主题:

  • 深度学习的基础知识和词汇;
  • 深度学习与计算机视觉如何结合;
  • 建立本书中示例所需的开发环境;
  • 感受TensorFlow及其强大的工具,如TensorBoard和TensorFlow Serving。

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. 双曲正切函数

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

    图 1-3

    它的梯度比sigmoid更稳定,因此很少引起梯度消失问题。sigmoidtanh这两个激活函数都始终激发,使得相应的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能够在更长的时间内记住信息。

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

1.2 计算机视觉深度学习

计算机视觉能够使计算机具有人类视觉特性。计算机的形式可以是智能手机、无人机、闭路电视、磁共振成像扫描仪等,它们具有用于感知的各种传感器。传感器以数字形式生成图像,然后由计算机进行解释。下一节将介绍这种智能的基本组成部分。使用深度学习技术可以有效解决计算机视觉中出现的不同问题。

1.2.1 分类

图像分类是以一定的可信度用一个对象或概念对整幅图像打标签的任务。它的应用包括根据给定人脸图像进行性别分类、识别宠物类型、标记照片等。图1-15是这种分类任务的一个输出。

图 1-15

第2章将详细介绍可用于分类任务的方法;在第3章中,我们将使用深度学习模型的可视化分类模型并检索出相似的图像。

1.2.2 检测或定位与分割

检测或定位是在图像中查找目标并使用边界框对目标进行定位的一项任务。这项任务有许多应用,例如为自动驾驶车辆寻找行人和标识牌。图1-16是检测的一个图示。

{%}

图 1-16

分割是对图像进行像素级分类的任务。它可以精细化分离对象。这对处理医学图像和卫星图像非常有用。可以在第4章和第5章中找到更多示例和解释。

1.2.3 相似性学习

相似性学习(similarity learning)是学习两幅图像相似程度的过程。可以基于语义计算两幅图像之间相似度的评分,如图1-17所示。

图 1-17

它有一些应用,包括找到类似的产品以及执行人脸识别。第6章将介绍相似性学习技术。

1.2.4 图像题注

图像题注(image captioning)是用文本描述图像的任务,如图1-18所示。

* 经Vinyals等人许可转载

图 1-18

第7章详细介绍了图像题注技术。这是一个将自然语言处理(natural language processing,NLP)技术和计算机视觉技术相结合的独特案例。

1.2.5 生成模型

生成模型(generative model)在生成图像时非常有趣。图1-19是风格迁移应用的一个示例,其中使用一幅图像的内容融合其他图像的风格生成新的图像。

* 经Gatys等人许可转载

图 1-19

生成图像也有其他目的,例如新的训练样本、超分辨率图像等。第8章将详细介绍生成模型技术。

1.2.6 视频分析

视频分析从整体上处理视频,而不是像以前的例子中那样处理图像。它有一些应用,如运动追踪、入侵检测和监控摄像头。第9章将讨论特定于视频的应用。时间数据的新维度带来了许多有趣的应用。

在下一节中,我们将学习如何建立开发环境。

1.3 建立开发环境

本节我们将建立编程环境,这对于本书其余部分中的示例非常有用。我们可以选择以下操作系统。

  • 开发用操作系统(OS):如Mac、Ubuntu或Windows。
  • 部署用操作系统:如Mac、Windows、Android、iOS,或Amazon Web Services(AWS)、Google Cloud Platform(GCP)、Azure等云平台上安装的Ubuntu、Tegra、Raspberry Pi。

不管哪种平台,本书中开发的所有代码都应该能顺利运行。在本章中,我们将介绍开发环境的安装过程。第10章将介绍在AWS、GCP、Azure、Tegra和Raspberry Pi等各种环境中部署的安装。

1.3.1 硬件和操作系统

对于开发环境而言,由于训练的计算成本非常高,因此需要具备大量计算能力。Mac用户拥有的计算能力相当有限。Windows和Ubuntu用户可以使用更多的处理器和通用图形处理器(general purpose-graphics processing unit,GP-GPU)来加强他们的开发环境,这将在下一节中解释。

通用图形处理器

GP-GPU是可以加速深度学习模型训练过程的特殊硬件。因为有成熟的软件和社区支持,所以NVIDIA公司提供的GP-GPU在深度学习训练和部署方面非常受欢迎。我们可以使用这种GP-GPU机器加快训练速度。我们有很多选择,可以根据预算选择其中一种。选择与GP-GPU功率匹配的RAM、CPU和硬盘也很重要。安装硬件后,必须安装以下驱动程序和库。使用Mac或使用没有GP-GPU的Windows/Ubuntu的读者可以跳过下述安装。

以下是建立环境所需的库:

  • CUDA
  • CUDNN

 

  • CUDA

    CUDA(computer unified device architecture,计算统一设备架构)是NVIDIA提供的API层,它使用GPU的并行特性。安装CUDA后,还会安装硬件驱动程序。首先,从NVIDIA网站下载CUDA库。

    阅读页面上的说明,下载驱动程序,然后按照安装说明进行操作。图1-20是Ubuntu CUDA和安装说明的屏幕截图。

    图 1-20

    这些命令将安装需要的cuda驱动程序和其他CUDA API。

     可以通过在命令提示符下键入nvidia-smi,来检查驱动程序是否安装正确。

  • CUDNN

    CUDNN(CUDA deep neural network)库为深度学习算法提供原语。这个软件包是由NVIDIA提供的,因此它的硬件经过高度优化,运行速度更快。软件包中提供了几个标准的深度学习例程。这些软件包由著名的深度学习库(如TensorFlow、Caffe等)使用。在下一节中,提供了有关安装CUDNN的说明。你可以从NVIDIA网站下载CUDNN。

     用户账户是必需的(免费注册)。

    将相关文件复制到CUDA文件夹,使其更快地在GPU上运行。我们不会直接使用CUDA和CUDNN库。TensorFlow使用优化例程让它们在GP-GPU上工作。

1.3.2 安装软件包

训练深度学习模型需要几个库。我们将安装以下库并介绍选择以下软件包的原因。

  • Python和其他依赖
  • OpenCV
  • TensorFlow
  • Keras

  • Python

    Python是任何数据科学应用事实上的选择。它拥有最大的社区和库的支持生态系统。用于Python的TensorFlow API是最完整的,因此Python是编程语言的首选。Python有两个版本:Python 2.x和Python 3.x。本书中将讨论Python 3.x。这个选择有以下三个原因:

    • Python 2.x的开发将在2020年停止,因此Python 3.x是Python的未来;
    • Python 3.x避免了原始实现中的许多设计缺陷;
    • 与普遍的看法相反,Python 3.x拥有与Python 2.x一样多的数据科学支持库。

    我们将在本书中使用Python版本3。根据操作系统,转到python.org网站并下载版本3。按照下载链接中给出的步骤安装Python。安装Python之后,必须安装pip3以便安装Python包。然后通过输入以下命令安装几个Python软件包,就可以安装OpenCV和TensorFlow了。

    sudo pip3 install numpy scipy scikit-learn pillow h5py

    前面安装的软件包的描述如下。

    • NumPy是一个高度优化的数值计算软件包。它具有强大的N维数组对象包,而且NumPy库的矩阵运算对速度进行了高度优化。图像可以存储为三维的numpy对象。
    • SciPy有几个用于科学和工程计算的例程。本书后面将使用它的一些优化包。
    • scikit-learn是一个机器学习库,我们将使用它的许多辅助函数。
    • Pillow对图像加载和基本操作非常有用。
    • H5py包是HDF5二进制数据格式的Python接口。这是存储使用Keras训练模型的格式。
  • OpenCV

    OpenCV(open computer vision)是一个著名的计算机视觉库。这个库中有一些非常有用的图像处理例程。以下是在Ubuntu中安装OpenCV的步骤:

    sudo apt-get install python-opencv

    可以在https://opencv.org/上找到其他操作系统安装的相似步骤。OpenCV是跨平台的,并针对CPU密集型应用进行了优化。它具有多种编程语言的接口,在Windows、Ubuntu和Mac上都有支持。

  • TensorFlow库

    TensorFlow是开发和部署深度学习模型的开源库。TensorFlow使用计算图进行数据流和数值计算。换句话说,数据或张量(tensor)在图中流动,因此称为TensorFlow。该图具有可以进行任何数值计算的节点,因此适用于深度学习操作。它为各种平台和硬件提供一致的API。TensorFlow在后端处理规模化和优化的所有复杂性。它最初是为Google的研究而开发的。它是最著名的深度学习库,拥有大型社区,并配有可视化和生产部署工具。

    • 安装TensorFlow

      使用以下命令,为CPU使用pip3安装TensorFlow:

      sudo pip3 install tensorflow

      如果你正在使用GPU硬件并安装了CUDA和CUDNN,可使用以下命令安装TensorFlow的GPU版本:

      sudo pip3 install tensorflow-gpu

      现在TensorFlow已经安装完成并可以使用。我们通过几个例子来了解TensorFlow是如何工作的。

    • 打印“Hello, TensorFlow”的TensorFlow例子

      我们将直接在Python shell中使用TensorFlow来举一个例子。在这个例子中,我们将使用TensorFlow打印Hello, TensorFlow

      (1) 在命令提示符下键入以下命令从shell中调用Python。

      python3

      (2) 输入以下命令以导入TensorFlow库。

      >>> import tensorflow as tf

      (3) 接下来,用字符串Hello, TensorFlow定义一个常量。这与通常的Python赋值操作不同,因为该值尚未初始化。

      >>> hello = tf.constant('Hello, TensorFlow!')

      (4) 创建一个会话来初始化计算图,并为会话(session)命名。

      >>> session = tf.Session()

      会话可以使用变量hello作为参数运行。

      (5) 现在计算图可执行并返回打印的特定变量。

      >>> print(session.run(hello))

      它应该打印以下内容:

      Hello, TensorFlow!

      让我们再看一个例子,理解会话和计算图是如何工作的。

       访问https://github.com/rajacheers/DeepLearningForComputerVision,获取书中所有示例的代码。代码按照章节进行组织。你可以提出问题并在存储库中获得帮助。

    • 相加两个数字的TensorFlow例子

      这是TensorFlow相加两个数字的一个简单示例。

      (1) 使用以下代码创建一个Python文件并导入TensorFlow。

      import tensorflow as tf

      前面的导入对于后面的所有例子都是必需的。假设我们已经为所有示例导入了库。占位符(placeholder)可以通过以下方式定义。分配时未加载占位符。这里,变量被定义为一个float32类型的占位符。占位符是一个空的声明,并且可以在会话运行时取值。

      (2) 定义一个占位符,如下所示。

      x = tf.placeholder(tf.float32)
      y = tf.placeholder(tf.float32)

      (3) 现在可以将占位符的总和操作定义为通常的求和。这里,该操作不会执行,而只是使用以下代码进行定义。

      z = x + y

      (4) 可以按照前面的示例所示创建会话。如下定义后,计算图就准备好执行计算了。

      session = tf.Session()

      (5) 以字典格式定义占位符的值。

      values = {x: 5.0, y: 4.0}

      (6) 使用变量c和定义的值运行会话。计算图将值提供给适当的占位符,并将值返回给变量c

      result = session.run([z], values)
      print(result)

      作为相加的结果,该程序应打印[9.0]。

      可以理解的是,这不是相加两个数字的最佳方式。这个例子是为了理解TensorFlow中张量和操作的定义。想象一下,使用万亿个数字并将其相加是多么困难。TensorFlow使用相同的API轻松地实现了这样规模的计算。下面将介绍如何安装和使用TensorBoard和TensorFlow Serving。

    • TensorBoard

      TensorBoard是一套可视化工具,用于使用TensorFlow对基于深度学习的模型进行训练。以下数据可以在TensorBoard中可视化。

      • 图:计算图、设备布局和张量详细信息。
      • 标量:诸如损失、迭代的准确率等度量指标。
      • 图像:用于查看带有相应标签的图像。
      • 音频:用于收听训练或生成的音频。
      • 分布:用于查看某个标量的分布。
      • 直方图:包含权重和偏置项的直方图。
      • 投影器:帮助在三维空间中可视化数据。
      • 文本:打印训练文本数据。
      • 简况:查看用于训练的硬件资源。

      TensorBoard与TensorFlow一起安装。类似于前面的示例,转到Python 3提示符并键入以下命令以开始使用TensorBoard:

      x = tf.placeholder(tf.float32, name='x')
      y = tf.placeholder(tf.float32, name='y')
      z = tf.add(x, y, name='sum')

      请注意,参数名称已作为占位符和操作的额外参数提供。这些都是可视化图形时可以看到的名称。现在可以使用TensorBoard中的以下命令将图形写入特定文件夹:

      session = tf.Session()
      summary_writer = tf.summary.FileWriter('/tmp/1', session.graph)

      该命令将图形写入磁盘上参数中给定的文件夹。现在可以用以下命令调用TensorBoard:

      tensorboard --logdir=/tmp/1

      任何目录都可以作为存储文件的logdir选项的参数传递。转到浏览器并粘贴以下URL,以启动可视化来访问TensorBoard。

      http://localhost:6006/

      浏览器窗口中的TensorBoard可视化如图1-21所示。

      {%}

      图 1-21

      求和的图显示有占位符的名称。当点击它们时,可以在右侧看到该操作张量的所有细节。我们要让自己熟悉操作的选项卡和选项。这个窗口有几个部分,我们将在不同的章节中了解它们。TensorBoard是使TensorFlow脱颖而出的最佳工具之一。

    • TensorFlow Serving工具

      TensorFlow Serving是TensorFlow中用于灵活部署环境开发、提供高延迟和吞吐量环境的一款工具。任何使用TensorFlow训练的深度学习模型都可以通过Serving进行部署。通过运行以下命令来安装Serving:

      sudo apt-get install tensorflow-model-server

      有关如何使用它的分步说明将在第3章中介绍。注意,在Ubuntu中安装TensorFlow Serving比较容易,其他操作系统请参阅tensorflow.org网站。图1-22说明了TensorFlow Serving和TensorFlow如何在生产环境中进行交互。

      {%}

      图 1-22

      训练过程中可以生成许多模型,Serving可以无缝地切换它们,而无须停机。除了第3章和第10章之外,所有后续章节都不需要使用TensorFlow Serving。

  • Keras库

    Keras是一个用Python编写的深度学习开源库。它提供了一个简单的界面来使用TensorFlow后端。Keras也可以与Theano、deep learning 4j或CNTK一起使用,将它们用作后端。Keras旨在通过专注于友好、模块化和可扩展性来轻松、快速地进行实验。它是一个独立的框架,可以在CPU和GPU之间无缝运行。Keras可以单独安装,也可以使用tf.keras API在TensorFlow内部使用。在本书中,我们将使用tf.keras API。我们已经介绍了为开发环境安装所需库的步骤。安装好并平稳运行CUDA、CUDNN、OpenCV、TensorFlow和Keras对于后面的章节至关重要。

1.4 小结

本章介绍了深度学习的基础知识。本章介绍的词汇将贯穿全书,因此,你可以经常回顾本章内容。本章通过示例展示了计算机视觉的一些应用,还介绍了创建开发环境时各种平台上所有软件包的安装。

下一章将讨论如何在数据集上使用Keras和TensorFlow来训练分类模型。我们将研究如何使用更大的模型和其他技术(如增强和微调)来提高准确性,还会介绍世界各地的人们提出的几个先进模型,它们在竞赛中实现了最好的准确性。

目录

  • 版权声明
  • 译者序
  • 前言
  • 第 1 章 入门
  • 第 2 章 图像分类
  • 第 3 章 图像检索
  • 第 4 章 目标检测
  • 第 5 章 语义分割
  • 第 6 章 相似性学习
  • 第 7 章 图像题注
  • 第 8 章 生成模型
  • 第 9 章 视频分类
  • 第 10 章 部署