Tensorflow tf.estimator.BoostedTrees回归器保存模型还原问题

Tensorflow tf.estimator.BoostedTrees回归器保存模型还原问题,tensorflow,tensorflow-estimator,Tensorflow,Tensorflow Estimator,我在使用tf.SavedModel恢复tf.estimator.BoostedTrees回归器模型时遇到问题。使用tf.contrib.predictor.from_saved_model()从保存的模型目录重新加载模型时,我收到以下错误: KeyError:“名称'boosted_trees/quantileaccumerator/'指的是 操作不在图形中。“ 此错误仅在使用数字特征(例如tf.feature_列.numeric_列)时发生。仅使用分类列时,重新加载模型效果良好 当我不保存/恢

我在使用tf.SavedModel恢复tf.estimator.BoostedTrees回归器模型时遇到问题。使用tf.contrib.predictor.from_saved_model()从保存的模型目录重新加载模型时,我收到以下错误:

KeyError:“名称'boosted_trees/quantileaccumerator/'指的是 操作不在图形中。“

此错误仅在使用数字特征(例如tf.feature_列.numeric_列)时发生。仅使用分类列时,重新加载模型效果良好

当我不保存/恢复时,BoostedTreesRegressionor会对所有功能进行成功评估和预测

以下估计器保存/还原方案已成功运行:
-具有数字和分类功能的DNN累加器
-具有数字和分类功能的线性累加器
-仅具有分类特征的boostedtree回归器

fc = tf.feature_column
feature_columns = [
fc.numeric_column('f1', dtype=tf.int64),
fc.numeric_column('f2', dtype=tf.int64),
fc.indicator_column(
               fc.categorical_column_with_vocabulary_list('f3',f3)),
fc.indicator_column(
               fc.categorical_column_with_vocabulary_list('f4',f4))
]

feature_spec = fc.make_parse_example_spec(feature_columns)

params = {
    'feature_columns' : feature_columns,
    'n_batches_per_layer' : n_batches,
    'n_trees': 200,
    'max_depth': 6,
    'learning_rate': 0.01
}

regressor = tf.estimator.BoostedTreesRegressor(**params)
regressor.train(train_input_fn, max_steps=400)

serving_input_receiver_fn = tf.estimator.export.build_parsing_serving_input_receiver_fn(feature_spec)

regressor.export_saved_model('saved_model', serving_input_receiver_fn)

