TensorFlow: 导出TensorForestEstimator模型时出错

我在尝试将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,因此模型没有接收到头。由于模型甚至不是单头的,图无法导出。

Related Posts

使用LSTM在Python中预测未来值

这段代码可以预测指定股票的当前日期之前的值,但不能预测…

如何在gensim的word2vec模型中查找双词组的相似性

我有一个word2vec模型,假设我使用的是googl…

dask_xgboost.predict 可以工作但无法显示 – 数据必须是一维的

我试图使用 XGBoost 创建模型。 看起来我成功地…

ML Tuning – Cross Validation in Spark

我在https://spark.apache.org/…

如何在React JS中使用fetch从REST API获取预测

我正在开发一个应用程序,其中Flask REST AP…

如何分析ML.NET中多类分类预测得分数组?

我在ML.NET中创建了一个多类分类项目。该项目可以对…

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注