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

Keras Dense层输入未被展平

这是我的测试代码: from keras import…

无法将分类变量输入随机森林

我有10个分类变量和3个数值变量。我在分割后直接将它们…

如何在Keras中对每个输出应用Sigmoid函数?

这是我代码的一部分。 model = Sequenti…

如何选择类概率的最佳阈值?

我的神经网络输出是一个用于多标签分类的预测类概率表: …

在Keras中使用深度学习得到不同的结果

我按照一个教程使用Keras中的深度神经网络进行文本分…

‘MatMul’操作的输入’b’类型为float32,与参数’a’的类型float64不匹配

我写了一个简单的TensorFlow代码,但不断遇到T…

发表回复

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