AI Adventures - 来自Google官方的机器学习视频 | 第三集 编写简单的预测器

最近,Google Cloud官方账号在Youtube上发布了名为“AI Adventures(AI探秘) ”的系列视频,介绍了机器学习的概念、学习方法和一些工具集,针对希望了解和学习人工智能开发知识的开发者提供了一个入门的指导和开始实际动手练习的框架。视频主讲是Google纽约办公室的布道师Yufeng Guo,一位年轻有为的华裔小伙子。直接去Youtube上看有些不便,我就将原声导出,进行了中文翻译,制作成了音频节目,包含了英文原声和中文解说,发布在我的播客 "码农王先生"中。需要的同学,可以在喜马拉雅FMiTunes ,或者泛用性播客客户端中搜索中文 "码农王先生",就可以订阅收听了。微信公众号也是中文的"码农王先生"。

这个小伙子的讲述逻辑很清晰,语音也很纯正。大家上班路上或者空闲时间,听一下播客音频 ,除了机器学习之外,对英语学习,也很有好处。**

AI Adventures #1 What is Machine Learning? - 什么是机器学习?

(中文文本在此 | 中文音频 在此(可直接收听) | Youtube视频在此(需科学上网)

AI Adventures #2 The 7 Steps of Machine Learning - 机器学习的七个步骤

(中文文本在此 | 中文音频 在此(可直接收听) | Youtube视频在此(需科学上网)

AI Adventures #3 Plain and Simple Estimators - 编写简单的预测器

(中文音频 在此(可直接收听) | Youtube视频在此(需科学上网) | 完整代码在此

大家都认为机器学习很棒,可是它要求很高的数学知识。而现在有越来越好的机器学习工具,训练模型越来越容易。我们可以利用工具分析理解要处理的数据集,而不是底层的数学原理。

机器学习是个餐桌上的不错的谈资,但对我们来说,还是真正的动手写代码更好一点。本文我们将写一些代码来训练一个模型。我们将使用Google的开源机器学习库,TensorFlow。

TensorFlow提供了大量的API,今天我们将使用到高级(High Level)API之一,Estimators(https://www.tensorflow.org/api_guides/python/contrib.learn)。Estimators封装了对数据集的训练过程,让我们可以从高层面去考虑数据集中抽象的逻辑关系,而不用一行行写底层代码。上一集中我们了解了线性模型(Linear Model),今天就用代码来实现它。

完整的Python示例代码和输出结果在Juptier Notebook上:http://nbviewer.jupyter.org/gist/yufengg/a6dff912ab48f7a273f5704ad9ab1311。下面我们来进行逐步的讲解。阅读代码需要有一些Python或者Java/C++等编程语言的基本知识。

我们的数据集来自于一篇1936年发表的研究兰花的论文,准确的说,是研究如何确定安德森鸢尾花的属种。其数据集包含了150个花朵样本,都属于鸢尾属下的三个亚属。每个样本包含四个特征数据被用作定量分析,分别是花萼和花瓣的长度和宽度。基于这四个特征的集合,统计学家费雪发明了一个线性判别分析的方法来确定其属种。详情和数据集可以参考维基百科安德森鸢尾花卉数据集。我们这个示例程序的作用,就是用上面这个数据集训练出一个线性模型,然后去辨认三种鸢尾花的照片,判断它们是哪一个亚属。

首先,我们引入Ternsoflow库,顺便把库版本打印出来:

import tensorflow as tf
import numpy as np

print(tf.__version__)

然后,让Tensorflow把数据集,也就是包含了150个样本的csv列表文件导入进来:

from tensorflow.contrib.learn.python.learn.datasets import base

# Data files
IRIS_TRAINING = "iris_training.csv"
IRIS_TEST = "iris_test.csv"

# Load datasets.
training_set = base.load_csv_with_header(filename=IRIS_TRAINING,
                                         features_dtype=np.float32,
                                         target_dtype=np.int)
test_set = base.load_csv_with_header(filename=IRIS_TEST,
                                     features_dtype=np.float32,
                                     target_dtype=np.int)

下一步,让TensorFlow建一个LinearClassifier,也就是一个线性模型,在参数里告诉TensorFlow我们要用到哪些数据种类,这里我们四个(花萼及花瓣的长度和宽度)全用:

# Specify that all features have real-value data
feature_name = "flower_features"
feature_columns = [tf.feature_column.numeric_column(feature_name, 
                                                    shape=[4])]
classifier = tf.estimator.LinearClassifier(
    feature_columns=feature_columns,
    n_classes=3,
    model_dir="/tmp/iris_model")

然后使用tf.constant()函数,读取csv文件中每一行,作为模型要用到的常量数据:

def input_fn(dataset):
    def _fn():
        features = {feature_name: tf.constant(dataset.data)}
        label = tf.constant(dataset.target)
        return features, label
    return _fn

数据有了,下一步就进行训练了。调用函数classifier.train(),指定数据集和训练步数就可以了。这个classifier是之前使用函数tf.estimator.LinearClassifier()建立出来的。

# Fit model.
classifier.train(input_fn=input_fn(training_set),
               steps=1000)
print('fit done')

classifier.train()干的活就是我们上一期所讲的,反复进行尝试和判断,每次提高一点准确度,直到指定的次数完成。等这个函数执行完,就可以试试这个classifier的效果怎么样了。使用函数classifier.evaluate(),通过参数指定测试用的数据集,函数会返回测试准确率。

# Evaluate accuracy.
accuracy_score = classifier.evaluate(input_fn=input_fn(test_set), 
                                     steps=100)["accuracy"]
print('\nAccuracy: {0:f}'.format(accuracy_score))
....
INFO:tensorflow:Finished evaluation at 2017-09-14-15:16:41
INFO:tensorflow:Saving dict for global step 4000: accuracy = 0.966667, average_loss = 0.0706094, global_step = 4000, loss = 2.11828

Accuracy: 0.966667

测试结果表明我们这个模型的准确率为96.66%,看上去还不错。然后我们把这个训练好的模型保存下来,下次就可以直接调用,不用重新执行训练函数了。使用classifier.export_savedmodel()函数,将模型保存为一个文件,之后可以使用Tensorflow来读取这个文件,生成可以直接使用的模型:

# Export the model for serving
feature_spec = {'flower_features': tf.FixedLenFeature(shape=[4], dtype=np.float32)}

serving_fn = tf.estimator.export.build_parsing_serving_input_receiver_fn(feature_spec)

classifier.export_savedmodel(export_dir_base='/tmp/iris_model' + '/export', 
                            serving_input_receiver_fn=serving_fn)

总结一下,TensorFlow Estimator API提供了读取数据集,设置数据属性和模型结构,训练模型和评估模型的方法。后面的视频我们会继续介绍用更复杂的数据和场景来增强模型。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 211,123评论 6 490
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,031评论 2 384
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 156,723评论 0 345
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,357评论 1 283
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,412评论 5 384
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,760评论 1 289
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,904评论 3 405
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,672评论 0 266
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,118评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,456评论 2 325
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,599评论 1 340
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,264评论 4 328
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,857评论 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,731评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,956评论 1 264
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,286评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,465评论 2 348

推荐阅读更多精彩内容