Building Input Functions with tf.estimator

来源:互联网 发布:手写输入法mac版下载 编辑:程序博客网 时间:2024/05/05 02:40
用tf.estimator构建输入函数

    本教程将向您介绍如何在tf.estimator中创建输入函数。 您将了解如何构建一个input_fn来预处理数据并将数据输入到模型中。 然后,您将实施一个input_fn,将训练,评估和预测数据输入到神经网络回归器中,以预测房屋中值的中位数。
一、用input_fn自定义输入管道
    input_fn用于将特征和目标数据传递给火车,评估和预测估计器的方法。 用户可以在input_fn中进行特征工程或预处理。 以下是从tf.estimator快速入门教程中获取的示例:
import numpy as np

training_set = tf.contrib.learn.datasets.base.load_csv_with_header(
    filename=IRIS_TRAINING, target_dtype=np.int, features_dtype=np.float32)

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)
解剖一个input_fn

    以下代码说明了输入函数的基本框架:
def my_input_fn():

    # Preprocess your data here...

    # ...then return 1) a mapping of feature columns to Tensors with
    # the corresponding feature data, and 2) a Tensor containing labels
    return feature_cols, labels

    输入函数的主体包含用于预处理输入数据的特定逻辑,例如清理不好的示例或特征缩放。
    输入函数必须返回以下两个值,其中包含要输入到模型中的最终特征和标签数据(如上面的代码框架所示):
feature_cols
    包含将要素列名称映射到包含相应要素数据的Tensors(或SparseTensors)的键/值对的字典。
labels
    包含您的标签(目标)值的张量:您的模型旨在预测的值。
将要素数据转换为张量
    如果你的特征/标签数据是一个python数组或者存储在pandas数据框或numpy数组中,你可以使用下面的方法来构造input_fn:
import numpy as np
# numpy input_fn.
my_input_fn = tf.estimator.inputs.numpy_input_fn(
    x={"x": np.array(x_data)},
    y=np.array(y_data),
    ...)
import pandas as pd
# pandas input_fn.
my_input_fn = tf.estimator.inputs.pandas_input_fn(
    x=pd.DataFrame({"x": x_data}),
    y=pd.Series(y_data),
    ...)

    对于稀疏的分类数据(其中大多数值为0的数据),您将改为填充一个SparseTensor,该分析器使用三个参数实例化:
dense_shape
    张量的形状。获取一个列表,指出每个维度中元素的数量。例如,dense_shape = [3,6]指定一个二维3x6张量,dense_shape = [2,3,4]指定一个三维2x3x4张量,而dense_shape = [9]指定一个具有9个元素的一维张量。
indices
    张量中包含非零值的元素的索引。获取术语列表,其中每个术语本身是一个包含非零元素索引的列表。 (元素是零索引的,即[0,0]是二维张量中第一行第一列元素的索引值。)例如,indices = [[1,3],[ 2,4]]指定索引为[1,3]和[2,4]的元素具有非零值。
values
    价值的一维张量。期限i的价值对应于期限i的指数,并指定其价值。例如,给定indices = [[1,3],[2,4]],参数值= [18,3.6]指定张量的元素[1,3]的值为18,元素[2 ,4]的张量值为3.6。
    下面的代码定义了一个三维和五列的二维SparseTensor。索引为[0,1]的元素的值为6,索引为[2,4]的元素的值为0.5(所有其他值为0):
sparse_tensor = tf.SparseTensor(indices=[[0,1], [2,4]],
                                values=[6, 0.5],
                                dense_shape=[3, 5])

    这对应于下面的稠密张量:
[[0, 6, 0, 0, 0]
 [0, 0, 0, 0, 0]
 [0, 0, 0, 0, 0.5]]

    有关SparseTensor的更多信息,请参阅tf.SparseTensor。
将input_fn数据传递给您的模型
    要将数据提供给您的模型进行培训,只需将您创建的输入函数作为input_fn参数的值传递给列车运行,例如:
classifier.train(input_fn=my_input_fn, steps=2000)
    然而,如果你想能够参数化你的输入函数,还有其他的方法。 你可以使用一个不带参数的包装函数作为你的input_fn,并用它来调用你所需要的参数的输入函数。 例如:
def my_input_fn(data_set):
  ...

def my_input_fn_training_set():
  return my_input_fn(training_set)

classifier.train(input_fn=my_input_fn_training_set, steps=2000)

    或者,您可以使用Python的functools.partial函数来构建一个新的函数对象,其中所有参数值都是固定的:
classifier.train(
    input_fn=functools.partial(my_input_fn, data_set=training_set),
    steps=2000)

    第三个选项是将您的input_fn调用包装在lambda表达式中,并将其传递给input_fn参数:
classifier.train(input_fn=lambda: my_input_fn(training_set), steps=2000)
    如上所示设计输入流水线的一大优势是接受数据集的参数,您可以通过改变数据集参数来传递相同的input_fn来评估和预测操作,例如:
