[翻译5.0] Chapter 5. Object Recognition and Classification 物体识别与分类

PS:翻译来源:

http://shop.oreilly.com/product/9781939902351.do

Part III. Implementing Advanced Deep Models in TensorFlow

Chapter 5. Object Recognition and Classification

Chapter 5. 物体识别与分类

现在你应该理解了Tensorflow的基本概念以及Tensorflow的最佳实践。我们接下来的实践会在构建模型中进行。这个模型具有识别物体和分类的能力。构建模型过长中会扩展一些迄今为止已经涉及的基础概念,同时增加了计算机视觉的术语,技术和基础。这种技术由于其准确性,最近变得流行起来。

ImageNet是一个有label的图像数据集,在计算机视觉和深度学习中最近很流行。每年ImageNet都会举行ILSVRC挑战赛,参赛者构建系统来自动的在ImageNet数据库的图像上进行分类和识别物体。在2012年的挑战赛中,SuperVision提交了具有创造性的神经网络结构的解决方案。ILSVRC解决方案常常是很有创造性的,除了SuperVision将其映射的准确性分为多少以外。SuperVision’s

entry针对计算机视觉精度设定了新的标准,并引起了(计算机视觉)在深度学习技术中对卷积神经网络的兴趣。

卷积神经网络(CNNs)的流行度不断增加(Convolutional Neural Networks (CNNs) have continued to grow inpopularity)。人们主要用于计算机视觉相关的任务中,但也不仅限于与图像相关的任务。CNN可以被用于任何可以被表达为Tensor的数据中,其中tensor的值是顺序排列的(a tensor where values are ordered next to related values (in a grid))。微软研究院在2014年发布了一篇关于将CNNs用于语音识别方面的论文,在这篇论文输入的tensor是被记录时排序的单行音频频率。对于图片来说,tensor的值是图像中对应的像素点的排列。

在本章节中,重点在于使用Tensorflow的CNNs用于图像的工作。目标是用Tensorflow构建一个CNN模型可以识别ImageNets数据库子集中图像。训练一个CNN模型需要在tensorflow里面和图片打交道,还需要理解并且如何使用卷积神经网络(CNNs)。这章节主要是致力于使用TensorFlow介绍计算机视觉概念。

训练CNN模型中使用的数据集合是ImageNet的子集,叫Stanford

Dogs Dataset

顾名思义,该数据集填充有不同狗品种的图像和图像中显示的品种的标签。该模型的目标是拍摄图像并准确地猜测图像中显示的狗的品种(示例图像标记为斯坦福大学的Dog Datase的西伯利亚赫斯基)。

《[翻译5.0] Chapter 5. Object Recognition and Classification 物体识别与分类》

如果上面显示的图像之一被加载到模型中,它应该输出西伯利亚赫斯基的标签。这些示例图像不会对模型的准确性进行公正的测试,因为它们存在于训练数据集中。找出一个公平的度量来计算模型的精确度需要大量的图像,不会用于训练。未用于训练模型的图像将用于创建单独的测试数据集。

提高图像公平性以测试模型准确性的原因是因为它是保持分离的测试,训练和交叉验证数据集的一部分。在处理输入时,分离用于训练网络的大部分数据是必需的做法。这种分离是允许对模型进行盲目测试。

使用用于训练它的输入测试模型可能会创建一个准确匹配已经看到的输入的模型,而不能使用新的输入。然后使用测试数据集来查看模型对培训中不存在的数据执行的程度。

随着时间的推移和模型的迭代,可能的是,为了提高准确性而进行的改变使模型更好地配备了测试数据集,同时在现实世界中表现不佳。一个好的做法是使用交叉验证数据集来检查最终的模型并获得更好的估计精度。

使用图像,最好在进行任何预处理(颜色调整或裁剪)时分离原始数据集,以保持输入管道在所有数据集中保持一致。

Convolutional Neural Networks (卷积神经网络)

从专业技术上讲,卷积神经网络是一种至少有一层(tf.nn.conv2d)卷积层的神经网络。在卷积层是将其输入层f和可配置卷积核g之间进行卷积并生成这一层的输出。在简化定义中,卷积的目的是将内核(过滤器、kernel、filter)应用于张量中的每一个点(point),并通过在输入张量上滑动内核来产生一个过滤之后(filtered)的输出。

