卷积神经网络

注意:本教程面向TensorFlow 的高级用户,并承担机器学习方面的专业知识和经验。

概观

CIFAR-10分类是机器学习中常见的基准问题。问题是将RGB 32x32像素图像分为10类:

airplane, automobile, bird, cat, deer, dog, frog, horse, ship, and truck.

有关更多详细信息,请参阅CIFAR-10页面 和 Alex Krizhevsky 的技术报告

目标

本教程的目标是构建用于识别图像的相对较小的卷积神经网络(CNN)。在此过程中,本教程:

  1. 重点介绍网络架构,培训和评估的规范组织。
  2. 提供一个用于构建更大和更复杂的模型的模板。

选择CIFAR-10的原因是它足够复杂,可以大量运用TensorFlow扩展到大型车型的能力。同时,该模型足够小,可以快速训练,这对于尝试新想法和尝试新技术是非常理想的。

教程亮点

CIFAR-10教程演示了在TensorFlow中设计更大和更复杂的模型的几个重要结构:

我们还提供了一个多GPU版本 的模型,演示如下:

  • 配置一个模型来并行训练多个GPU卡。
  • 在多个GPU之间共享和更新变量。

我们希望本教程为TensorFlow上的视觉任务构建更大的CNN提供了启动点。

模型架构

CIFAR-10教程中的模型是由交替卷积和非线性组成的多层架构。这些层之后是通向softmax分类器的完全连接的层。该模型遵循 Alex Krizhevsky描述的架构,在几个层面上有一些差异。

该模型在GPU上的训练时间的几个小时内实现了大约86%的精度峰值性能。请参阅下面的代码和详细信息。它由1,068,298个可学习的参数组成,并且需要大约19.5M的乘法运算来计算单个图像上的推断。

代码组织

本教程的代码位于 tensorflow_models/tutorials/image/cifar10/

文件

目的

cifar10_input.py

读取本机CIFAR-10二进制文件格式。

cifar10.py

构建CIFAR-10模型。

cifar10_train.py

在CPU或GPU上训练CIFAR-10模型。

cifar10_multi_gpu_train.py

在多个GPU上训练一个CIFAR-10模型。

cifar10_eval.py

评估CIFAR-10模型的预测性能。

CIFAR-10型号

所述CIFAR-10网络主要是包含在 cifar10.py。完整的训练图包含大约765个操作。我们发现我们可以通过使用以下模块构建图来使代码最为可重用:

  1. 模型输入: inputs()distorted_inputs()添加分别读取和预处理CIFAR图像进行评估和训练的操作。
  2. 模型预测: inference() 添加对提供的图像执行推理即分类的操作。
  3. 模型训练: loss()train() 添加计算损失,梯度,变量更新和可视化摘要的操作。

模型输入

模型的输入部分由功能构建,inputs()并 distorted_inputs()从CIFAR-10二进制数据文件读取图像。这些文件包含固定的字节长度记录,所以我们使用 tf.FixedLengthRecordReader。请参阅阅读数据以了解有关Reader课程的工作原理。

图像的处理如下:

  • 它们被裁剪成24 x 24像素,集中评估或 随机进行培训。
  • 它们几乎变白 ,使模型对动态范围不敏感。

对于训练,我们还应用一系列随机变形来人为增加数据集大小:

请参阅图像页面了解可用失真的列表。我们也附加 tf.summary.image到图像,以便我们可以在TensorBoard中可视化它们。这是验证输入正确构建的良好做法。

从磁盘读取图像并使其扭曲可以使用非常小的处理时间。为了防止这些操作减慢训练,我们在16个独立的线程中运行它们,它们不断地填充TensorFlow 队列

模型预测

模型的预测部分由inference()添加操作来计算预测逻辑的函数构成。该模型的一部分组织如下:

图层名称

描述

conv1

卷积和纠正线性激活。

pool1

最大池。

norm1

本地响应规范化。

conv2

