Estimators是TensorFlow的高层API,它大大简化了机器学习的编程。通过Estimator创建一个模型,我们不用再写一些很底层的代码(比如定义变量、定义网络层等),可以像scikit-learn和Keras那样,用几行代码轻松创建一个模型。Estimator封装了以下功能:
- 模型训练;
- 模型评价;
- 模型预测;
- 模型导出。
Estimator模型由三部分构成:Input functions、Model functions和Estimators。
- Input functions:主要是由Dataset API组成,可以分为train_input_fn和eval_input_fn。前者接收参数,输出训练数据;后者接收参数,并输出验证数据和测试数据。
- Model functions:是Estimators的核心部分,在这个函数中可以定义模型架构,输入是特征和标签,输出是一个定义好的Estimator。Model functions由模型(the Layers API)和监控模块(the Metrics API)组成,主要有实现模型的训练、测试(验证)和监控显示模型参数状况等功能。
- Estimators:在模型中的作用类似于计算机中的操作系统。它将各个部分“黏合”起来,控制数据在模型中的流动与变换,同时控制模型的各种行为。
使用Estimator具体有哪些优势呢?优势很多,主要包括:- 提高开发效率。使用Estimator可大大方便你的开发,不用自己创建计算流图和session,因为Estimator会处理所有的流程。
- 比较好维护。它可以通过很小的改动就可以尝试不同的模型架构
比如DNNClassifier是一个预置Estimator,它是一个通过稠密前向传播的神经网络来进行分类预测的模型。Estimators是基于tf.layers开发的,这样想做些改动也比较容易。 - Estimator提供了一个安全的分布式的训练环,它控制了如何和怎样去完成如下任务:
- 构建graph;
- 初始化变量;
- 启动队列;
- 异常处理;
- 创建checkpoint文件和错误恢复;
- 为TensorBoard保存概要信息;
实例:使用Estimator预定义模型来实现mnist手写数字问题。
(1)下载并读取数据:
import numpy as np
import tensorflow as tf
from tensorflow.examples.tutorials.mnist import input_data
tf.logging.set_verbosity(tf.logging.INFO)
mnist = input_data.read_data_sets("./MNIST_data", one_hot=False)
feature_colunmns = [tf.feature_column.numeric_column("image", shape=[784])]
(2)实例化Estimator。这里使用tensorflow中已经写好的模型来构建模型。 MNIST是一个分类问题,我们选择tf.estimator.DNNClassifier作为模型的Estimators。由输入函数得到的特征是字典特征,但模型函数只能输入“值”数据,因此首先需要定义特征列。
estimator = tf.estimator.DNNClassifier(feature_columns=feature_colunmns,
hidden_units=[200, 50],
optimizer=tf.train.AdamOptimizer(1e-4),
n_classes=10,
dropout=0.2,
model_dir="model_dir")
(3)训练模型:创建Estimator对象后,可以开始训练模型。这里没有指明代价函数,对于分类问题默认是交叉熵。
train_input_fn = tf.estimator.inputs.numpy_input_fn(
x = {"image":mnist.train.images},
y = mnist.train.labels.astype(np.int32),
num_epochs=None,
batch_size=128,
shuffle=True)
estimator.train(input_fn=train_input_fn, steps=20000)
(4)测试模型。
test_input_fn = tf.estimator.inputs.numpy_input_fn(
x = {"image": mnist.test.images},
y = mnist.test.labels.astype(np.int32),
num_epochs=1,
batch_size=128,
shuffle=False)
test_results = estimator.evaluate(input_fn=test_input_fn)
accuracy_score = test_results["accuracy"]
print("\nTest Accuracy: {0:.4f}\n".format(accuracy_score))
print(test_results)
可以看出程序非常简洁,精度在98%左右,应该还不错。
完整程序如下:
import numpy as np
import tensorflow as tf
from tensorflow.examples.tutorials.mnist import input_data
tf.logging.set_verbosity(tf.logging.INFO)
mnist = input_data.read_data_sets("./MNIST_data", one_hot=False)
feature_colunmns = [tf.feature_column.numeric_column("image", shape=[784])]
estimator = tf.estimator.DNNClassifier(feature_columns=feature_colunmns,
hidden_units=[200, 50],
optimizer=tf.train.AdamOptimizer(1e-4),
n_classes=10,
dropout=0.2,
model_dir="model_dir")
train_input_fn = tf.estimator.inputs.numpy_input_fn(
x = {"image":mnist.train.images},
y = mnist.train.labels.astype(np.int32),
num_epochs=None,
batch_size=128,
shuffle=True)
estimator.train(input_fn=train_input_fn, steps=20000)
test_input_fn = tf.estimator.inputs.numpy_input_fn(
x = {"image": mnist.test.images},
y = mnist.test.labels.astype(np.int32),
num_epochs=1,
batch_size=128,
shuffle=False)
test_results = estimator.evaluate(input_fn=test_input_fn)
accuracy_score = test_results["accuracy"]
print("\nTest Accuracy: {0:.4f}\n".format(accuracy_score))
print(test_results)