如何使用估计量之外的tensorflow.feature_列进行预测?
我想在会话中直接使用tensorflow feature_列和feature,绕过Estimator框架。我读书。问题是如何使用估计量之外的tensorflow.feature_列进行预测?,tensorflow,tensorflow-estimator,Tensorflow,Tensorflow Estimator,我想在会话中直接使用tensorflow feature_列和feature,绕过Estimator框架。我读书。问题是tf.feature\u column.input\u layer在构建时需要featuresfeed,但是在训练和预测时,feed是不同的。查看tf.Estimator代码,方法似乎是再次调用相同的构造回调函数以获得图形。我提出了下面的示例,但如果在第二次构造之后跳过表init,则在未初始化的表上失败;或者,如果我运行表init,它会抱怨表已经初始化。根据,这是设计的,因为他
tf.feature\u column.input\u layer
在构建时需要features
feed,但是在训练和预测时,feed是不同的。查看tf.Estimator
代码,方法似乎是再次调用相同的构造回调函数以获得图形。我提出了下面的示例,但如果在第二次构造之后跳过表init,则在未初始化的表上失败;或者,如果我运行表init,它会抱怨表已经初始化。根据,这是设计的,因为他们总是希望从保存点重新加载新模型。但对于强化学习这样的情况,我们希望在训练循环中同时进行更新和推断,这将是非常低效的。还不清楚他们想如何进行开发验证
为预测构建图形和提要特征的正确方法是什么
training_features = {
'sales' : [[5], [10], [8], [9]],
'department': ['sports', 'sports', 'gardening', 'gardening']}
test_features = {
'sales' : [[10], [20], [16], [18]],
'department': ['sports', 'sports', 'gardening', 'gardening']}
department_column = tf.feature_column.categorical_column_with_vocabulary_list(
'department', ['sports', 'gardening'])
department_column = tf.feature_column.indicator_column(department_column)
columns = [
tf.feature_column.numeric_column('sales'),
department_column
]
# similar to a tf.Estimator's model_fn callback
def mkgraph(features):
with tf.variable_scope('feature_test', reuse=tf.AUTO_REUSE):
inputs = tf.feature_column.input_layer(features, columns)
alpha = tf.placeholder(tf.float32, name='alpha')
output = inputs * alpha
return output, alpha
with tf.Graph().as_default() as g:
output, alpha = mkgraph(training_features)
print('output', output)
print('alpha', alpha)
var_init = tf.global_variables_initializer()
table_init = tf.tables_initializer()
with tf.Session(graph=g) as sess:
sess.run([var_init, table_init])
print(sess.run(output, feed_dict={alpha: 100.0})) # works here
print('testing')
output, alpha = mkgraph(test_features)
print('output', output)
print('alpha', alpha)
table_init = tf.tables_initializer()
# sess.run([table_init]) # with this, it fails on 'table already initialized'
# without table_init run, it fails on 'table not initialized'
print(sess.run(output, feed_dict={alpha: 200.0}))
如果您有一个训练数据集和一个测试数据集,并且需要在它们之间来回切换,您可以尝试使用
is\u training
开关。关于问题中的具体示例:
import tensorflow as tf
training_features = {
'sales' : [[5], [10], [8], [9]],
'department': ['sports', 'sports', 'gardening', 'gardening']}
test_features = {
'sales' : [[10], [20], [16], [18]],
'department': ['sports', 'sports', 'gardening', 'gardening']}
department_column = tf.feature_column.categorical_column_with_vocabulary_list(
'department', ['sports', 'gardening'])
department_column = tf.feature_column.indicator_column(department_column)
columns = [
tf.feature_column.numeric_column('sales'),
department_column
]
with tf.variable_scope('feature_test', reuse=tf.AUTO_REUSE):
alpha = tf.placeholder(tf.float32, name='alpha')
is_training = tf.placeholder(tf.bool, name='is_training')
training_inputs = tf.feature_column.input_layer(training_features, columns)
test_inputs = tf.feature_column.input_layer(test_features, columns)
output = tf.cond(is_training,
lambda: training_inputs * alpha,
lambda: test_inputs * alpha)
var_init = tf.global_variables_initializer()
table_init = tf.tables_initializer()
with tf.Session() as sess:
sess.run([var_init, table_init])
print('training')
print(sess.run(output, feed_dict={alpha: 100.0, is_training: True}))
print('testing')
print(sess.run(output, feed_dict={alpha: 200.0, is_training: False}))
一个潜在的问题是
功能列
都被启动。我不认为他们会把所有的东西都装进去,然后消耗掉所有的记忆。但是它们可能会占用更多的内存,并且可能会给您带来一些麻烦。您好,我在feature\u专栏
中遇到了类似的难题。这个问题解决了吗?添加一个在培训和测试之间切换的开关会有帮助吗?对于开发验证部分,我认为培训循环已经完成了交叉验证,因此我们不需要在外部进行。但是在RL类情况下,迭代输入训练数据和推理数据的一般问题没有答案。我想我有一个比你使用RL更简单的例子。但一般来说,我需要使用feature\u列
在列车组和测试组之间切换。增加一个开关对我有帮助,尽管我不确定这是否是最好的方法。希望我下面的答案能帮助你。