classifier.evaluate(input_fn=lambda: my_input_fn(test_set), steps=2000)
    这种方法增强了代码可维护性:不需要为每种类型的操作定义多个input_fn(例如,input_fn_train,input_fn_test,input_fn_predict)。
    最后,您可以使用tf.estimator.inputs中的方法从numpy或pandas数据集创建input_fn。 额外的好处是你可以使用更多的参数,比如num_epochs和shuffle来控制input_fn如何迭代数据:
import pandas as pd

def get_input_fn_from_pandas(data_set, num_epochs=None, shuffle=True):
  return tf.estimator.inputs.pandas_input_fn(
      x=pdDataFrame(...),
      y=pd.Series(...),
      num_epochs=num_epochs,
      shuffle=shuffle)
import numpy as np

def get_input_fn_from_numpy(data_set, num_epochs=None, shuffle=True):
  return tf.estimator.inputs.numpy_input_fn(
      x={...},
      y=np.array(...),
      num_epochs=num_epochs,
      shuffle=shuffle)

波士顿房屋价值的神经网络模型
    在本教程的其余部分,您将编写一个输入函数,用于预处理从UCI房屋数据集中提取的波士顿房屋数据的一个子集,并用它来向神经网络回归器提供数据以预测房屋中位数的中值。
    您将用来训练您的神经网络的Boston CSV数据集包含波士顿郊区的以下特征数据:
功能           说明
CRIM        人均犯罪率
ZN             住宅用地面积分为25,000平方英尺以上
INDUS      非零售业务的土地部分
NOX          一氧化氮浓度每1000万份中的一部分
RM            每间住宅的平均房间数
AGE          在1940年之前建成的自住住房的比例
DIS            距离波士顿地区就业中心
TAX           每10,000美元的房产税税率
PTRATIO  师生比例
    而你的模型预测的标签是MEDV,即自住住宅的中值,以千美元计。
二、建立
    下载以下数据集:boston_train.csv,boston_test.csv和boston_predict.csv。
    以下部分将逐步介绍如何创建输入函数,将这些数据集提供给神经网络回归器,训练和评估模型,并进行房屋价值预测。 完整的最终代码可以在这里找到。
导入住房数据
    首先,设置您的导入(包括pandas和张量流tensorflow)并将日志记录详细信息设置为INFO以获取更详细的日志输出:
from __future__ import absolute_import
from __future__ import division
from __future__ import print_function

import itertools

import pandas as pd
import tensorflow as tf

tf.logging.set_verbosity(tf.logging.INFO)

    在COLUMNS中定义数据集的列名。 为了从标签中区分特征,还要定义特征和标签。 然后读取三个CSV(tf.train,tf.test,predict)到pandas DataFrames: 

COLUMNS = ["crim", "zn", "indus", "nox", "rm", "age",
           "dis", "tax", "ptratio", "medv"]
FEATURES = ["crim", "zn", "indus", "nox", "rm",
            "age", "dis", "tax", "ptratio"]
LABEL = "medv"

training_set = pd.read_csv("boston_train.csv", skipinitialspace=True,
                           skiprows=1, names=COLUMNS)
test_set = pd.read_csv("boston_test.csv", skipinitialspace=True,
                       skiprows=1, names=COLUMNS)
prediction_set = pd.read_csv("boston_predict.csv", skipinitialspace=True,
                             skiprows=1, names=COLUMNS)

定义FeatureColumns并创建回归器
    接下来,为输入数据创建一个FeatureColumns列表,它正式指定用于训练的一组功能。 由于住房数据集中的所有功能都包含连续值,因此可以使用tf.contrib.layers.real_valued_column()函数创建它们的FeatureColumns:
feature_cols = [tf.feature_column.numeric_column(k) for k in FEATURES]
    注意:有关要素列的更深入的概述,请参阅此介绍,有关说明如何为分类数据定义FeatureColumns的示例,请参阅线性模型教程。
    现在,实例化神经网络回归模型的DNNRegressor。 您需要在这里提供两个参数:hidden_units,一个超参数,指定每个隐藏层中的节点数(这里是两个包含10个节点的隐藏层)和feature_columns,包含刚定义的FeatureColumn列表:
regressor = tf.estimator.DNNRegressor(feature_columns=feature_cols,
                                      hidden_units=[10, 10],
                                      model_dir="/tmp/boston_model")

建立input_fn
    要将输入数据传递到回归器,请编写一个接受熊猫数据框的工厂方法,并返回一个input_fn:
def get_input_fn(data_set, num_epochs=None, shuffle=True):
  return tf.estimator.inputs.pandas_input_fn(
      x=pd.DataFrame({k: data_set[k].values for k in FEATURES}),
      y = pd.Series(data_set[LABEL].values),
      num_epochs=num_epochs,
      shuffle=shuffle)

    请注意,输入数据在data_set参数中传递到input_fn,这意味着函数可以处理您导入的任何DataFrame:training_set,test_set和prediction_set。
    提供了两个额外的参数:num_epochs:控制迭代数据的历元数量。 对于培训,将此设置为无,所以input_fn保持返回数据,直到达到所需的训练步数。 为了评估和预测,将其设置为1,所以input_fn将迭代数据一次,然后引发OutOfRangeError。 这个错误会告诉Estimator停止评估或预测。 洗牌:是否洗牌数据。 为了评估和预测,将其设置为False,所以input_fn依次迭代数据。 对于火车,将其设置为“真”。
