tf.estimator快速入门[5]

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了tf.estimator快速入门[5]相关的知识,希望对你有一定的参考价值。

tf.estimator快速入门

TensorFlow的高级机器学习API(tf.estimator)可以很容易地配置,培训和评估各种机器学习模型。在本教程中,您将使用tf.estimator构建一个 神经网络 分类器和训练它在 虹膜数据集的基础上萼片/花瓣形状来预测的花卉品种。您可以编写代码来执行以下五个步骤:  

  1. 含鸢尾训练/测试数据划分为TensorFlow负载的CSV Dataset
  2. 构造一个神经网络分类
  3. 利用训练数据训练模型
  4. 评估模型的准确性
  5. 分类新样本

完整的神经网络源代码

下面是神经网络分类器的完整代码:

from __future__ import absolute_import
from __future__ import division
from __future__ import print_function

import os
import urllib

import numpy as np
import tensorflow as tf

# Data sets
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 the training and test sets aren‘t stored locally, download them.
  if not os.path.exists(IRIS_TRAINING):
    raw = urllib.urlopen(IRIS_TRAINING_URL).read()
    with open(IRIS_TRAINING, "w") as f:
      f.write(raw)

  if not os.path.exists(IRIS_TEST):
    raw = urllib.urlopen(IRIS_TEST_URL).read()
    with open(IRIS_TEST, "w") as f:
      f.write(raw)

  # Load datasets.
  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)

  # Specify that all features have real-value data
  feature_columns = [tf.feature_column.numeric_column("x", shape=[4])]

  # Build 3 layer DNN with 10, 20, 10 units respectively.
  classifier = tf.estimator.DNNClassifier(feature_columns=feature_columns,
                                          hidden_units=[10, 20, 10],
                                          n_classes=3,
                                          model_dir="/tmp/iris_model")
  # Define the training inputs
  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)

  # Train model.
  classifier.train(input_fn=train_input_fn, steps=2000)

  # Define the test inputs
  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)

  # Evaluate accuracy.
  accuracy_score = classifier.evaluate(input_fn=test_input_fn)["accuracy"]

  print("\nTest Accuracy: {0:f}\n".format(accuracy_score))

  # Classify two new flower samples.
  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()

以下各节走过了详细的代码。

加载虹膜CSV数据TensorFlow

虹膜数据集包含150行数据,包括来自每个的三个相关鸢尾种类50个样品: 山鸢尾虹膜锦葵,和变色鸢尾

技术分享

每行包含每个花的样品如下的数据: 萼片长度,萼片宽度, 花瓣长度,花瓣宽度,和花的品种。花种被表示为整数,0表示山鸢尾,表示1 变色鸢尾,和2表示虹膜锦葵

技术分享

对于本教程,虹膜数据已被随机化,并且分成两个单独的CSV:

 

要开始,首先导入必要的模块,并定义下载和存储数据集:

from __future__ import absolute_import
from __future__ import division
from __future__ import print_function

import os
import urllib

import tensorflow as tf
import numpy as np

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"

然后,如果训练和测试集还不是本地存储,下载。

if not os.path.exists(IRIS_TRAINING):
  raw = urllib.urlopen(IRIS_TRAINING_URL).read()
  with open(IRIS_TRAINING,w) as f:
    f.write(raw)

if not os.path.exists(IRIS_TEST):
  raw = urllib.urlopen(IRIS_TEST_URL).read()
  with open(IRIS_TEST,w) as f:
    f.write(raw)

接着,加载训练和测试集向Dataset使用S load_csv_with_header() 在方法learn.datasets.baseload_csv_with_header()方法有三个必需的参数:

  • filename,这需要的文件路径CSV文件
  • target_dtype,这需要的 numpy数据类型 的数据集的目标值。
  • features_dtype,这需要的 numpy数据类型 的数据集的特征值。

在此,目标(你训练模型预测值)是花种,这是0-2的整数,所以相应的numpy数据类型是np.int 

# Load datasets.
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)

DatasetS IN tf.contrib.learn被 命名为元组 ; 您可以通过访问特征数据和目标值datatarget 领域。在这里,training_set.datatraining_set.target包含用于训练集,分别特征数据和目标值,并test_set.data 与test_set.target含有特征数据和目标值的测试集。

