ITPub博客

首页 > 人工智能 > 人工智能 > 通过 TensorFlow 构建您的第一个深度学习分类器(以狗为例)!

通过 TensorFlow 构建您的第一个深度学习分类器(以狗为例)!

原创 人工智能 作者:格伯纳 时间:2018-05-09 11:02:47 0 删除 编辑

通过 TensorFlow 构建您的第一个深度学习分类器(以狗为例)!

通过 TensorFlow 构建您的第一个深层学习分类器(以狗为例)!

卷积神经网络(如上图所示)是图像分类的有力工具

在本文中,会向您展示几种不同的技术。帮助您开发可用于经典图像分类问题的算法:从图像中检测狗品种。

并且在本文末,作者将为用户提供可以输入任何图像的代码,返回对不同狗品种的估计。此外,如果检测到人类,算法将提供最相似狗的品种的估计值。

注:这个项目是作为Udacity机器学习Nanodegree(GitHub回购)的一部分完成的。

1.什么是卷积神经网络?

卷积神经网络(也称为CNN或ConvNet)是一类深度神经网络,它在计算机视觉和视觉图像应用方面得到广泛采用。

有关CNN应用的著名案例可以参照斯坦福研究团队的研究论文。,他们通过单个CNN证明了皮肤损伤的级别。在这里需要注意的是,神经网络仅需使用像素和疾病标签作为输入项来训练图像。

卷积神经网络由多层组成。与其他图像分类算法相比,它对预处理的要求相对较少。

他们通过使用过滤器将卷积神经网络应用于图像来进行学习。算法是采用一个小方块(或“窗口”)把它应用在图像上。通过过滤器让CNN识别图像中的某些图案。以达到CNN通过零件滤镜,寻找与原图内容匹配的图像。

通过 TensorFlow 构建您的第一个深层学习分类器(以狗为例)!