训练回归器
    为了训练神经网络回归器,运行训练集training_set传递给input_fn如下:
regressor.train(input_fn=get_input_fn(training_set), steps=5000)
    你应该看到类似于以下的日志输出,每100步报告一次训练损失:
INFO:tensorflow:Step 1: loss = 483.179
INFO:tensorflow:Step 101: loss = 81.2072
INFO:tensorflow:Step 201: loss = 72.4354
...
INFO:tensorflow:Step 1801: loss = 33.4454
INFO:tensorflow:Step 1901: loss = 32.3397
INFO:tensorflow:Step 2001: loss = 32.0053
INFO:tensorflow:Step 4801: loss = 27.2791
INFO:tensorflow:Step 4901: loss = 27.2251
INFO:tensorflow:Saving checkpoints for 5000 into /tmp/boston_model/model.ckpt.
INFO:tensorflow:Loss for final step: 27.1674.

评估模型
    接下来,看看训练的模型如何针对测试数据集执行。 运行评估,这次将test_set传递给input_fn:
ev = regressor.evaluate(
    input_fn=get_input_fn(test_set, num_epochs=1, shuffle=False))

    从ev结果中检索损失并打印输出:
loss_score = ev["loss"]
print("Loss: {0:f}".format(loss_score))

    您应该看到类似于以下的结果:
INFO:tensorflow:Eval steps [0,1) for training step 5000.
INFO:tensorflow:Saving evaluation summary for 5000 step: loss = 11.9221
Loss: 11.922098

做预测
    最后,您可以使用该模型来预测prediction_set的房屋中值,其中包含以下六个示例的特征数据,但没有标签:
y = regressor.predict(
    input_fn=get_input_fn(prediction_set, num_epochs=1, shuffle=False))
# .predict() returns an iterator of dicts; convert to a list and print
# predictions
predictions = list(p["predictions"] for p in itertools.islice(y, 6))
print("Predictions: {}".format(str(predictions)))

你的结果应该包含六千美元的房屋价值预测,例如:
Predictions: [ 33.30348587  17.04452896  22.56370163  34.74345398  14.55953979
  19.58005714]

三、其他资源
    本教程着重于为神经网络回归器创建一个input_fn。 要详细了解如何将input_fns用于其他类型的模型,请查看以下资源:
    (1)使用TensorFlow的大型线性模型:TensorFlow中线性模型的介绍提供了用于转换输入数据的特征列和技术的高级概述。
    (2)TensorFlow线性模型教程:本教程将介绍如何根据人口普查数据预测收入范围的线性分类模型的FeatureColumns和input_fn。

    (3)TensorFlow广泛深度学习教程:基于线性模型教程,本教程介绍了使用DNNLinearCombinedClassifier结合线性模型和神经网络的“宽广深度”模型的FeatureColumn和input_fn创建。


本文主要使用谷歌翻译翻译。

阅读全文
0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 机场来早了6小时怎么办 苏宁金融综合评分不足怎么办 苏宁金融秒拒怎么办 微盘账号忘记了怎么办 天府e税忘记密码怎么办 未成年在外面没地方住怎么办? 半框眼镜片掉了怎么办 选修差0.5个学分怎么办 脱产考博社保卡怎么办 幼儿上课不认真听讲怎么办 手机恢复的音频文件打不开怎么办 高考志愿填报不记得密码怎么办 经济纠纷案被告没有证据怎么办 管家婆管理员密码忘记了怎么办 人离职了公司扣发工资怎么办? 美国给我们断网怎么办 sci发表后发现错误怎么办 pos机按键是英文怎么办 蔚县县医院慢病本怎么办 知网下载的论文乱码怎么办 被期刊网骗了怎么办? 缝针缝到神经上怎么办 单位有个事特别多的领导怎么办 网上申请公司核名核不下来怎么办 老公把小三晒朋友圈老婆该怎么办 小三怀孕不愿意打掉怎么办 小三怀孕了引产怎么办 小三发现小四小三发现小四后怎么办 七十岁老人肺癌还有小三样怎么办 留学出国学历公认证怎么办 学历认证报告弄丢了怎么办 想读大专没考上怎么办 学信网身份证被注册了怎么办 学信网手机号换了密保忘了怎么办 学信网手机号改了密保忘了怎么办 学信网手机号忘了密保也忘了怎么办 学信网账号被注销了怎么办 原味奶酪太难吃怎么办 cma年费太贵了怎么办 会计证3年没年检怎么办 幼师面试没有什么特长怎么办