前言

本文接着上一篇继续来聊Tensorflow的接口,上一篇中用较低层的接口实现了线性模型,本篇中将用更高级的API——tf.estimator来改写线性模型。

还记得之前的文章《机器学习笔记2 - sklearn之iris数据集》吗?本文也将使用tf.estimator改造该示例。

本文代码都是基于API版本r1.4。本文中本地开发环境为Pycharm,在文中不再赘述。

tf.estimator

内置模型

比起用底层API“较硬”的编码方式,tf.estimator的在使用时更像是对模型描述(或定义)的过程。Tensorflow训练评估数据处理等这些过程全部封装起来,让开发人员更专注于解决实际问题的建模过程,而不是纠结于代码实现过程。如果用tf.estimator改造上一篇中的线性模型的话,完整代码如下:

本例中使用的库numpy是一个开源工具,是一个功能非常强大且执行效率很高的库,主要用作数值处理及矩阵操作等。

import numpy as np
import tensorflow as tf# 定义特性列,线性模型中特性是列是x,shape=[1],因此定义如下:
feature_columns = [tf.feature_column.numeric_column("x", shape=[1])]# 使用tf.estimator内置的LinearRegressor来完成线性回归算法
# tf.estimator提供了很多常规的算法模型以便用户调用,不需要用户自己重复造轮子
# 到底为止,短短两行代码我们的建模工作就已经完成了
estimator = tf.estimator.LinearRegressor(feature_columns=feature_columns)# 有了模型之后,我们要使用模型完成训练->评估->预测这几个步骤
# 训练数据依旧是(1.,0.),(2.,-1.),(3.,-2.),(4.,-3.)这几个点,拆成x和y两个维度的数组
x_train = np.array([1., 2., 3., 4.])
y_train = np.array([0., -1., -2., -3.])# 评估数据为(2.,-1.01),(5.,-4.1),(8.,-7.),(1.,0.)这四个点,同样拆分成x和y两个维度的数组
x_eval = np.array([2., 5., 8., 1.])
y_eval = np.array([-1.01, -4.1, -7., 0.])# 用tf.estimator.numpy_input_fn方法生成随机打乱的数据组,每组包含4个数据
input_fn = tf.estimator.inputs.numpy_input_fn({"x": x_train}, y_train, batch_size=4, num_epochs=None, shuffle=True)
# 循环1000次训练模型
estimator.train(input_fn=input_fn, steps=1000)# 生成训练数据,分成1000组,每组4个数据
train_input_fn = tf.estimator.inputs.numpy_input_fn({"x": x_train}, y_train, batch_size=4, num_epochs=1000, shuffle=False)
# 生成评估数据,分成1000组,每组4个数据
eval_input_fn = tf.estimator.inputs.numpy_input_fn({"x": x_eval}, y_eval, batch_size=4, num_epochs=1000, shuffle=False)# 训练数据在模型上的预测准确率
train_metrics = estimator.evaluate(input_fn=train_input_fn)
# 评估数据在模型上的预测准确率
eval_metrics = estimator.evaluate(input_fn=eval_input_fn)print("train metrics: %r"% train_metrics)
print("eval metrics: %r"% eval_metrics)

输出结果如下:

train metrics: {'average_loss': 4.4709815e-08, 'loss': 1.7883926e-07, 'global_step': 1000}
eval metrics: {'average_loss': 0.0025470245, 'loss': 0.010188098, 'global_step': 1000}

自定义模型

虽然tf.estimator内置了大量的常用模型,但也并不代表我们必须使用内置模型。如有需要,我们可以用底层API实现自定义模型,同时,继续使用tf.estimator提供的高级特性。如上例中,我们需要定义自己的线性回归模型,仅需要按如下步骤操作:

替换estimator

# 下面这行替换了原先的estimator = tf.estimator.LinearRegressor(feature_columns=feature_columns)
estimator = tf.estimator.Estimator(model_fn=model_fn)

定义并实现model_fn方法