.
.
.
# latest is path to saved model
predict_fn = predictor.from_saved_model(latest[:-4])
---------------------------------------------------------------------------
KeyError回溯(最近一次呼叫最后一次)
在里面
---->1 predict\u fn=预测器。从保存的\u模型(最新[:-4])
/usr/local/anaconda3/envs/zume/lib/python3.7/site-packages/tensorflow/contrib/predictor/predictor\u factories.py来自保存的模型(导出目录、签名密钥、签名定义、输入名称、输出名称、标记、图形、配置)
151标签=标签,
152图形=图形,
-->153配置=配置)
/usr/local/anaconda3/envs/zume/lib/python3.7/site-packages/tensorflow/contrib/predictor/saved_model_predictor.py in_uuuuinit_uuuuuuuuuu(self,export_dir,signature_def_key,signature_def,input_name,output_name,tags,graph,config)
151带有self.\u graph.as\u default():
152 self.\u session=session.session(config=config)
-->153 loader.load(self.\u会话,tags.split(','),export\u dir)
154
155如果输入_名称为无:
/新函数中的usr/local/anaconda3/envs/zume/lib/python3.7/site-packages/tensorflow/python/util/deprecation.py(*args,**kwargs)
322“在未来版本中”如果日期不是其他日期(“在%s“%date”之后),
323指令)
-->324返回函数(*args,**kwargs)
325返回tf_decorator.make_decorator(
326 func,新功能,“已弃用”,
/加载中的usr/local/anaconda3/envs/zume/lib/python3.7/site-packages/tensorflow/python/saved_model/loader_impl.py(sess、标记、导出目录、导入范围、**saver_kwargs)
267   """
268加载程序=SavedModelLoader(导出目录)
-->269返回加载器。加载(sess、标记、导入范围、**saver\u kwargs)
270
271
/加载中的usr/local/anaconda3/envs/zume/lib/python3.7/site-packages/tensorflow/python/saved_model/loader_impl.py(self、sess、tags、import_scope、**saver_kwargs)
418带有sess.graph.as_default():
419 saver,=self.load_图形(sess.graph、标记、导入范围、,
-->420**
421自恢复变量(sess、保存程序、导入范围)
422自运行初始化操作(sess、标记、导入范围)
/加载图中的usr/local/anaconda3/envs/zume/lib/python3.7/site-packages/tensorflow/python/saved\u model/loader\u impl.py(self、graph、tags、import\u scope、**saver\u kwargs)
348与graph.as_default()一样:
349返回tf_saver._导入_meta_graph_和_return_元素(#pylint:disable=protected access
-->350元图定义,导入范围=导入范围,**saver\u-kwargs)
351
352 def restore_变量(self、sess、saver、import_scope=None):
/usr/local/anaconda3/envs/zume/lib/python3.7/site-packages/tensorflow/python/training/saver.py在带有返回元素的元图中导入(元图或文件,清除设备,导入范围,返回元素,**kwargs)
1455导入范围=导入范围,
1456返回元素=返回元素,
->1457**夸尔格)
1458
1459 saver=\u从\u导入的\u元图创建\u saver\u(
/usr/local/anaconda3/envs/zume/lib/python3.7/site-packages/tensorflow/python/framework/meta\u graph.py,在import\u scoped\u meta\u graph\u中包含返回元素(meta\u graph\u文件、清除设备、图形、导入范围、输入映射、未绑定输入\u col\u名称、恢复\u集合\u谓词、返回\u元素)
850表示字段中的值。值:
851 col_op=graph.as_graph_元素(
-->852操作。前置\u名称\u范围(值、范围\u到\u前置\u到\u名称))
853图形。将_添加到_集合(键、列)
854 elif种类==“int64_列表”:
/as_graph_元素中的usr/local/anaconda3/envs/zume/lib/python3.7/site-packages/tensorflow/python/framework/ops.py(self、obj、allow_tensor、allow_operation)
3476
3477带自锁:
->3478返回自。\作为\图形\元素\锁定(obj,允许\张量,允许\操作)
3479
3480定义为图形元素锁定(自、obj、允许张量、允许操作):
/usr/local/anaconda3/envs/zume/lib/python3.7/site-packages/tensorflow/python/framework/ops.py in\u as\u graph\u element\u locked(self、obj、allow\u tensor、allow\u operation)
3536如果名称不在self.\u nodes\u by\u name中:
3537 raise KeyError(“名称%s指的是不在列表中的操作”
->3538“图形”。%repr(名称))
3539按名称[名称]返回self.\u节点
3540
KeyError:“名称‘boosted_trees/quantileaccumerator/’指的是不在图中的操作。”

如果您使用的是Tensorflow版本,
1.x(1.14,1.15)
,您可以使用

tf.compat.v1.saved_model.load
tf.compat.v1.saved_model.loader.load
tf.saved\u model.loader.load
加载保存的模型

如果您使用的是
Tensorflow版本2
,下面是使用
tf.estimator.BoostedTreesClassifier
成功保存和恢复的代码:

n_batches = 1
est = tf.estimator.BoostedTreesClassifier(feature_columns,
                                          n_batches_per_layer=n_batches)

# The model will stop training once the specified number of trees is built, not
# based on the number of steps.
est.train(train_input_fn, max_steps=100)

# Eval.
result = est.evaluate(eval_input_fn)
clear_output()
print(pd.Series(result))

feature_spec = fc.make_parse_example_spec(feature_columns)

serving_input_receiver_fn = tf.estimator.export.build_parsing_serving_input_receiver_fn(feature_spec)

Exported_Path = est.export_saved_model('saved_model', serving_input_receiver_fn)

imported = tf.saved_model.load(Exported_Path)
对于使用Tensorflow版本的完整工作代码
n_batches = 1
est = tf.estimator.BoostedTreesClassifier(feature_columns,
                                          n_batches_per_layer=n_batches)

# The model will stop training once the specified number of trees is built, not
# based on the number of steps.
est.train(train_input_fn, max_steps=100)

# Eval.
result = est.evaluate(eval_input_fn)
clear_output()
print(pd.Series(result))

feature_spec = fc.make_parse_example_spec(feature_columns)

serving_input_receiver_fn = tf.estimator.export.build_parsing_serving_input_receiver_fn(feature_spec)

Exported_Path = est.export_saved_model('saved_model', serving_input_receiver_fn)

imported = tf.saved_model.load(Exported_Path)