TensorFlow入门

TensorFlow编程框架

TensorFlow深度学习框架大致分为4层,结构如下


The TensorFlow Programming Environment 

在使用TensorFlow做训练模型的时候,官方推荐使用API

Estimators:训练模型API,它提供了训练模型,评估模型和使用模型进行预测的方法

Datasets:数据集API,它提供了获取数据以及对训练模型进行数据输入的方法,它与Estimators能够很好的协调工作

鸢尾花分类:概述

如下图有三种鸢尾花,分别是清风藤、杂色鸢尾和维尔吉妮卡(这里翻译不一定准,但不影响理解),通过萼片和花瓣的长度和宽度我们可以分辨出它们属于哪个品种


三种不同的鸢尾花

数据集

鸢尾花数据集包含4个特征集和1个标签集,如下:

特征集,与鸢尾花的生物特征相关

⊙ sepal length 萼片长度

⊙ sepal width 萼片宽度

⊙ petal length 花瓣长度

⊙ petal width 花瓣宽度

标签集,是鸢尾花的分类标识

⊙ Iris setosa (0) 清风藤

⊙ Iris versicolor (1) 杂色鸢尾

⊙ Iris virginica (2) 维尔吉妮卡

鸢尾花数据集

算法

深层神经网络分类模型的算法图如下:

⊙ 2层隐层

⊙ 每层有10个节点


鸢尾花分类的深层神经网络拓扑

推断

通过训练好的鸢尾花分类模型,我们输入一个未经过人工分类的鸢尾花特征数据,能得出类似如下的推断结果:

⊙ 0.03 for Iris Setosa

⊙ 0.95 for Iris Versicolor

⊙ 0.02 for Iris Virginica

这就是通过模型识别为某种鸢尾花的概率,它们的和为1

Estimators的使用

Estimator是TensorFlow的高层训练模型API,它屏蔽了数据初始化、日志、模型保存和恢复等细节,令你可以专心训练你的模型,使用默认的Estimator步骤如下:

⊙ 创建一个或多个输入函数(input function)

⊙ 定义模型特征集

⊙ 实例化Estimator,并传入特征集和超参数

⊙ 使用特定的输入函数作为参数调用Estimator的方法

创建输入函数

输入函数为模型训练、模型评估和数据预测等操作提供数据输入,它的返回值一般是个二元组:

features元组:一个map

    ⊙ key是特征的名字

    ⊙ values是包含所有特征值的数组

labels元组:一个包含所有标签值的数组

一个简单的输入函数实现如下:

def input_evaluation_set():    

    features = {'SepalLength': np.array([6.4, 5.0]),                

                       'SepalWidth':  np.array([2.8, 2.3]),                

                       'PetalLength': np.array([5.6, 3.3]),                

                       'PetalWidth':  np.array([2.2, 1.0])}   

    labels = np.array([2, 1])     return features, labels

TensorFlow建议使用Dataset API,它对解析一些数据输入源非常有帮助,其API层次如下:


Dataset API层次结构

Dataset:数据集API的基类,包含创建和传输数据集的接口

TextLineDataset:从文本文件读取数据集

TFRecordDataset:从TFRecord文件读取数据集

FixedLengthRecordDataset:从二进制文件读取数据集

Iterator:数据集迭代器,通过它可以遍历整个数据集

一个使用Dataset API的输入函数例子:

def train_input_fn(features, labels, batch_size):

    """An input function for training"""

    # Convert the inputs to a Dataset.

    dataset = tf.data.Dataset.from_tensor_slices((dict(features), labels))

    # Shuffle, repeat, and batch the examples.

    dataset =  dataset.shuffle(1000).repeat().batch(batch_size)

    # Build the Iterator, and return the read end of the pipeline.

    return dataset.make_one_shot_iterator().get_next()

定义特征列

特征列告诉Estimator都输入哪些特征。

例如鸢尾花的分类,有4种特征,生成特征列代码如下:

my_feature_columns = []

for key in train_x.keys():

    my_feature_columns.append(tf.feature_column.numeric_column(key=key))

实例化Estimator

鸢尾花分类是个典型的分类问题,TensorFlow内置了几种分类器Estimator模型:

⊙ tf.estimator.DNNClassifier:面向多类分类的深度学习模型

⊙ tf.estimator.DNNLinearCombinedClassifier:面向wide-n-deep模型

⊙ tf.estimator.LinearClassifier:面向线性分类模型

就鸢尾花分类问题,最合适的是tf.estimator.DNNClassifier

# Build 2 hidden layer DNN with 10, 10 units respectively.

classifier = tf.estimator.DNNClassifier(

    feature_columns = my_feature_columns,

    # Two hidden layers of 10 nodes each.

    hidden_units = [10, 10],

    # The model must choose between 3 classes.

    n_classes = 3)

训练、评估和预测

我们已经拥有了一个Estimator的实例,于是我们执行以下步骤:

⊙ 训练该模型

⊙ 评估训练好的模型

⊙ 用训练好的模型做预测

训练模型

调用Estimator的train方法开始训练模型:

# Train the Model.

classifier.train(    

    input_fn=lambda:iris_data.train_input_fn(train_x, train_y, args.batch_size),

    steps=args.train_steps)

这里我们用lambda表达式对我们的输入函数做一个封装,以捕获输入函数的参数,steps参数告诉该方法训练多少步后停止。

评估训练好的模型

模型训练好后,我们需要评估它的准确性,以下是评估训练模型的代码片段:

# Evaluate the model.

eval_result = classifier.evaluate(    

    input_fn=lambda:iris_data.eval_input_fn(test_x, test_y, args.batch_size))

print('\nTest set accuracy: {accuracy:0.3f}\n'.format(**eval_result))

运行代码输出如下:

Test set accuracy: 0.967

使用训练好的模型做预测

模型训练好后,我们就可以用它来做预测了,我们输入未经过分类的鸢尾花特征数据,然后调用predict做预测:

# Generate predictions from the model

expected = ['Setosa', 'Versicolor', 'Virginica']

predict_x = {    

    'SepalLength': [5.1, 5.9, 6.9],    

    'SepalWidth': [3.3, 3.0, 3.1],    

    'PetalLength': [1.7, 4.2, 5.4],    

    'PetalWidth': [0.5, 1.5, 2.1],

}

predictions = classifier.predict(input_fn = lambda:iris_data.eval_input_fn(predict_x, batch_size = args.batch_size))

使用迭代器获取predictions集合的数据:

for pred_dict, expec in zip(predictions, expected):    

    template = ('\nPrediction is "{}" ({:.1f}%), expected "{}"')    

    class_id = pred_dict['class_ids'][0]    

    probability = pred_dict['probabilities'][class_id]    

    print(template.format(iris_data.SPECIES[class_id], 100 * probability, expec))

运行代码输出如下:

Prediction is "Setosa" (99.6%), expected "Setosa"

Prediction is "Versicolor" (99.8%), expected "Versicolor"

Prediction is "Virginica" (97.9%), expected "Virginica"

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

推荐阅读更多精彩内容