...
def model_fn(features, labels, mode):# 用底层API构建线性模型W = tf.get_variable("W", [1], dtype=tf.float64)b = tf.get_variable("b", [1], dtype=tf.float64)y = W * features['x'] + bloss = tf.reduce_sum(tf.square(y - labels))# 获取训练全局参数stepglobal_step = tf.train.get_global_step()# 梯度下降算法,学习率是0.01optimizer = tf.train.GradientDescentOptimizer(0.01)# 将优化器和全局step的累加方法打包成一个方法组,相当于把若干个方法打包成事务执行的模式train = tf.group(optimizer.minimize(loss), tf.assign_add(global_step, 1))# 将所有内容封装成符合tf.estimator.Estimator规范的对象return tf.estimator.EstimatorSpec(mode=mode,predictions=y,loss=loss,train_op=train)
...

生成并启动TensorBoard

tf.estimator中,生成TensorBoard的方法也被集成在了底层,我们要做的,仅仅是传入参数model_dir而已:

在LinearRegressor例中代码如下:

...
estimator = tf.estimator.LinearRegressor(feature_columns=feature_columns, model_dir='d1')
...
...
estimator = tf.estimator.Estimator(model_fn=model_fn, model_dir='d2')
...

TensorBoard的启动和上一篇文章中一样,在Pycharm的控制台中执行:

# 以LinearRegressor的代码为例
tensorboard --logdir=d1

启动TensorBoard大致效果如下:

IRIS数据集

现在我们来改造之前用sklearn实现的IRIS数据集。之前用了决策树邻近算法两种算法来实现,这次用的是Tensorflow提供的深度学习模型DNNClassifier,完整代码如下(代码是官网提供的Demo代码,仅仅将DNNClassifier中参数model_dir改为了当前目录下iris_model目录):

from __future__ import absolute_import
from __future__ import division
from __future__ import print_functionimport os
from six.moves.urllib.request import urlopenimport numpy as np
import tensorflow as tf# 数据集
IRIS_TRAINING = "iris_training.csv"
IRIS_TRAINING_URL = "http://download.tensorflow.org/data/iris_training.csv"IRIS_TEST = "iris_test.csv"
IRIS_TEST_URL = "http://download.tensorflow.org/data/iris_test.csv"def main():# 先将数据集保存到本地if not os.path.exists(IRIS_TRAINING):raw = urlopen(IRIS_TRAINING_URL).read()with open(IRIS_TRAINING, "wb") as f:f.write(raw)if not os.path.exists(IRIS_TEST):raw = urlopen(IRIS_TEST_URL).read()with open(IRIS_TEST, "wb") as f:f.write(raw)# 读取数据集training_set = tf.contrib.learn.datasets.base.load_csv_with_header(filename=IRIS_TRAINING,target_dtype=np.int,features_dtype=np.float32)test_set = tf.contrib.learn.datasets.base.load_csv_with_header(filename=IRIS_TEST,target_dtype=np.int,features_dtype=np.float32)feature_columns = [tf.feature_column.numeric_column("x", shape=[4])]# 创建一个三层的DNN深度学习分类器,三层分别有10、20、10个神经元classifier = tf.estimator.DNNClassifier(feature_columns=feature_columns,hidden_units=[10, 20, 10],n_classes=3,model_dir="iris_model")# 定义训练用的数据集输入train_input_fn = tf.estimator.inputs.numpy_input_fn(x={"x": np.array(training_set.data)},y=np.array(training_set.target),num_epochs=None,shuffle=True)# 训练模型classifier.train(input_fn=train_input_fn, steps=2000)# 定义测试用的数据集输入test_input_fn = tf.estimator.inputs.numpy_input_fn(x={"x": np.array(test_set.data)},y=np.array(test_set.target),num_epochs=1,shuffle=False)# 评估准确率accuracy_score = classifier.evaluate(input_fn=test_input_fn)["accuracy"]print("\nTest Accuracy: {0:f}\n".format(accuracy_score))# 预测两个新样本new_samples = np.array([[6.4, 3.2, 4.5, 1.5],[5.8, 3.1, 5.0, 1.7]], dtype=np.float32)predict_input_fn = tf.estimator.inputs.numpy_input_fn(x={"x": new_samples},num_epochs=1,shuffle=False)predictions = list(classifier.predict(input_fn=predict_input_fn))predicted_classes = [p["classes"] for p in predictions]print("New Samples, Class Predictions:    {}\n".format(predicted_classes))if __name__ == "__main__":main()