卷积和纠正线性激活。

norm2

本地响应规范化。

pool2

最大池。

local3

完全连接层与整流线性激活。

local4

完全连接层与整流线性激活。

softmax_linear

线性变换产生逻辑。

这是从TensorBoard生成的描述推理操作的图:

练习:输出inference是非标准化逻辑。尝试编辑网络架构以返回使用的归一化预测 tf.nn.softmax

inputs()inference()功能提供所有必要对模型进行评价的组成部分。我们现在将重点转移到建设模式的培训。

练习:模型架构inference()cuda-convnet中指定的CIFAR-10模型略有 不同。特别地,亚历克斯原始模型的顶层是本地连接的,并没有完全连接。尝试编辑架构以精确地再现顶层中的本地连接的体系结构。

模特训练

训练网络进行N次分类的通常方法是 多项Logistic回归softmax回归。Softmax回归将softmax非线性应用于 网络的输出,并计算 标准化预测与标签的1-hot编码之间的 交叉熵。对于正则化,我们还将所有学习变量的常规体重衰减损失应用于常规 。模型的目标函数是函数返回的交叉熵损失和所有这些权重衰减项的和。 loss()

我们在TensorBoard中可以看出tf.summary.scalar

我们使用标准梯度下降 算法(参见训练其他方法)训练模型 ,学习速率 随时间呈指数衰减

train()函数通过计算渐变和更新学习变量来增加最小化目标所需的操作(详见tf.train.GradientDescentOptimizer 详细信息)。它返回一个操作,执行训练和更新一批图像的模型所需的所有计算。

启动和训练模型

我们已经建立了模型,现在我们来启动它,并用脚本来运行训练操作cifar10_train.py

python cifar10_train.py

注意:首次在CIFAR-10教程中运行任何目标时,CIFAR-10数据集将自动下载。数据集是〜160MB,所以你可能想要一杯咖啡,首先运行。

你应该看到输出:

Filling queue with 20000 CIFAR images before starting to train. This will take a few minutes. 2015-11-04 11:45:45.927302: step 0, loss = 4.68 (2.0 examples/sec; 64.221 sec/batch) 2015-11-04 11:45:49.133065: step 10, loss = 4.66 (533.8 examples/sec; 0.240 sec/batch) 2015-11-04 11:45:51.397710: step 20, loss = 4.64 (597.4 examples/sec; 0.214 sec/batch) 2015-11-04 11:45:54.446850: step 30, loss = 4.62 (391.0 examples/sec; 0.327 sec/batch) 2015-11-04 11:45:57.152676: step 40, loss = 4.61 (430.2 examples/sec; 0.298 sec/batch) 2015-11-04 11:46:00.437717: step 50, loss = 4.59 (406.4 examples/sec; 0.315 sec/batch) ...

该脚本每10个步骤报告总损耗以及最后一批数据的处理速度。几条评论:
  • 因为预处理线程用20,000个处理后的CIFAR图像填满洗牌队列,所以第一批数据可能会非常慢(例如几分钟)。
  • 报告的损失是最近批次的平均损失。请记住,这种损失是交叉熵和所有重量衰减项的总和。
  • 注意批量的处理速度。上面显示的数字是在特斯拉K40c上获得的。如果在CPU上运行,则会降低性能。

练习:在进行实验时,有时令人烦恼的是,第一个训练步骤可能需要很长时间。尝试减少最初填满队列的图像数量。搜索min_fraction_of_examples_in_queue 在cifar10_input.py

cifar10_train.py定期 所有模型参数保存在 检查点文件中, 但不会对模型进行评估。将使用检查点文件cifar10_eval.py来测量预测性能(请参阅下面的评估模型)。

如果您遵循上述步骤,那么您现在已经开始训练CIFAR-10型号了。恭喜!

返回的终端文本cifar10_train.py提供了对模型如何训练的最小了解。我们希望在培训期间更多地了解模型:

  • 损失是真的减少还是只是噪音?
  • 该模型是否提供了适当的图像?
  • 梯度,激活和重量是否合理?
  • 目前的学习率是多少?

