机器学习笔记5-Tensorflow高级API之tf.estimator
前言
本文接着上一篇继续来聊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'] + b
loss = tf.reduce_sum(tf.square(y - labels))
# 获取训练全局参数step
global_step = tf.train.get_global_step()
# 梯度下降算法,学习率是0.01
optimizer = 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_function
import os
from six.moves.urllib.request import urlopen
import 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.966667
New 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小时
的时间里,从注册账号到执行代码成功。这真不是我崇洋媚外或者故意黑阿里,我仅仅叙述了我自己的亲身经历而已。相比PAI
,Google Cloud Platform
的ML Engine
就是一个虚拟云主机(Linux),可以直接用Google的Web版远程控制台进行操作,就跟操作一台真实的Linux一样的体验。因此本地代码也可以直接拷贝过去就能执行,不需要任何修改。运行速度上,我觉得比PAI
快很多(没有数据,只是感觉)。
使用Google Cloud Platform
的ML Engine
,需要一些前提条件:
收费,需要绑定信用卡(VISA或MASTER),不过注册账号是送300美金体验1年(也就是一年内不超过300美金的消费是免费的),官方承诺,免费体验额度用完,如果要产生后续扣信用卡费用的行为,需要用户确认之后才会继续扣款
较好的英文阅读能力(能基本看懂英文技术、帮助文档)
翻墙(你懂的)
会操作Linux系统
以下就是我在Google Cloud Platform
的ML 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
本文在我的博客园和我的个人博客上同步发布,作者保留版权,转载请注明来源。
机器学习笔记5-Tensorflow高级API之tf.estimator的更多相关文章
- import tensorflow 报错: tf.estimator package not installed.
import tensorflow 报错: tf.estimator package not installed. 解决方案1: 安装 pip install tensorflow-estimator ...
- TensorFlow高级API(tf.contrib.learn)及可视化工具TensorBoard的使用
一.TensorFlow高层次机器学习API (tf.contrib.learn) 1.tf.contrib.learn.datasets.base.load_csv_with_header 加载cs ...
- tensorflow 高级api使用分布式之配置
"""Constructor. Sets the properties `cluster_spec`, `is_chief`, `master` (if `None` i ...
- 学习笔记TF049:TensorFlow 模型存储加载、队列线程、加载数据、自定义操作
生成检查点文件(chekpoint file),扩展名.ckpt,tf.train.Saver对象调用Saver.save()生成.包含权重和其他程序定义变量,不包含图结构.另一程序使用,需要重新创建 ...
- tf.estimator.Estimator类的用法
官网链接:https://www.tensorflow.org/api_docs/python/tf/estimator/Estimator Estimator - 一种可极大地简化机器学习编程的高阶 ...
- 使用TensorFlow高级别的API进行编程
这里涉及到的高级别API主要是使用Estimator类来编写机器学习的程序,此外你还需要用到一些数据导入的知识. 为什么使用Estimator Estimator类是定义在tf.estimator.E ...
- 学习笔记TF048:TensorFlow 系统架构、设计理念、编程模型、API、作用域、批标准化、神经元函数优化
系统架构.自底向上,设备层.网络层.数据操作层.图计算层.API层.应用层.核心层,设备层.网络层.数据操作层.图计算层.最下层是网络通信层和设备管理层.网络通信层包括gRPC(google Remo ...
- UNET学习笔记2 - 高级API(HLAPI)
高级API是在实时传输低级API基础上建立起来的,为多人游戏提供大量通用的组件.通过HLAPI开发者仅需少量的工作就可以搭建多人联网游戏. HLAPI 使用命名空间 UnityEngine.Netwo ...
- Kafka技术内幕 读书笔记之(三) 生产者——消费者:高级API和低级API——基础知识
1. 使用消费组实现消息队列的两种模式 分布式的消息系统Kafka支持多个生产者和多个消费者,生产者可以将消息发布到集群中不同节点的不同分区上:消费者也可以消费集群中多个节点的多个分区上的消息 . 写 ...
随机推荐
- RabbitMQ教程(一) ——win7下安装RabbitMQ
RabbitMQ依赖erlang,所以先安装erlang,然后再安装RabbitMQ; 下载RabbitMQ,下载地址: rabbitmq-server-3.5.6.exe和erlang,下载地址:o ...
- K:HashMap中hash函数的作用
在分析了hashCode方法和equals方法之后,我们对hashCode方法和equals方法的相关作用有了大致的了解.在通过查看HashMap类的相关源码的时候,发现其中存在一个int has ...
- 如何将外部的obj模型导入OpenGL
1.关于obj的说明. obj中存放的是顶点坐标信息(v),面的信息(f),法线(vn),纹理坐标(vt),以及材质(这个放在mtl)中 我使用CINEMA 4D导出用VS查看后的信息: CINEMA ...
- c#实现超实用的<证件照换底色>小工具
1前言 我们在工作和生活中经常要填写一些个人资料,这时候往往需要放证件照上去,但是有时候人家要求是红底或白底,但是偏偏不巧的是你以前照了张蓝底的.这时候你想换个底色,于是在百度上一搜“证件照换 ...
- JSON 序列化和解析
概述 JSON 即 (Javascript Object Notation,Javascript 对象表示法),是在Javascript中写结构化数据的方式.而JSON本身只是一种数据格式. 通常开发 ...
- ERP报错:所在的期间无效,但又无法新增账套期间。
问题: 进入2018新年月,客户在新增单据的时候,报错:日期[2018-01-03]所在的期间无效 正常解决方法 过账期间里面设置一下路径:管理----期间与结账----过账期间设置 先设置年期间-- ...
- Hyperledger Fabric 1.0 从零开始(十二)——fabric-sdk-java应用【补充】
在 Hyperledger Fabric 1.0 从零开始(十二)--fabric-sdk-java应用 中我已经把官方sdk具体改良办法,即使用办法发出来了,所有的类及文件都是完整的,在文章的结尾也 ...
- web服务器,应用程序服务器,http服务器的区别
WEB服务器.应用程序服务器.HTTP服务器有何区别?IIS.Apache.Tomcat.Weblogic.WebSphere都各属于哪种服务器? 这个概念很重要. Web服务器的基本功能就是提供We ...
- C# Main函数详解
2018-01-15 22:10:59 一.Main()方法的简介 1.唯一性.一般情况下,一个C#可执行程序只有一个Main函数,作为程序入口.但是在某些情况(如单元测试中),程序拥有多个Main ...
- CentOS7卸载自带jdk安装自己的JDK1.8
1.查看centos自带的jdk rpm -qa | grep Java 2.删除自带的jdk 例如:rpm -e --nodeps java-1.8.0-openjdk-1.8.0.102-4.b1 ...