在tf.estimator中构建inpu_fn解读

来源:互联网 发布:linux配置自动获取ip 编辑:程序博客网 时间:2024/05/18 18:00
在tf.estimator中构建inpu_fn解读
https://www.tensorflow.org/get_started/input_fn


上一篇,讲了classifier的train等方法都需要一个输入管道,本篇来学习下。
input_fn方法是一类比较特殊的方法,它有一定的规定。函数名叫什么倒无所谓。
一般来讲,访方法做两件事:
1.数据预处理,如洗脏数据,归整数据等。没有就空着。
2.返回feature_cols, labels。这个是最重要的特点。
feature_cols:一个dict,key为feature名,value为feature值。
lables: 对应的分类标签。
不同的Lib有不同的对象,常见的为Numpy转tensorflow对象。pandas讨论较少,不谈。
比如:
import tensorflow as tf
import numpy as np
# numpy input_fn.


x_data =[{"feature1": 2, "features2":6},
         {"feature1": 1, "features2":5},
         {"feature1": 4, "features2":8}]
y_data = [2,3,4]


my_input_fn = tf.estimator.inputs.numpy_input_fn(
    x={"x": np.array(x_data)},
    y=np.array(y_data),
    shuffle = True)
得到的是一个名为my_input_fn的function对象。
在稀疏分类的情况下,可以使用SparseTensor类。
SparseTensor的构造函数如下:
def __init__(self, indices, values, dense_shape):
先举个例子,再来理解。
sparse_tensor = tf.SparseTensor(indices=[[0,1], [2,4]],
                                values=[6, 0.5],
                                dense_shape=[3, 5])
indices=[[0,1], [2,4]]:指下标为(0,1)和(2,4)的两个地方是非零值,其它地方都是0.
values=[6, 0.5]:上面只说了是非零值,这里指出这两个值是6和0.5.
dense_shape=[3, 5]:这就是shape为[3, 5]的矩阵。
通过上面的描述,可以画出下面的矩阵:
[[0, 6, 0, 0, 0]
 [0, 0, 0, 0, 0]
 [0, 0, 0, 0, 0.5]]
分类器需要一个函数对象做为参数,所以input_fn需要是无参的。
一个技巧是使用wrapper函数。
另一种方法是使用python的functools.partial函数。
classifier.train(
    input_fn=functools.partial(my_input_fn, data_set=training_set),
    steps=2000)
第三种:lambda方式:
classifier.evaluate(input_fn=lambda: my_input_fn(test_set), steps=2000)
第四种:使用tf.estimator.inputs包中现成的方法。
一般来讲,不是特殊需求,有现成的方法为啥不用呢。
DNNRegressor:estimator.Estimator的一个子类,也是一种评估器。
下面要做的事是预测波士顿地区的房价。
代码:https://github.com/tensorflow/tensorflow/blob/r1.3/tensorflow/examples/tutorials/input_fn/boston.py
跑这个代码还需要装pandas。装一个。
C:\Users\hasee>pip install --upgrade pandas -i https://pypi.tuna.tsinghua.edu.cn/simple
把代码boston.py拷入eclipse,下载boston_predict.csv,boston_test.csv和boston_train.csv三个文件到同一目录,运行,经过数秒,最后得到:
Loss: 1132.291016
INFO:tensorflow:Restoring parameters from /tmp/boston_model\model.ckpt-5000
Predictions: [array([ 33.76913071], dtype=float32), array([ 17.64979553], dtype=float32), array([ 22.93974304], dtype=float32), array([ 34.95032883], dtype=float32), array([ 14.87069702], dtype=float32), array([ 18.44752121], dtype=float32)]
UCI数据集:
UCI数据库是加州大学欧文分校(University of CaliforniaIrvine)提出的用于机器学习的数据库,这个数据库目前共有335个数据集,其数目还在不断增加,UCI数据集是一个常用的标准测试数据集。
UCI Housing Data Set应该是其中的一个库。这里是一个子集。
feature包括:
CRIM:   人均犯罪率 
ZN: 超过25000平方英尺的居民区的地段块数。
INDUS: 非零售商业区的块数。 
NOX: 每千万(单位不详)的氮氧化物浓度 
RM: 每户平均几间房
AGE: 在1940年以前房主占有的住处的数目
DIS: 到Boston雇用区的距离
TAX:    每1万美刀的税率
PTRATIO: 学生与老师的比率
以上是9个features.
预测目标:MEDV,房子的合理价格,单位是千美元。
打开boston_train.csv,400个训练样本。100个测试样本,6个预测样本。
格式与上一篇Iris植物的csv格式是一样的。
读代码:
pd.read_csv:是一个pandas方法,读入csv文件数据。
调试断点到prediction_set,看看,因为它数据少。
prediction_set
DataFrame:       crim    zn  indus    nox     rm   age     dis  tax  ptratio  medv
0  0.03359  75.0   2.95  0.428  7.024  15.8  5.4011  252     18.3   NaN
1  5.09017   0.0  18.10  0.713  6.297  91.8  2.3682  666     20.2   NaN
2  0.12650  25.0   5.13  0.453  6.762  43.4  7.9809  284     19.7   NaN
3  0.05515  33.0   2.18  0.472  7.236  41.1  4.0220  222     18.4   NaN
4  8.15174   0.0  18.10  0.700  5.390  98.9  1.7281  666     20.2   NaN
5  0.24522   0.0   9.90  0.544  5.782  71.7  4.0317  304     18.4   NaN
除第一列是序号,其它9个features已读入,label没有。由此不难想到training_set的样子。
feature_cols = [tf.feature_column.numeric_column(k) for k in FEATURES]
FEATURES有9个,所以有9列。feature_cols用来定义评估器。
regressor = tf.estimator.DNNRegressor(feature_columns=feature_cols,
                                        hidden_units=[10, 10],
                                        model_dir="/tmp/boston_model")
定义一个2个隐藏层的全连接网络。每层10个神经元。
regressor.train(input_fn=get_input_fn(training_set), steps=5000)
训练,其实在这里不是重点,重点是get_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)
首先,观察它对x,y的斌值方式,给的是pandas的数据类型。它返回的是对的调用。
其次,返回的是tf.estimator.inputs.pandas_input_fn的调用,专门消化pandas参数。
这是举了个使用现成的input_fn的例子。
剩下的代码已什么新意了,前面都接触过。
阅读全文
0 0
原创粉丝点击