[入门6]建立输入功能与tf.estimator
本教程介绍在tf.estimator创建输入功能。你会得到如何构造的概况input_fn
进行预处理和饲料数据到您的模型。然后,你会实现一个input_fn
为食的培训,评估和预测数据到神经网络回归预测中位房屋的价值。
自定义输入管道与input_fn
的input_fn
用于特征和目标数据传递给train
, evaluate
和predict
方法Estimator
。用户可以做的特征工程或预处理内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
输入函数体包含了预处理输入数据,如擦洗了坏榜样或特定的逻辑 特征缩放。
输入功能必须返回一个包含最终特征和标签数据被馈送到模型(如在上面的代码骨架示出)下面的两个值:
-
含有键/值对地图特征的列名与dict
Tensor
S(或SparseTensor
多个)含有相应的特征数据。 -
一个
Tensor
包含您的标签(目标)值:模型旨在值来预测。
feature_cols
labels
转换特征数据应用于张量
如果要素/标签数据是一个Python阵列或存储在 大熊猫 dataframes或 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]
指定了一个二维3×6张量,dense_shape=[2,3,4]
指定一个三维张量2x3x4,并dense_shape=[9]
指定与9个元素的一维张量。
indices
在张量中包含非零值的元素的索引。注意到术语的列表,其中每个术语是本身含有非零元素的索引的列表。(元素为零索引-即[0,0]是一种用于在二维张量在第一行的第一列中的元素的索引值。)例如,indices=[[1,3], [2,4]]
指定与1的索引[元件, 3]和[2,4]具有非零值。
values
值的一维的张量。期限i
在values
对应到足月i
的indices
,并指定其值。例如,给定indices=[[1,3], [2,4]]
,该参数values=[18, 3.6]
指定了元素[1,3]的张量具有18的值,和元件[2,4]的张量的具有3.6的值。
下面的代码定义的二维SparseTensor
用3行5列。具有索引[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数据对模型
为了养活数据对模型进行训练,你只需通过你创建你的输入功能train
作为价值操作input_fn
参数,例如
classifier.train(input_fn=my_input_fn, steps=2000)
请注意,input_fn
参数必须接受一个函数对象(即 input_fn=my_input_fn
),而不是一个函数调用的返回值(input_fn=my_input_fn()
)。这意味着,如果你试图将参数传递给 input_fn
你的train
调用,如下面的代码,这将导致 TypeError
:
classifier.train(input_fn=my_input_fn(training_set), 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
功能来构建一个新的函数对象具有固定的所有参数值: