Tensorflow 估计器输入函数:是否定义每个特征?
Tensorflow estimator input function: defining each feature or not?
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)
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)