2017-08-03 140 views
0

我正试图在Google Cloud的ML引擎上托管一个TensorForestEstimator模型。一切工作的权利,但在最后的模型不能与堆栈跟踪出口:TensorFlow:导出TensorForestEstimator模型时出错

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 

基础上痕迹,我想误差与default_output_alternative_key=Nonemake_export_strategy功能。因此,我所做设置default_output_alternative_key='default'但随后得到了错误:

ValueError: Requested default_output_alternative: default, but available output_alternatives are: [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 _experiment 


def 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的原因以及如何解决它,所以我可以为我的模型?

回答

0

这是一个在tensorflow 1.3中修复的bug,所以我建议如果可以的话升级到1.3。升级之后,您会发现此代码将正常工作。

简而言之,问题在于TensorForestEstimator中的可选keys_name参数保留为None,并且因此模型没有收到头。由于该模型甚至不是单向的,因此该图无法导出。