PS:这句话说白了就是本层的输入和本层的卷积核以及卷积,卷积的过程通常是通过滑动窗口进行的,其输出的结果卷积后的。

给出一个边缘检测的滤波示例。给出一个应用于图像每一个像素点的内核,输出是描绘出所有边缘的新图像。在这个示例中,输入的张量(Tensor)是图像,张量中的每一个点被认为是一个包含有红、绿、蓝像素的点。内核会滑过图像中的每一个像素,并且当颜色之间存在边缘时输出的值就会增加。下图简单展示了当输入时一个图像,输出是图像中找到的所有水平线。

《[翻译5.0] Chapter 5. Object Recognition and Classification 物体识别与分类》

要理解如何结合输入进行卷积并且生成过滤后的图像和什么是卷积核这两点十分重要。因为一直到这章的后半部分都会在在练习的时候遇到。

Obtaining a broad sense of what a CNN does

and its biological inspiration builds the technical implementation。

在1968年,一篇文章详细地描述了关于猴条纹皮层(大脑想要处理视觉输入的部分)的细胞布局的新发现。文章讨论了垂直延伸组合在一起以匹配某些视觉特征的细胞群。灵长类大脑的研究似乎与机器学习任务无关,但它在使用CNN的深度学习发展中是有用的。

CNN遵循简化的过程匹配信息,类似于在猴纹状体皮层的细胞布局中发现的结构。当信号通过猴子的条纹皮质的时候,某些层会突出显示。例如,当水平线通过它时,某一层的细胞激活(增加其输出信号)。CNN的神经元群也会展示相似的行为,其通过从“训练”中学习到的模式将神经元簇将激活。比如,训练完毕以后,当一组横线通过的时候CNN会在确定的层里面激活。

(PS:这点我翻译的不是太准确,对horizontal line不是太了解,贴出原文:

CNNs follow a simplified process matching information similar to the structure found in the cellular layout of a monkey’s striate cortex. As signals are passed through a monkey’s striate cortex, certain layers signal when a visual pattern is highlighted. For example, one layer of cells activate (increase its output signal) when a horizontal line passes through it. A CNN will exhibit a similar behavior where clusters of neurons will activate based on patterns learned from training. For example, after training, a CNN will have certain layers that activate when a horizontal line passes through it.)

对于匹配水平线在神经网络架构上很有用。但是CNN把这种思想推进了一层,CNN使用多层简单的模式去匹配复杂模式。在CNN的上下文中,这些模式被称为过滤器(filter)或者是内核(kernel)。CNN的目标就是调整这些内核的权重直到他们可以准确的匹配训练数据为止。训练这些过滤器常常是通过组合不同的层并且通过梯度下降(gradient descent)学习权重的方式来实现。

一个普通的CNN架构可能会结合卷积层(tf.nn.conv2d),非线性层(tf.nn.relu),池化层(tf.nn.max_pooling)以及一个全连接层(tf.matmul)。如果没有这些层的话,我们很难匹配复杂的模式,这是因为网络会过滤掉很多信息。一个设计的比较好的CNN架构会在强调重要信息的同时去除噪声。在本节的后面会详细的讲解如何把这些层结合到一起来使用。

《[翻译5.0] Chapter 5. Object Recognition and Classification 物体识别与分类》

此架构的输入图像是一种复杂的格式,旨在支持加载多个图像的能力。加载一批图像同时需要允许计算多个图像,这就要求需要由复杂的数据结构。该数据结构应该是秩(rank)为4的张量,张量里包含了一批图像的所有信息。Tensorflow的输入管道(input pipline)(用于对文件解码并且读取)有一个用于批量处理多个图像的特殊设计形式,其包含了对于图像而言所有的信息:([image_batch_size, image_height, image_width, image_channels])。通过示例代码我们可以知道在与tensorflow的图像中检查输入的数据结构。

《[翻译5.0] Chapter 5. Object Recognition and Classification 物体识别与分类》
PS:
书中的原有代码不是这样写的,
但是大致差不多

