Building Input Functions with tf.estimator
来源:互联网 发布:手写输入法mac版下载 编辑:程序博客网 时间:2024/05/05 02:40
本教程将向您介绍如何在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列表,它正式指定用于训练的一组功能。 由于住房数据集中的所有功能都包含连续值,因此可以使用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创建。
本文主要使用谷歌翻译翻译。
- Building Input Functions with tf.estimator
- TensorFlow学习笔记11----Building Input Functions with tf.contrib.learn
- 深度学习笔记——深度学习框架TensorFlow(九)[Building Input Functions with tf.contrib.learn]
- tensorflow(4) 在tf.estimator中建立input函数
- tf.estimator Quickstart解读
- tensorflow(3) tf.estimator
- tf.estimator Quickstart
- tf.estimator 快速上手
- 学习笔记TF042:TF.Learn、分布式Estimator、深度学习Estimator
- 在tf.estimator中构建inpu_fn解读
- TF/02_TensorFlow_Way/03 Working with Multiple Layers04 Implementing Loss Functions
- Tensorflow实战学习(四十二)【TF.Learn、分布式Estimator、深度学习Estimator】
- 在tf.contrib.learn.Estimator设置GPU利用率
- 《Composing Programs》学习笔记(1)Chapter 1: Building Abstractions with Functions(关键词:软件工程/抽象/函数)
- 学习笔记TF043:TF.Learn 机器学习Estimator、DataFrame、监督器Monitors
- Tensorflow实战学习(四十三)【TF.Learn 机器学习Estimator,DataFrame,监督器Monitors】
- 第一阶段-入门详细图文讲解tensorflow1.4 -(七)tf.estimator的IRIS
- 第一阶段-入门详细图文讲解tensorflow1.4 -(八)tf.estimator构建数据预处理bostonHouse
- CSS !important的作用
- git
- 如何搭建基于可伸缩编码的播放器
- StringUtils
- 使用xutils在线预览和下载图片
- Building Input Functions with tf.estimator
- 冒泡排序算法
- fragment多层切套fragment出现试图不显示的原因
- PBOC/EMV-交易流程详解--POS与卡片的数据交互进行分析
- java常用的2中加密密码方式MD5和Encrypt
- Android开发中简化findViewById的几种方法
- Fibonacci Again
- screencap
- 基础的jquery