页面树结构

版本比较

标识

  • 该行被添加。
  • 该行被删除。
  • 格式已经改变。

目录

 

面板
borderColor#00FFFF
borderStyledashed

原文链接 : https://www.tensorflow.org/get_started/tflearn

译文链接 : http://www.apache.wiki/pages/viewpage.action?pageId=10029485

贡献者 : 片刻 ApacheCN Apache中文网

校对:Ngxin

TensorFlow的高级机器学习API(tf.contrib.learn)可以轻松配置,训练和评估各种机器学习模型。在本教程中,您将使用tf.contrib.learn构建 神经网络 分类器并在Iris数据集上进行训练, 基于花萼/花瓣几何形状来预测花种。依照以下五个步骤编写代码:

  1. 将包含Iris训练/测试数据的CSV加载到TensorFlow数据集中
  2. 构建神经网络分类器
  3. 使用训练数据拟合模型
  4. 评估模型的准确性
  5. 分类新样本

注意: 在开始使用本教程之前,请先安装TensorFlow

 

完整的神经网络源代码

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

代码块
languagepy
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.contrib.layers.real_valued_column("", dimension=4)]

  # Build 3 layer DNN with 10, 20, 10 units respectively.
  classifier = tf.contrib.learn.DNNClassifier(feature_columns=feature_columns,
                                              hidden_units=[10, 20, 10],
                                              n_classes=3,
                                              model_dir="/tmp/iris_model")
  # Define the training inputs
  def get_train_inputs():
    x = tf.constant(training_set.data)
    y = tf.constant(training_set.target)

    return x, y

  # Fit model.
  classifier.fit(input_fn=get_train_inputs, steps=2000)

  # Define the test inputs
  def get_test_inputs():
    x = tf.constant(test_set.data)
    y = tf.constant(test_set.target)

    return x, y

  # Evaluate accuracy.
  accuracy_score = classifier.evaluate(input_fn=get_test_inputs,
                                       steps=1)["accuracy"]

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

  # Classify two new flower samples.
  def new_samples():
    return np.array(
      [[6.4, 3.2, 4.5, 1.5],
       [5.8, 3.1, 5.0, 1.7]], dtype=np.float32)

  predictions = list(classifier.predict(input_fn=new_samples))

  print(
      "New Samples, Class Predictions:    {}\n"
      .format(predictions))

if __name__ == "__main__":
    main()
以下部分详细介绍了代码。

 

将Iris CSV数据加载到TensorFlow中

Iris data set包含150行数据,包括来自每三个相关Iris种类的50个样品: ris setosa, Iris virginica, 以及 Iris versicolor

 

从左到右, Iris setosaRadomil,CC BY-SA 3.0), Iris versicolorDlanglois,CC BY-SA 3.0)和Iris virginicaFrank Mayfield,CC BY-SA 2.0))。

每行包含每个花样品的以下数据: 花萼长度,花萼宽度, 花瓣长度,花瓣宽度和花种。花种以整数表示,0表示Iris setosa,1表示Iris versicolor,2表示Iris virginica

花萼长度花萼宽度花瓣长度花瓣宽度种类
5.13.51.40.20
4.93.01.40.20
4.73.21.30.20
...............
73.24.71.41
6.43.24.51.51
6.93.14.91.51
...............
6.53.05.22.02
6.23.45.42.32
5.93.05.11.82

对于本教程,Iris数据已被随机分为两个独立的CSV:

我们现在开始吧,首先导入所有必要的模块,并定义下载和存储数据集的位置:

代码块
languagepy
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" 

然后,如果训练集和测试集尚未存储在本地,请下载。

代码块
languagepy
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)

接下来,使用learn.datasets.base中的load_csv_with_header() 方法将训练集和测试集加载到datasets中。该load_csv_with_header()方法需要三个必不可少的参数:

  • filename,带有文件路径的CSV文件。
  • target_dtype,数据集的形式为numpy 数据类型
  • features_dtype,数据特征集的形式为numpy 数据类型

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

代码块
languagepy
# 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)

tf.contrib.learn中的datasets被命名为 tuples ; 您可以通过datatarget 属性访问特征数据和目标值。这里的training_set.datatraining_set.target包含训练集的特征数据和目标值,test_set.data ,test_set.target包含测试集的特征数据和目标值。

稍后,在 “在Iris训练数据中拟合DNNC分类器”, 您将使用training_set.data和 training_set.target训练您的模型,在 “评估模型精度” 时,您将使用test_set.data和 test_set.target。但首先,您将在下一节中构建您的模型。

 

构建深层神经网络分类器