运行结果:

Test Accuracy: 0.966667New Samples, Class Predictions:    [array([b'1'], dtype=object), array([b'2'], dtype=object)]Process finished with exit code 0

可以看到,用tf.estimator提供的DNNClassifier,仅需要如下代码即可实现一个三层的DNN,并将模型保存在本地的iris_model文件夹下:

classifier = tf.estimator.DNNClassifier(feature_columns=feature_columns,hidden_units=[10, 20, 10],n_classes=3,model_dir="iris_model")

启动TensorBoard,看到的效果如下:

Run on ML Engine of Google Cloud Platform

前面几篇文章中,我在本地运行代码的之后,同时在阿里云PAI上执行了一次代码。本来我也是想在PAI上再进行本文中的示例代码的,不过我花了一天多的时间,最后还是失败了,主要原因如下:

  • PAI目前只支持到Tensorflow 1.2,而官方目前已经出到Tensorflow 1.4(马上要出1.5了),而Tensorflow 1.2是不支持tf.estimator.DNNClassifier的(代码中需要用到)

  • PAI虽然是可视化拖拽,但是代码还是需要按照PAI的要求进行少量改造,不便于本地代码直接放到云端执行

  • PAI的相关文档太少,遇到问题很难解决,就算提交工单技术支持也比较敷衍,这让我这样的初学者感到非常大的挫折感

说来也可笑,我的代码无论如何调整在PAI中运行都会报错,在PAI官方的技术QQ群里寻求帮助,半天没人搭理,然后有一个群友说PAI确实不好用,建议我用Google Cloud Platform。备受挫折的我就注册了一个Google Cloud Platform,果然,即便是全英文的文档,也让我在不到2小时的时间里,从注册账号到执行代码成功。这真不是我崇洋媚外或者故意黑阿里,我仅仅叙述了我自己的亲身经历而已。相比PAIGoogle Cloud PlatformML Engine就是一个虚拟云主机(Linux),可以直接用Google的Web版远程控制台进行操作,就跟操作一台真实的Linux一样的体验。因此本地代码也可以直接拷贝过去就能执行,不需要任何修改。运行速度上,我觉得比PAI快很多(没有数据,只是感觉)。

使用Google Cloud PlatformML Engine,需要一些前提条件:

  • 收费,需要绑定信用卡(VISA或MASTER),不过注册账号是送300美金体验1年(也就是一年内不超过300美金的消费是免费的),官方承诺,免费体验额度用完,如果要产生后续扣信用卡费用的行为,需要用户确认之后才会继续扣款

  • 较好的英文阅读能力(能基本看懂英文技术、帮助文档)

  • FQ(你懂的)

  • 会操作Linux系统

以下就是我在Google Cloud PlatformML Engine的Web控制台中操作的动图(注册过程略):

注意:

  • 我事先做过了实验,所以代码已经放在文件~/cloudml-samples-master/mymltest/tensorflowdemo3/code.py中,动图中仅仅是复制了一份代码到新的执行目录下。

  • Google Cloud Platform的帮助文档我放在了最后的参考文档中。


参考文档

官方文档:

https://www.tensorflow.org/get_started/get_started

https://www.tensorflow.org/get_started/estimator

ML Engine帮助文档:

https://cloud.google.com/ml-engine/docs/getting-started-training-prediction


本文在我的博客园和我的个人博客上同步发布,作者保留版权,转载请注明来源。

转载于:https://www.cnblogs.com/wushangjue/p/8334539.html