示例代码的输出结果是:

《[翻译5.0] Chapter 5. Object Recognition and Classification 物体识别与分类》
PS
书中使用的是ipython/jupyter ,
输出的结果是:
TensorShape
([
Dimension
(
2
),
Dimension
(
2
),
Dimension
(
3
),
Dimension
(
3
)])

注意:

示例代码和以后的例子中不会包含启动tensorflow的运行代码。省略的部分包含有:导入tensorflow的语句(通常用tf来简称),创建Tensorflow的会话为sess,初始化所有的变量和启动并运行多个线程。如果不执行这些步骤就执行示例代码,可能会出现未定义变量错误。

在示例代码中,批处理图像中包含有两个图像。每个图像里面包含有高为两个像素、宽为3个像素的RGB色彩空间。执行代码之后会输出图像的数量作为第一个集合的维度,每个图像的高作为第二个集合的维度,图像的宽代表第三个集合的维度,色彩通道作为最后一个集合的维度。

图像的宽高映射关系需要注意,如果要尝试着获取第一个图像的第一个像素应该这样做:

sess.run(image_batch)[0][0][0]

执行示例之后的代码输出结果如下:

array([0,255,0],dtype=int32)

上面的示例不是从磁盘上加载的图像,image_batch变量可以看做是输入管道加载图像的一部分。使用输入管道会从磁盘上加载同样格式,所做的事情也是一样的。通常情况下,创建类似于上面示例的image_batch这样的假数据是有用的。它可以简化输入并使得调试问题变得简单。其主要是为了使得调试变得简单,因为CNN架构往往非常复杂,并且常常需要几天的时间用来训练。

PS:这句话说白就是,我们在模拟输入管道。模拟数据对于调试很有帮助。

CNN架构中遇到的第一个复杂工作就是卷积层的工作。在任何图像加载和操纵之后,卷积层往往是网络里面的第一层。第一个卷积层很有用,因为太会简化网络中其余的部分并用于调试。下一节将重点介绍卷积层如何操作,并且如何通过Tensorflow使用它。

Convolution(卷积)

顾名思义,卷积运算是卷积神经网络中重要的组成部分。CNN能够精确的匹配多种模式的能力可以归因于卷积计算。正如上一节所示,这些操作需要复杂的输入。在本节中,我们将实验卷积运算和调节他的可用参数。现在要将两个输入的张量(输入和卷积核)卷积为一个输出张量,该输出张量代表每一个输入的信息。

《[翻译5.0] Chapter 5. Object Recognition and Classification 物体识别与分类》

Input and Kernel (输入和卷积核)

在通常情况下Tensorflow中的卷积操作是使用tf.nn.conv2d。还有其他的用例是使用TensorFlow设计的特殊卷积操作。tf.nn.conv2d是开始进行实验的首选卷积运算。例如,我们将两个张量卷积在一起并检查结果。

input_batch=tf.constant([

[# First Input[[0.0], [1.0]],

[[2.0], [3.0]]

],

[# Second Input[[2.0], [4.0]],

[[6.0], [8.0]]

]

])

kernel=tf.constant([

[

[[1.0,2.0]]

]

])

上述代码创建了两个张量。Input_batch张量的形状和上一节见过的image_batch张量的形状类似。第一个张量将会是被卷积的,第二个张量是作为卷积核的。卷积核(Kernel)是一个很重要的术语,其可以与权重(weights)、滤波器(filter)、卷积矩阵(convolution matrix)、掩码(filter)互换。由于这个任务和计算机视觉相关,所以使用术语内核是对的,因为这种东西在计算机视觉中被称为图像内核。当用tensorflow描述功能的时候,术语之间没有实际的差别。

下期  会介绍一系列的tensorflow API  ,如下所示。 敬请期待。

Strides 

Padding

Data Format

Kernels in Depth

Common Layers

Convolution Layers

tf.nn.depthwise_conv2d

tf.nn.separable_conv2d

tf.nn.conv2d_transpose

Activation Function

tf.nn.relu

tf.sigmoid

    原文作者:斐波那契的数字
    原文地址: https://www.jianshu.com/p/afaa86731f07
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