我用Python实现了12500张猫狗图像的精准分类

合集下载
相关主题
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

我用Python实现了12500张猫狗图像的精准分类

在这篇文章中,我们将展示如何建立一个深度神经网络,能做到以90% 的精度来对图像进行分类,而在深度神经网络,特别是卷积神经网络兴起之前,这还是一个非常困难的问题。深度学习是目前人工智能领域里最让人兴奋的话题之一了,它基于生物学领域的概念发展而来,现如今是一系列算法的集合。

事实已经证明深度学习在计算机视觉、自然语言处理、语音识别等很多的领域里都可以起到非常好的效果。

在过去的 6 年里,深度学习已经应用到非常广泛的领域,很多最近的技术突破,都和深度学习相关。

这里仅举几个例子:特斯拉的自动驾驶汽车、Facebook 的照片标注系统、像Siri 或Cortana 这样的虚拟助手、聊天机器人、能进行物体识别的相机,这些技术突破都要归功于深度学习。

在这么多的领域里,深度学习在语言理解、图像分析这种认知任务上的表现已经达到了我们人类的水平。

如何构建一个在图像分类任务上能达到90% 精度的深度神经网络?

这个问题看似非常简单,但在深度神经网络特别是卷积神经网络(CNN)兴起之前,这是一个被计算机科学家们研究了

很多年的棘手问题。

本文分为以下三个部分进行讲解:展示数据集和用例,并且解释这个图像分类任务的复杂度。搭建一个深度学习专用环境,这个环境搭建在AWS 的基于GPU 的EC2 服务上。训练两个深度学习模型:第一个模型是使用Keras 和TensorFlow 从头开始端到端的流程,另一个模型使用是已经在大型数据集上预训练好的神经网络。一个有趣的实例:给猫和狗的图像分类有很多的图像数据集是专门用来给深度

学习模型进行基准测试的,我在这篇文章中用到的数据集来自Cat vs Dogs Kaggle competition,这份数据集包含了大量狗和猫的带有标签的图片。

和每一个Kaggle 比赛一样,这份数据集也包含两个文件夹:训练文件夹:它包含了25000 张猫和狗的图片,每张图片都含有标签,这个标签是作为文件名的一部分。我们将用这个文件夹来训练和评估我们的模型。测试文件夹:它包含了12500 张图片,每张图片都以数字来命名。对于这份数据集中的每幅图片来说,我们的模型都要预测这张图片上是狗还是猫(1= 狗,0= 猫)。事实上,这些数据也被Kaggle 用来对模型进行打分,然后在排行榜上排名。我们观察一下这些图片的特点,这些图片各种各样,分辨率也各不相同。图片中的猫和狗形状、所处位置、体表颜色各不一样。

它们的姿态不同,有的在坐着而有的则不是,它们的情绪可

能是开心的也可能是伤心的,猫可能在睡觉,而狗可能在汪汪地叫着。照片可能以任一焦距从任意角度拍下。

这些图片有着无限种可能,对于我们人类来说在一系列不同种类的照片中识别出一个场景中的宠物自然是毫不费力的

事情,然而这对于一台机器来说可不是一件小事。

实际上,如果要机器实现自动分类,那么我们需要知道如何强有力地描绘出猫和狗的特征,也就是说为什么我们认为这张图片中的是猫,而那张图片中的却是狗。这个需要描绘每个动物的内在特征。

深度神经网络在图像分类任务上效果很好的原因是,它们有着能够自动学习多重抽象层的能力,这些抽象层在给定一个分类任务后又可以对每个类别给出更简单的特征表示。

深度神经网络可以识别极端变化的模式,在扭曲的图像和经过简单的几何变换的图像上也有着很好的鲁棒性。让我们来看看深度神经网络如何来处理这个问题的。配置深度学习环境深度学习的计算量非常大,当你在自己的电脑上跑一个深度学习模型时,你就能深刻地体会到这一点。

但是如果你使用GPUs,训练速度将会大幅加快,因为GPUs 在处理像矩阵乘法这样的并行计算任务时非常高效,而神经网络又几乎充斥着矩阵乘法运算,所以计算性能会得到令人难以置信的提升。

我自己的电脑上并没有一个强劲的GPU,因此我选择使用

一个亚马逊云服务(AWS) 上的虚拟机,这个虚拟机名为

p2.xlarge,它是亚马逊EC2 的一部分。

这个虚拟机的配置包含一个12GB 显存的英伟达GPU、一个61GB 的RAM、4 个vCPU 和2496 个CUDA 核。可以看到这是一台性能巨兽,让人高兴的是,我们每小时仅需花费0.9 美元就可以使用它。当然,你还可以选择其他配置更好的虚拟机,但对于我们现在将要处理的任务来说,一台p2.xlarge 虚拟机已经绰绰有余了。

我的虚拟机工作在Deep Learning AMI CUDA 8 Ubuntu Version 系统上,现在让我们对这个系统有一个更清楚的了解吧。

这个系统基于一个Ubuntu 16.04 服务器,已经包装好了所有的我们需要的深度学习框架(TensorFlow,Theano,Caffe,Keras),并且安装好了GPU 驱动(听说自己安装驱动是噩梦般的体验)。

如果你对AWS 不熟悉的话,你可以参考下面的两篇文章:https://blog.keras.io/running-jupyter-notebooks-on-gpu-on-aws-a-starter-guide.htmlhttps:///keras-with-gpu-on-a mazon-ec2-a-step-by-step-instruction-4f90364e49ac

这两篇文章可以让你知道两点:建立并连接到一个EC2 虚拟机。配置网络以便远程访问jupyter notebook。

用TensorFlow 和Keras 建立一个猫/狗图片分类器环境配

置好后,我们开始着手建立一个可以将猫狗图片分类的卷积神经网络,并使用到深度学习框架TensorFlow 和Keras。先介绍下Keras:Keras 是一个高层神经网络API,它由纯Python 编写而成并基于Tensorflow、Theano 以及CNTK 后端,Keras 为支持快速实验而生,能够把你的idea 迅速转换为结果。

从头开始搭建一个卷积神经网络首先,我们设置一个端到端的pipeline 训练CNN,将经历如下几步:数据准备和增强、架构设计、训练和评估。

我们将绘制训练集和测试集上的损失和准确度指标图表,这将使我们能够更直观地评估模型在训练中的改进变化。

数据准备

在开始之前要做的第一件事是从Kaggle 上下载并解压训练数据集。我们必须重新组织数据以便让Keras 更容易地处理它们。我们创建一个data 文件夹,并在其中创建两个子文件夹:trainvalidation

在上面的两个文件夹之下,每个文件夹依然包含两个子文件夹:catsdogs

最后我们得到下面的文件结构:

data/train/dogs/dog001.jpgdog002.jpg...cats/cat001.jpgcat002.jp

g...validation/dogs/dog001.jpgdog002.jpg...cats/cat001.jpgcat00

2.jpg

相关文档
最新文档