tf.contrib.learn提供了各种预定义的模型,称为 Estimators,您可以使用“out of the box”方式对数据进行训练和评估操作。在这里,您将配置深层神经网络分类器模型以拟合Iris数据。利用tf.contrib.learn,您可以使用几行代码实例化tf.contrib.learn.DNNClassifier

代码块
languagepy
# Specify that all features have real-value data
feature_columns = [tf.contrib.layers.real_valued_column("", dimension=4)]

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

上面的代码首先定义了模型的特征列,它们指定数据集中的特征数据类型。所有的特征数据是连续的,所以tf.contrib.layers.real_valued_column使用相应的函数来构造特征列。数据集中有四个特征(花萼宽度,花萼高度,花瓣宽度和花瓣高度),因此dimension 必须设置为4保存所有数据。

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

  • feature_columns=feature_columns。上面定义的特征列集合。
  • hidden_units=[10, 20, 10]。三个 隐含层,分别含有10,20和10个神经元。
  • n_classes=3。三个目标类别,代表三种Iris物种。
  • model_dir=/tmp/iris_model。TensorFlow将在模型训练期间保存检查点数据的目录。有关使用TensorFlow进行日志记录和监视的更多信息,请参阅Logging and Monitoring Basics with tf.contrib.learn.。

 

训练的输入渠道

训练的输入流

tf.contrib.learnAPI使用输入函数,创建为模型生成数据的TensorFlow操作。本例中,数据足够小,可以TensorFlow constants 存储。以下代码生成最简单的输入:

代码块
languagepy
# Define the test inputs
def get_train_inputs():
  x = tf.constant(training_set.data)
  y = tf.constant(training_set.target)

  return x, y

在Iris训练数据上拟合DNN分类器

现在您已经配置了DNN classifier模型,您可以使用该fit方法将其拟合Iris训练数据。将get_train_inputs传递给input_fn,指定训练的步骤(这里取2000):

代码块
languagepy
# Fit model.
classifier.fit(input_fn=get_train_inputs, steps=2000)
模型的状态保留在classifier,这意味着如果你喜欢,你可以分布训练。例如,以上代码相当于:
代码块
languagepy
classifier.fit(x=training_set.data, y=training_set.target, steps=1000)
classifier.fit(x=training_set.data, y=training_set.target, steps=1000)
但是,如果您希望在训练时跟踪模型,则可能需要使用TensorFlow monitor 来执行日志记录操作。有关此主题的更多信息,请参阅
Logging and Monitoring Basics with tf.contrib.learn教程 。

 

评估模型精度

您已经在Iris训练数据上拟合DNNClassifier模型; 现在,您可以使用该evaluate方法检查其对Iris测试数据的准确性 。正如fit, evaluate需要一个构建其输入渠道的输入函数。evaluate 返回一个评估结果dict。下面的代码通过Iris测试数据- test_set.datatest_set.target进行evaluate并打印结果的精度:

代码块
languagepy
# Define the test inputs
def get_test_inputs():
  x = tf.constant(test_set.data)
  y = tf.constant(test_set.target)

  return x, y

# Evaluate accuracy.
accuracy_score = classifier.evaluate(input_fn=get_test_inputs,
                                     steps=1)["accuracy"]

print("\nTest Accuracy: {0:f}\n".format(accuracy_score))
注意:这里的steps参数对evaluate很重要。 evaluate直到它到达输入的末尾才停止运行。这对于评估一组文件是完美的,但是这里使用常量将永远不会
抛出OutOfRangeError或 StopIteration

当您运行完整的脚本时,打印的值基本为:

代码块
languagepy
Test Accuracy: 0.966667
您的准确性结果可能有所不同,但应高于90%。对于相对较小的数据集来说不错!

 

分类新样本

使用estimator的predict()方法对新样本进行分类。例如,说你有这两个新的花朵样例:

花萼长度花萼宽度花瓣长度花瓣宽度
6.43.24.51.5
5.83.151.7

您可以使用该predict()方法预测其物种。predict返回一个生成器,可以很容易地转换成一个列表。以下代码取得并打印分类的预测结果:

代码块
languagepy
# Classify two new flower samples.
def new_samples():
  return np.array(
    [[6.4, 3.2, 4.5, 1.5],
     [5.8, 3.1, 5.0, 1.7]], dtype=np.float32)

predictions = list(classifier.predict(input_fn=new_samples))

print(
    "New Samples, Class Predictions:    {}\n"
    .format(predictions))
你的结果应该如下:
代码块
languagepy
New Samples, Class Predictions:    [1 2]
因此,该模型预测第一个样品是Iris versicolor,第二个样品是Iris virginica

 

其他资源