用于图像分类的CNN层体系结构的示例(来源:https://bit.ly/2vwlegO)

网络的前几层可以检测简单的特征,如线条,圆形,边缘。在每层中,网络能够将这些发现结合起来,不断深入到神经网络的各个层面,学习更复杂的概念。

1.1有什么样的图层?

CNN的总体结构由输入层,隐藏层和输出层组成。它们是类型层,例如,卷积,激活,合并,压差,密集和SoftMax层。

通过 TensorFlow 构建您的第一个深层学习分类器(以狗为例)!

神经网络由输入层,隐藏层和输出层组成(来源:https://bit.ly/2Hxhjaw)

卷积层(或Conv层)是构成卷积神经网络的核心。Conv层由一组滤波器组成。每个滤波器可以被认为是一个小的正方形(具有固定的宽度和高度)。

在每次过程中,过滤器会在输入体积的宽度和高度上“卷积”。这个过程会产生一个二维激活图。这个图会给出在每个空间位置上该滤波器的响应。

为了避免过度拟合。在激活图中,Pooling图层应用于非线性下采样。换句话说,Pooling图层在丢弃信息时具有侵略性。但如果使用得当,则会非常有用。所以在CNN构架中,Pooling图层通常会跟随一个或两个Conv图层。

通过 TensorFlow 构建您的第一个深层学习分类器(以狗为例)!

在激活图中,合并图层应用非线性缩减采样(来源:https://bit.ly/2Hxhjaw)

Dropout图层也用于在随机忽略某些激活函数的情况下,来减少过度拟合。而密集图层则是完全连接的图层,并且通常位于神经网络的末端。

1.2什么是激活功能?

激活函数用于处理图层和神经网络的输出。激活函数是添加到隐藏图层和输出图层的节点。

您经常会发现ReLu激活函数用于隐藏层,而最后一层通常由SoftMax激活函数组成。作者的想法是通过叠加线性和非线性函数层,进行大量的模式检测并准确预测给定图像的标签。

作为一个标准化器,SoftMax通常被发现在最后一层,并产生一个离散的概率分布向量。这也符合作者的目的,因为作者想要的CNN输出是图像对应于特定类的概率。

最常见的激活功能包括ReLU和Sigmoid激活功能

通过 TensorFlow 构建您的第一个深层学习分类器(以狗为例)!

通过模型评估和性能评估,选择损失函数。在图像分类的CNN中,经常选择分类交叉熵。使用渐变下降来使错误最小化 - 在本文中,作者将依靠“rmsprop”(自适应学习速率方法)作为优化器,并将精度作为度量标准。

2.设置算法的构建块

为了构建算法,作者将使用TensorFlow,Keras(运行在TensorFlow之上的神经网络API)和OpenCV(计算机视觉库)。

2.1检测图像是否包含人脸

为了检测提供的图像是否包含人脸,作者将使用OpenCV的人脸检测算法(之一)。在使用任何人脸检测器之前,将图像转换为灰度是标准程序。以下是检测存储在face_cascade多尺度函数并将灰度图像作为参数的具体步骤。

通过 TensorFlow 构建您的第一个深层学习分类器(以狗为例)!

2.2检测图像是否包含狗

为了检测所提供的图像是否包含狗的面部,作者使用了预先训练中使用的ImageNet数据集的ResNet-50模型。该模型可以对来自1000个类别中的对象进行分类。假如给定一幅图像,预先训练的ResNet- 50模型将返回图像中对包含对象的预测。

使用TensorFlow作为后端时,Keras CNN需要一个4D数组作为输入。下面的path_to_tensor函数将一个字符串值的文件路径作为输入,并将其调整为一个224x224像素的正方形图像。

通过 TensorFlow 构建您的第一个深层学习分类器(以狗为例)!

此外,所有预先训练的模型都有额外的标准化步骤。所以必须从每个图像的每个像素中减去平均像素才行。

通过导入的函数preprocess_input实现。

通过 TensorFlow 构建您的第一个深层学习分类器(以狗为例)!

对于最终预测,如上面的代码所示。作者通过预测概率向量的argmax来获得与模型的预测对象类相对应的整。在这里,您可以通过使用ImageNet标签字典来识别对象类别。

3.使用转移学习构建您的CNN分类器

具备了检测图像中人和狗的功能后,作者现在需要一种方法来预测图像中的品种。在本节中,作者将创建一个分类狗品种的CNN。

为了在不牺牲准确性的情况下减少训练时间,作者将使用转移学习来培训CNN--这是一种允许使用并且已经在大型数据集上预先训练过的网络的方法。通过保持先前层次和新增加的训练层,作者可以利用预训练算法获得的知识将其用于程序上。

Keras包括几种预先训练的深度学习模型,可用于预测,特征提取和微调。

3.1模型架构

如前所述,ResNet-50模型输出为输入层 - 又称为瓶颈特征。在下面的代码块中,作者通过运行以下内容来提取对应的瓶颈特征。

通过 TensorFlow 构建您的第一个深层学习分类器(以狗为例)!

作者将建立模型架构,使得ResNet-50的最后卷积输出作为输入回到模型中。作者仅添加全局平均池和全连接层,其中后者包含每个狗类别的一个节点并具有Softmax激活功能。

通过 TensorFlow 构建您的第一个深层学习分类器(以狗为例)!

通过 TensorFlow 构建您的第一个深层学习分类器(以狗为例)!

在上面的代码输出中看到的,最终得到了一个有272,517个参数的神经网络!

3.2编译和测试模型

现在,可以使用CNN来测试在狗图像测试数据集中品种识别的程度了。为了微调模型,作者通过20个迭代,以减少使用RMS Prop优化后的损失函数(分类交叉熵)。

通过 TensorFlow 构建您的第一个深层学习分类器(以狗为例)!

测试准确度:80.0239%

可以看到该算法的测试准确度达到了80%,完全没有问题!

3.3用模型预测狗品种

现在已经有了算法,来编写一个函数,将图像路径作为输入并返回狗品种的预测模型。

通过 TensorFlow 构建您的第一个深层学习分类器(以狗为例)!

4.测试CNN分类器

现在,可以编写一个函数。除了确定它接受图像的文件路径外,还要确定图像是否包含人类,狗或两者都不包含。

如果在图像中检测到狗,则返回预测的品种。如果在图像中检测到人体,则返回类似的狗品种。如果在图像中均未检测到,则提供指示错误的输出。

通过 TensorFlow 构建您的第一个深层学习分类器(以狗为例)!

在几个样本图像上进行算法测试:

通过 TensorFlow 构建您的第一个深层学习分类器(以狗为例)!

这些预测看起来很准确!现在看看当作者输入人脸时会发生什么!

通过 TensorFlow 构建您的第一个深层学习分类器(以狗为例)!

显然,根据算法,作者(蓝色箭头)看起来像一只小猎犬。

最后,我们发现算法很容易出错。因为它通常不是一个很清晰的镜头,有噪点或额外的信息。因此,使用图像增强可能是一个不错的选择。

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/31509949/viewspace-2154213/,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论
管理员

注册时间:2018-03-30

  • 博文量
    213
  • 访问量
    404710