我在尝试将TensorForestEstimator模型部署到Google Cloud的ML引擎上。一切正常,但在最后阶段,模型无法导出,并显示以下堆栈跟踪:
Traceback (most recent call last):[...]File "/root/.local/lib/python2.7/site-packages/tensorflow/contrib/learn/python/learn/experiment.py", line 502, in train_and_evaluate export_results = self._maybe_export(eval_result)File "/root/.local/lib/python2.7/site-packages/tensorflow/contrib/learn/python/learn/experiment.py", line 597, in _maybe_export eval_result=eval_result))File "/root/.local/lib/python2.7/site-packages/tensorflow/contrib/learn/python/learn/export_strategy.py", line 87, in export return self.export_fn(estimator, export_path, **kwargs)File "/root/.local/lib/python2.7/site-packages/tensorflow/contrib/learn/python/learn/utils/saved_model_export_utils.py", line 412, in export_fn checkpoint_path=checkpoint_path)File "/root/.local/lib/python2.7/site-packages/tensorflow/contrib/learn/python/learn/estimators/estimator.py", line 1280, in export_savedmodel actual_default_output_alternative_key)File "/root/.local/lib/python2.7/site-packages/tensorflow/contrib/learn/python/learn/utils/saved_model_export_utils.py", line 252, in build_all_signature_defs for input_key, inputs in input_alternatives.items()File "/root/.local/lib/python2.7/site-packages/tensorflow/contrib/learn/python/learn/utils/saved_model_export_utils.py", line 254, in <dictcomp> in output_alternatives.items()}File "/root/.local/lib/python2.7/site-packages/tensorflow/contrib/learn/python/learn/utils/saved_model_export_utils.py", line 119, in build_standardized_signature_def input_tensors, output_tensors)File "/root/.local/lib/python2.7/site-packages/tensorflow/python/saved_model/signature_def_utils_impl.py", line 146, in predict_signature_def signature_constants.PREDICT_METHOD_NAME)File "/root/.local/lib/python2.7/site-packages/tensorflow/python/saved_model/signature_def_utils_impl.py", line 45, in build_signature_def signature_def.outputs[item].CopyFrom(outputs[item])TypeError: None has type NoneType, but expected one of: bytes, unicode
根据这个跟踪,我认为错误出在make_export_strategy
函数中,参数default_output_alternative_key=None
。所以我尝试设置default_output_alternative_key='default'
,但随后得到了以下错误:
ValueError: 请求的default_output_alternative: default,但可用的output_alternatives是:[None]
这表明没有输出选项,我的模型是单头的。以下是代码:
def serving_input_fn(): feature_placeholders = { column['name']: tf.placeholder(dtype=column['dtype'], shape=[None]) for column in columns_list if column['derived'] == 'N' and column['column_role'] != 'label' } features = { key: tf.expand_dims(tensor, -1) for key, tensor in feature_placeholders.items() } return InputFnOps( features=features, labels=None, default_inputs=feature_placeholders )def get_experiment_fn(args): def _experiment(run_config, hparams): return Experiment( estimator=TensorForestEstimator( params=ForestHParams( num_trees=args.num_trees, max_nodes=10000, min_split_samples=2, num_features=7, num_classes=args.num_projections, regression=True ), model_dir=args.job_dir, graph_builder_class=RandomForestGraphs, config=run_config, report_feature_importances=True, ), train_input_fn=get_input_fn( project_name=args.project, data_location=args.train_data, dataset_size=args.train_size, batch_size=args.train_batch_size ), train_steps=args.train_steps, eval_input_fn=get_input_fn( project_name=args.project, data_location=args.eval_data, dataset_size=args.eval_size, batch_size=args.eval_batch_size ), eval_steps=args.eval_steps, eval_metrics=get_eval_metrics(), export_strategies=[ make_export_strategy( serving_input_fn, default_output_alternative_key=None, exports_to_keep=1 ) ] ) return _experimentdef main(): args = get_arg_parser().parse_args() learn_runner.run( experiment_fn=get_experiment_fn(args), run_config=RunConfig(model_dir=args.job_dir), hparams=HParams(**args.__dict__) )if __name__ == '__main__': main()
错误None has type NoneType, but expected one of: bytes, unicode
的原因是什么?我该如何解决这个问题,以便能够部署我的模型?
回答:
这个问题在tensorflow 1.3
中已被修复,因此我建议如果可以的话升级到1.3。升级后,你会发现这段代码将正常工作。
简而言之,问题在于TensorForestEstimator
中的可选参数keys_name
被设置为None
,因此模型没有接收到头。由于模型甚至不是单头的,图无法导出。