Tensorflow估算器输入功能:是否定义每个功能?

时间:2018-05-09 06:07:16

标签: python tensorflow tensorflow-estimator

x是一个120 x 4的Iris数据特征矩阵(4个特征),y是一个标签,我可以为tf.estimator创建一个输入函数,如下所示

def input_function(x, y):
    dict_x = {
        "sepal_length" : x[:,0],
        "sepal_width" :  x[:,1],
        "petal_length" : x[:,2],
        "petal_width" :  x[:,3]
    }

    dataset = tf.data.Dataset.from_tensor_slices((
        dict_x, y
    ))

    return dataset

然后定义如下的功能列:

feature_columns = [
    tf.feature_column.numeric_column(key="sepal_length"),
    tf.feature_column.numeric_column(key="sepal_width"),
    tf.feature_column.numeric_column(key="petal_length"),
    tf.feature_column.numeric_column(key="petal_width")
]

但是,我发现在互联网上(我忘记了源码,仍在搜索),我也可以像下面一样定义输入功能。与之前方法的不同之处在于现在仅使用一个键"x"定义了所有四个要素。

def input_function(x, y):
    dict_x = {
        "x" : x,
    }

    dataset = tf.data.Dataset.from_tensor_slices((
        dict_x, y
    ))

    return dataset

然后定义如下的功能列:

feature_columns = [
    tf.feature_column.numeric_column(key="x",shape=4),
]

我已经运行了两种方法,两者都给出了几乎相同的结果。 我的问题:我无法找到解释这两种方法之间差异的文档,因为dict_x一目了然。它们在神经网络的输入层是否仍然被平等对待?

我是tf.estimator的新人,谢谢你

如果需要我的估算代码:

classifier = tf.estimator.DNNClassifier(
    feature_columns=feature_columns,
    hidden_units=[10],
    n_classes=3,
    optimizer=tf.train.GradientDescentOptimizer(0.001),
    activation_fn=tf.nn.relu
)

# Train the model
classifier.train(
    input_fn=lambda:input_function(xtrain, ytrain, True)
)

1 个答案:

答案 0 :(得分:3)

如果numeric_column具有相同的dtype,则唯一的区别是结果输入的形状:

选项1创建形状输入:[120,4,1]:120个样本,每个样本由1个数字的4个向量表示。

而选项2创建形状输入:[120,1,4]:120个样本,每个样本由一个由4个数字组成的向量表示。

最后,它并不重要,因为在被送到网络之前,它们都被展平为[120,4]

首先我创建了这些功能。

features1 = {
    'sepal_length' : np.random.rand(120),
    'sepal_width': np.random.rand(120),
    'petal_length': np.random.rand(120),
    'petal_width': np.random.rand(120)
}

features2 = {
    'everything' : np.random.rand(120, 4)
}

然后我准备了功能列 - 与你一样。

feature_columns1 = [
    tf.feature_column.numeric_column(key="sepal_length"),
    tf.feature_column.numeric_column(key="sepal_width"),
    tf.feature_column.numeric_column(key="petal_length"),
    tf.feature_column.numeric_column(key="petal_width")
]

feature_columns2 = [
    tf.feature_column.numeric_column(key="everything", shape=4),
]

现在,为了了解当他们被送到网络时他们究竟做了什么,我们可以使用feature_column.input_layer()

inputs1 = tf.feature_column.input_layer(features1, feature_columns1)
inputs2 = tf.feature_column.input_layer(features2, feature_columns2)

正如我们所看到的,两种方式都形成了相同的形状。

with tf.Session() as sess:
    sess.run(tf.global_variables_initializer())
    res1 = sess.run(inputs1)
    res2 = sess.run(inputs2)
 
print(res1.shape)
print(res2.shape)
(120, 4)
(120, 4)