机器学习笔记5-Tensorflow高级API之tf.estimator相关推荐

  1. Tensorflow高级API的进阶--利用tf.contrib.learn建立输入函数

    正文共5958个字,预计阅读时间15分钟. 笔记整理者:王小草 笔记整理时间:2017年2月27日 笔记对应的官方文档:https://www.tensorflow.org/get_started/i ...

  2. 一文初探Tensorflow高级API使用(初学者篇)

    正文共5917个字,3张图,预计阅读时间34分钟. 笔记整理者:王小草 笔记整理时间:2017年2月26日 对应的官方文档地址:https://www.tensorflow.org/get_start ...

  3. Tensorflow高级API系列(一):Estimator是什么?

    前言 最近一直在做CTR预估的模型,为了应对大规模数据和导出更加易用的线上模型导出模型的问题,不得不放弃session,placehoder这种比较原始的tensorflow编码.使用更加高级的est ...

  4. Tensorflow API 讲解——tf.estimator.Estimator

    class Estimator(builtins.object) #介绍 Estimator 类,用来训练和验证 TensorFlow 模型. Estimator 对象包含了一个模型 model_fn ...

  5. 阿里云机器学习平台PAI的视频介绍(其中tensorflow高级教程有tf的代码优化讲解)

    https://tianchi.aliyun.com/competition/new_articleDetail.html?spm=5176.9876270.0.0.65d0a126iwqolt&am ...

  6. 机器学习笔记 - 使用TensorFlow进行音乐生成

    一.概述 这里我们将探索构建用于音乐生成的循环神经网络 (RNN).我们将训练一个模型来学习 [ABC记谱法] 中原始乐谱中的模式,然后使用该模型生成新音乐. 1.关于ABC记谱法 关于ABC记谱法的 ...

  7. matlab回归问题,机器学习笔记(一)—— 线性回归问题与Matlab求解

    给你多组数据集,例如给你很多房子的面积.房子距离市中心的距离.房子的价格,然后再给你一组面积. 距离,让你预测房价.这类问题称为回归问题. 回归问题(Regression) 是给定多个自变量.一个因变 ...

  8. tf.estimator.train_and_evaluate 详解

    TensorFlow 版本:1.11.0 在 TensorFlow 1.4 版本中,Google 新引入了一个新 API:tf.estimator.train_and_evaluate.提出这个 AP ...

  9. tf.estimator.Estimator解析

    Estimator类代表了一个模型,以及如何对这个模型进行训练和评估, class Estimator(builtins.object) 可以按照下面方式创建一个E def resnet_v1_10_ ...

最新文章

  1. 数据结构与算法分析(C++版)(第二版)
  2. python 写创建和追加一个文件
  3. Machine Learning实验3】SoftMax regression
  4. js常用reduce方法
  5. ftp连接中服务器位置,使用 FTP 连接到服务器
  6. 【Elasticsearch】es 增加 删除 节点
  7. php raido mysql,linux – 如何停止并修复已失败且I / O挂起的RAID 5阵列?
  8. pyspider all 只启动了_我是如何让微博绿洲的启动速度提升30%的(二)
  9. it有啥好咨询的_蓝盟浅析,IT外包的四种常用方式
  10. amplify color_如何使用Amplify监视Nginx
  11. 获取本机IP可区分系统可区分虚拟机和本机java程序跨平台
  12. 2021必看!java电子书合集
  13. 讯飞tts语音引擎_讯飞输入法A.I.语音引擎再升级 更强大更实用!
  14. LiveData setValue和postValue的区别及详解
  15. eighth week(1)
  16. 谷歌浏览器 Cookie 设置
  17. 【PDF】java使用Itext生成pdf文档--详解
  18. 【c++】Lanelet2 Examples笔记(二)
  19. 2021年8月语言排行榜
  20. 百度闪电算法什么时间开始

热门文章

  1. 房地产税预期影响房价走势:一线城市继续上行
  2. 安利一款简单好用的帮助文档制作软件
  3. java版溺尸掉三叉戟吗_我的世界:得不到溺尸的三叉戟怎么办?概率太低,版本要求不同!...
  4. 数字孪生技术(数字化双胞胎)
  5. postgresql索引_PostgreSQL中的索引— 6(SP-GiST)
  6. c++ stringstream ss()
  7. 歌曲用计算机弹出来网红英语歌,抖音里好听的英文歌
  8. 外汇天眼:投资200美元起 每天收益7%!千万别被蒙蔽双眼!
  9. 如有手机数据备份,悲剧不会发生
  10. 压缩感知详细介绍【赞】