后来,在 “装上DNNClassifier虹膜训练数据,” 您将使用training_set.data和 training_set.target训练模型,并在 “评估模型的准确性,”你会使用test_set.data和 test_set.target但首先,你会建立你的模型在下一节。

 构建深层神经网络分类

tf.estimator提供了多种预定义的模型,叫做EstimatorS,您可以使用“开箱即用”,以您的数据运行的培训和评估操作。在这里,你将配置一个深层神经网络分类模型,以适应虹膜数据。使用tf.estimator,你可以实例化tf.estimator.DNNClassifier与代码只是几行:

# Specify that all features have real-value data
feature_columns = [tf.feature_column.numeric_column("x", shape=[4])]

# Build 3 layer DNN with 10, 20, 10 units respectively.
classifier = tf.estimator.DNNClassifier(feature_columns=feature_columns,
                                        hidden_units=[10, 20, 10],
                                        n_classes=3,
                                        model_dir="/tmp/iris_model")

上述第一代码定义该模型的特征列,用来指定在所述数据集的特征的数据类型。所有特征数据是连续的,所以tf.feature_column.numeric_column是用构造特征列相应的功能。有在数据组四个特征(萼片宽度,萼片高度,花瓣宽度,和高度花瓣),所以相应地shape 必须设置为[4]以保持所有数据。

然后,代码创建一个DNNClassifier使用以下参数型号:

  • feature_columns=feature_columns上文所定义的组特征列。
  • hidden_units=[10, 20, 10]三个 隐藏层,含有10,20和10的神经元,分别。
  • n_classes=3三个目标类,代表三个光圈品种。
  • model_dir=/tmp/iris_model该目录中TensorFlow将模型训练过程中保存检查点数据和TensorBoard摘要。

描述训练输入管道

所述tf.estimatorAPI使用输入功能,其创建用于生成模型数据中TensorFlow操作。我们可以用tf.estimator.inputs.numpy_input_fn产生的输入管道:

# Define the training inputs
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)

适合DNNClassifier虹膜训练数据

 现在你已经配置了DNN classifier模型,您可以在适合使用光圈训练数据train的方法。通过train_input_fn作为input_fn,和步数来训练(在这里,2000年):

# Train model.
classifier.train(input_fn=train_input_fn, steps=2000)

该模型的状态被保存在classifier,这意味着你可以反复训练,如果你喜欢。例如,上面是等效于以下语句:

classifier.train(input_fn=train_input_fn, steps=1000)
classifier.train(input_fn=train_input_fn, steps=1000)

但是,如果你正在寻找跟踪模式,同时它训练,你可能会想改用TensorFlow SessionRunHook 执行记录操作。

 评价模型精度

 你已经训练你的DNNClassifier虹膜训练数据模型; 现在,您可以检查使用的虹膜测试数据的准确性 evaluate方法。像train, evaluate需要的是建立它的输入管道输入功能。evaluate 返回dicts的评价结果。下面的代码经过光圈测试DATA- test_set.datatest_set.target-to evaluate 并打印accuracy从结果:

# Define the test inputs
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)

# Evaluate accuracy.
accuracy_score = classifier.evaluate(input_fn=test_input_fn)["accuracy"]

print("\nTest Accuracy: {0:f}\n".format(accuracy_score))

当您运行完整的脚本,它将打印接近的东西:

Test Accuracy: 0.966667

你的准确度结果可能会略有不同,但应高于90%。不坏的一个相对较小的数据集!

分类新样本

技术分享

 

# Classify two new flower samples.
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))

结果应该如下:

New Samples, Class Predictions:    [1 2]

因此,该模型预测,第一样品是变色鸢尾,并且所述第二样品是虹膜锦葵

以上是关于tf.estimator快速入门[5]的主要内容,如果未能解决你的问题,请参考以下文章

tf.estimator.Estimator类的用法

tf.estimator.Estimator

修改 tf.estimator.Estimator 如何为 Tensorboard 创建摘要

如何从检查点使用 tf.estimator.Estimator 进行预测?

Keras Estimator + tf.data API

在 tf.Estimator 设置中使用 tf.metrics.precision/recall 计算 F1 分数