最近,Google Cloud官方账号在Youtube上发布了名为“AI Adventures(AI探秘) ”的系列视频,介绍了机器学习的概念、学习方法和一些工具集,针对希望了解和学习人工智能开发知识的开发者提供了一个入门的指导和开始实际动手练习的框架。视频主讲是Google纽约办公室的布道师Yufeng Guo,一位年轻有为的华裔小伙子。直接去Youtube上看有些不便,我就将原声导出,进行了中文翻译,制作成了音频节目,包含了英文原声和中文解说,发布在我的播客 "码农王先生"中。需要的同学,可以在喜马拉雅FM ,iTunes ,或者泛用性播客客户端中搜索中文 "码农王先生",就可以订阅收听了。微信公众号也是中文的"码农王先生"。
这个小伙子的讲述逻辑很清晰,语音也很纯正。大家上班路上或者空闲时间,听一下播客音频 ,除了机器学习之外,对英语学习,也很有好处。**
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提供了读取数据集,设置数据属性和模型结构,训练模型和评估模型的方法。后面的视频我们会继续介绍用更复杂的数据和场景来增强模型。