TensorBoard提供此功能,显示cifar10_train.py通过a 定期导出的数据tf.summary.FileWriter

例如,我们可以看到local3在训练过程中,特征的激活分布和稀疏度如何发展:

个人损失功能以及总损失,随着时间的过去特别有趣。然而,由于训练所使用的小批量,损失表现出相当大的噪音。实际上,除了它们的原始值之外,我们发现它们可视化移动平均值非常有用。了解脚本如何tf.train.ExponentialMovingAverage 用于此目的。

评估模型

现在让我们来评估训练模型在保留数据集上的表现。该模型由脚本进行评估cifar10_eval.py。它使用该inference()功能构建模型,并使用CIFAR-10评估集中的所有10,000个图像。它计算精度为1:顶部预测与图像的真实标签匹配的频率。

为了监控模型在训练过程中如何改进,评估脚本会定期运行在最新的检查点文件上cifar10_train.py

python cifar10_eval.py

不要在同一个GPU上运行评估和训练二进制文件,否则可能会耗尽内存。考虑在单独的GPU上运行评估,如果可用,或在同一GPU上运行评估,则暂停训练二进制文件。

你应该看到输出:

2015-11-06 08:30:44.391206: precision @ 1 = 0.860 ...

脚本只会定期返回精度@ 1 - 在这种情况下,它返回了86%的精度。cifar10_eval.py还可以在TensorBoard中显示可以显示的摘要。这些摘要在评估过程中提供了对模型的更多洞察。

训练脚本计算 所有学习变量的 移动平均版本。评估脚本用移动平均版本代替所有学习的模型参数。这种替代在评估时提升了模型性能。

练习:采用平均参数可以将预测性能提高约3%,按精度@ 1测量。编辑cifar10_eval.py不使用模型的平均参数,并验证预测性能下降。

使用多个GPU卡训练模型

现代工作站可能包含多个用于科学计算的GPU。TensorFlow可以利用这种环境在多个卡上同时运行训练操作。

以并行,分布式方式培训模式需要协调培训过程。对于接下来我们将模型副本 命名为数据子集上的模型训练的一个副本。

通过模拟参数的异步更新,导致了次优训练性能,因为可以对模型参数的陈旧副本进行单个模型副本的训练。相反,采用完全同步的更新将与最慢的模型副本一样慢。

在具有多个GPU卡的工作站中,每个GPU将具有相似的速度并包含足够的内存来运行整个CIFAR-10模型。因此,我们选择以下列方式设计培训系统:

  • 在每个GPU上放置单个模型副本。
  • 等待所有GPU完成一批数据的处理,同步更新模型参数。

这是一个这个模型的图:

请注意,每个GPU计算推论以及唯一批次数据的渐变。该设置有效地允许在GPU之间划分更大批量的数据。

此设置要求所有GPU共享模型参数。一个众所周知的事实是,传输数据到GPU和从GPU传输数据相当慢。因此,我们决定在CPU上存储和更新所有型号参数(参见绿色框)。当新的一批数据由所有GPU处理时,一组新的模型参数将传输到GPU。

GPU同步运行。所有梯度都从GPU累积并平均(见绿色框)。模型参数用所有模型复本平均的梯度进行更新。

在设备上放置变量和操作

在设备上放置操作和变量需要一些特殊的抽象。

我们需要的第一个抽象是用于计算单个模型副本的推理和渐变的函数。在代码中,我们将这个抽象称为“塔”。我们必须为每个塔设置两个属性:

  • 塔内所有操作的唯一名称。 tf.name_scope通过前置一个范围来提供这个唯一的名称。例如,第一个塔中的所有操作都有前缀tower_0,例如tower_0/conv1/Conv2D
  • 在塔内运行操作的首选硬体设备。 tf.device指定这个。例如,第一个塔中的所有操作都位于范围device('/gpu:0') 内,指示它们应该在第一个GPU上运行。

