机器学习使用TensorFlow训练图像分类器

本文是机器学习入门的第六节,文中将教大家如何训练图像分类器,只需要图像目录就可以完成,比如说你构建一个分类器,来区分霸王龙和三角龙的图片,

《机器学习使用TensorFlow训练图像分类器》
《机器学习使用TensorFlow训练图像分类器》

或者你想区分莫奈和毕加索的画

《机器学习使用TensorFlow训练图像分类器》
《机器学习使用TensorFlow训练图像分类器》

为了做到以上功能,我们来做个代码实验,叫做tensorflow for poets。

这是开始学习做图片分类相关工作的一个好办法,现在有两件事,这个实验非常高级,为了训练我们的分类器,我们只要运行几个脚本,令人印象深刻的是,分类器所创造的,要比我几年前写的脚本好,我之后会向你展示代码实验室的运行状态时是什么样子的,我会添加上下文和背景,来解释为什么它好。

要通过tensorflow for pets训练一个图像分类器,我们只需要提供一样东西,训练数据,也就是一个有很多图像的图像目录,我的计划是创造一个可以区分五种不同花的图片分类器,玫瑰,太阳花等等。

《机器学习使用TensorFlow训练图像分类器》
《机器学习使用TensorFlow训练图像分类器》

这就是我的训练数据,注意我有5个目录,

《机器学习使用TensorFlow训练图像分类器》
《机器学习使用TensorFlow训练图像分类器》

每一种花都有一个目录,每个目录中都有很多图片,

《机器学习使用TensorFlow训练图像分类器》
《机器学习使用TensorFlow训练图像分类器》

我用花举例的原因是,我们在编码实验室中提供了这组数据,因为你可以很快上手,(网址:https://codelabs.developers.google.com/codelabs/tensorflow-for-poets/#0),如果你想使用自己的图片,关于恐龙的图片或者名画,你只需要创建一个目录,把网上找到的图片放在相应的目录中,每个目录大约有一百张图片。

我们有了训练数据后,我们就可以开始训练分类器了,我们会使用tensorflow来做这一步,tensorflow是一个开源的机器学习库,当他和深度学习机一起使用时他会变得非常有用,深度学习是最近几年发展迅猛,尤其是图像分类领域,也就是我们今天所要做的事情。在第一篇文章中,我们学习到决策树分类器(https://zhuanlan.zhihu.com/p/58797836),如何区分苹果和橘子的不同,我们发现手动做这个工作是不可能的,因为世界上有太多不同的苹果和橘子

《机器学习使用TensorFlow训练图像分类器》
《机器学习使用TensorFlow训练图像分类器》

现在我们也知道,分类器把特征作为输入,我们很难用代码,把有用的信息从图像中提取出来,比如,你不会去写一个可以探测一片水果质地的代码,为了解决这个问题,我们使用深度学习,因为在图像处理方面,他有巨大的优势,他就是这个你不用手动提取特征(机器学习中你需要自己去提取特征),你可以用使用图像中像素作为特性,分类器会解决其余问题。

《机器学习使用TensorFlow训练图像分类器》
《机器学习使用TensorFlow训练图像分类器》
《机器学习使用TensorFlow训练图像分类器》
《机器学习使用TensorFlow训练图像分类器》

为了区分我们训练素材的不同,让我们把莺尾花数据集和图像目录做比较,在莺尾花数据集中

《机器学习使用TensorFlow训练图像分类器》
《机器学习使用TensorFlow训练图像分类器》

每一列都描述花的一个特征,你可以想象我们呢是手动提取这些特征的,比如我们是用尺子来量花朵,相比之下,这是我们的训练数据:

《机器学习使用TensorFlow训练图像分类器》
《机器学习使用TensorFlow训练图像分类器》

在tensorflow for poets中,上图就是一个标记好的图片清单,图片分类器仅仅是一个函数,f(x)=y,在这里,x是一个2d的图像像素矩阵,y是玫瑰标签,当我们说深度学习时,我们使用的分类器叫做神经网络,从本质上来讲,这仅仅是另一类分类器,也就是跟上一次的记录相比最接近的一次,

《机器学习使用TensorFlow训练图像分类器》
《机器学习使用TensorFlow训练图像分类器》

区别在于神经网络,可以学习很多复杂的函数,在这个编码实验室里,tensorflow for poets幕后为你负责准备并训练编码神经网络,这并不意味着tensorflow的编码,要比我们目前看到的更加难写,事实上我很喜欢tensorflow的程序方法,是使用tf learn,tflearn是一个高级机器学习库,比tensorflow更加高级,语法类似scikit-learn,与我们目前学习的相似,下面是一个编码片段,

《机器学习使用TensorFlow训练图像分类器》
《机器学习使用TensorFlow训练图像分类器》

classifier=learn.DNNClassifier(hidden_units=[10,20,10],n_classes=3)

上面代码告诉我们如何引入神经网络,

classifier.fit(x_train,y_train,steps=200)

score=metrics.accuracy_score(y_test,classifier.predict(x_test))

fit告诉我们如何训练它,利用它来对新数据进行分类,你可以利用上面代码做到这一点。

下面我们来学习tensorflow库,我们先运行这段代码

python -m scripts.retrain \

–bottleneck_dir=tf_files/bottlenecks \

–model_dir=tf_files/models/”${ARCHITECTURE}” \

–summaries_dir=tf_files/training_summaries/”${ARCHITECTURE}” \

–output_graph=tf_files/retrained_graph.pb \

–output_labels=tf_files/retrained_labels.txt \

–architecture=”${ARCHITECTURE}” \

–image_dir=tf_files/flower_photos

https://codelabs.developers.google.com/codelabs/tensorflow-for-poets/index.html?index=..%2F..index#3

在代码实验室中有所有详细的信息,我会对两件事交代一下背景,也许你会想知道,首先脚本要运行大约20分钟来训练分类器,tensorflow不是从零开始训练分类器,他是从一个现有的叫做inception 的分类器开始训练的,inception是谷歌最好的图像分类器之一,并且它是开源的,在我们的训练数据中有几千张图片时,inception已经在一个有八个gpu配置的电脑上训练一千多个种类,一百二十万张图片了,训练inception需要两周的时间,在tensorflow for pets里,我们以inception为基础,然后使用一个叫做再次训练的功能,来调试,使其更好的分辨我们的图像,也让我们从新定义inception之前学习一些参数,这样我们就可以用很少的训练数据,创建一个高精准度的分类器了。

你执行完代码后,有了训练好的分类器后,我们就可以开始测试它了,我从维基百科上,下载一张玫瑰花的图片,使用我们的分类器来预测这是哪一种花,运行后答案正确。

我们分类器仅仅知道我们向他展示的数据图片,所以如果我们让他分类一个图片,比如罗马角斗场,他一定会说这是一种花,我们智能相信置信区域太低了。

训练一个图像分类器,是一个多样性和数量的游戏,多样性就是我们有更多的一种花的不同照片,预测结果才会更准确,如我们的训练器包含红白黄色的玫瑰,也有不同角度拍摄的玫瑰照片,从上活着从下,也有用玫瑰作为背景的图片,数量上我的意思是我们的数据越多我们就会创造更好的分类器,在我这个实验中我的玫瑰文件夹中有几百张图片,这用来训练inception足够了,你可能用更少的图片,不过准确度会降低,

    原文作者:飘哥
    原文地址: https://zhuanlan.zhihu.com/p/59083233
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