2017-08-03 115 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,並且因此模型沒有收到頭。由於該模型甚至不是單向的,因此該圖無法導出。