所有变量都固定在CPU上,并通过其访问 tf.get_variable ,以便在多GPU版本中共享它们。请参阅共享变量的方法

在多个GPU卡上启动和训练模型

如果您的机器上安装了几个GPU卡,则可以使用它们使用cifar10_multi_gpu_train.py脚本更快地对模型进行训练。该版本的训练脚本将多个GPU卡上的模型并行化。

python cifar10_multi_gpu_train.py --num_gpus=2

请注意,使用的GPU卡的数量默认为1.此外,如果您的计算机上只有1个GPU可用,所有计算都将放在其上,即使您要求更多。

练习:默认设置cifar10_train.py是以128的批量运行cifar10_multi_gpu_train.py。尝试运行2个GPU,批量大小为64,并比较训练速度。

下一步

恭喜!您已完成CIFAR-10教程。

如果您现在有兴趣开发和培训自己的图像分类系统,我们建议您分配本教程并更换组件以解决您的图像分类问题。

练习:下载 街景房屋号码(SVHN)数据集。叉CIFAR-10教程并在SVHN中交换作为输入数据。尝试调整网络架构以提高预测性能。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏dodott的专栏

盒子端 CSS 动画性能提升研究

不同于传统的 PC Web 或者是移动 WEB,在客厅盒子端,接大屏显示器下,许多能流畅运行于 PC 端、移动端的 Web 动画,受限于硬件水平,在盒子端的表现...

711
来自专栏机器学习、深度学习

二值人脸对齐--Binarized Convolutional Landmark Localizers for Human Pose Estimation and Face Alignment

Binarized Convolutional Landmark Localizers for Human Pose Estimation and Face A...

2525
来自专栏NewbieWeb

像素差逐帧动画

首先这是个从来没有在生产环境中使用的技术,而且对于交互较简单的展示动画等,可以使用视频直接替换(虽然视频也有很多兼容性问题);

672
来自专栏机器之心

学界 | BMXNet:基于MXNet的开源二值神经网络实现

选自arXiv 作者:杨浩进等 机器之心编译 参与:李亚洲 ? 论文地址:https://arxiv.org/abs/1705.09864 摘要:二值神经网络(...

2575
来自专栏何俊林

Android自定义View—刮刮卡效果

前言:在电商中,常用到一些劵和红包之类,往往是通过刮刮卡效果实现,本文来自Hensn_授权本公众号独家发布, Hensen_的csdn博客链接为:http://...

1698
来自专栏AI

Keras作为TensorFlow的简化界面:教程

周日 2016年4月24日 由弗朗索瓦Chollet 在教程中。

1.2K10
来自专栏新智元

孙剑团队提出移动端神经网络ShuffleNet,优于谷歌MobileNet

【新智元导读】在视觉人工智能系统中,卷积神经网络(CNN)起着至关重要的作用。旷视(Face++)孙剑等人的研究团队最近发表了《ShuffleNet:一种极高效...

3176
来自专栏腾讯大数据的专栏

深度卷积神经网络 CNNs 的多 GPU 并行框架 及其在图像识别的应用

将深度卷积神经网络(Convolutional Neural Networks, 简称CNNs)用于图像识别在研究领域吸引着越来越多目光。由于卷积神经网...

2165
来自专栏腾讯大讲堂的专栏

Mariana CNN 并行框架与图像识别

本文是腾讯深度学习系列文章的第三篇,聚焦于腾讯深度学习平台Mariana中深度卷积神经网络Deep CNNs的多GPU模型并行和数据并行框架。 将深度卷积神经网...

2167
来自专栏吉浦迅科技

Tensor Core

Tensor Core,也是Volta架构里面最重磅的特性。 ? Tensor Core实际上是一种矩阵乘累加的计算单元。矩阵乘累加计算在Deep Learn...

4718

扫码关注云+社区