Skip to main content
 首页 » 编程设计

python之Tensorflow 估计器输入函数 : defining each feature or not

2024年08月16日30EasonJim

x 是 Iris 数据的 120 x 4 特征矩阵(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) 
) 

请您参考如下方法:

如果 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)