tensorflow高层API之Estimator

Estimators是TensorFlow的高层API,它大大简化了机器学习的编程。通过Estimator创建一个模型,我们不用再写一些很底层的代码(比如定义变量、定义网络层等),可以像scikit-learn和Keras那样,用几行代码轻松创建一个模型。Estimator封装了以下功能:

  1. 模型训练;
  2. 模型评价;
  3. 模型预测;
  4. 模型导出。

Estimator模型由三部分构成:Input functions、Model functions和Estimators。

  1. Input functions:主要是由Dataset API组成,可以分为train_input_fn和eval_input_fn。前者接收参数,输出训练数据;后者接收参数,并输出验证数据和测试数据。
  2. Model functions:是Estimators的核心部分,在这个函数中可以定义模型架构,输入是特征和标签,输出是一个定义好的Estimator。Model functions由模型(the Layers API)和监控模块(the Metrics API)组成,主要有实现模型的训练、测试(验证)和监控显示模型参数状况等功能。
  3. Estimators:在模型中的作用类似于计算机中的操作系统。它将各个部分“黏合”起来,控制数据在模型中的流动与变换,同时控制模型的各种行为。
    使用Estimator具体有哪些优势呢?优势很多,主要包括:
    1. 提高开发效率。使用Estimator可大大方便你的开发,不用自己创建计算流图和session,因为Estimator会处理所有的流程。
    2. 比较好维护。它可以通过很小的改动就可以尝试不同的模型架构
      比如DNNClassifier是一个预置Estimator,它是一个通过稠密前向传播的神经网络来进行分类预测的模型。Estimators是基于tf.layers开发的,这样想做些改动也比较容易。
    3. Estimator提供了一个安全的分布式的训练环,它控制了如何和怎样去完成如下任务:
      1. 构建graph;
      2. 初始化变量;
      3. 启动队列;
      4. 异常处理;
      5. 创建checkpoint文件和错误恢复;
      6. 为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)

发布了79 篇原创文章 · 获赞 156 · 访问量 7万+

猜你喜欢

转载自blog.csdn.net/ZHUQIUSHI123/article/details/89365922