在Tensorflow 1.3中导出和加载tf.contrib.estimator,以便在python中进行预测,而不使用Tensorflow服务

在Tensorflow 1.3中导出和加载tf.contrib.estimator,以便在python中进行预测,而不使用Tensorflow服务,python,tensorflow,Python,Tensorflow,我正在使用tf.contrib.learn.dnnlinearcombinedregrator和宽深特征列。我使用输入函数将数据发送到此回归器进行训练。我有实特征和分类特征,因此我的深层特征列由带有嵌入的稀疏列和实值列组成。而我的线性列是实值列。经过训练后,我可以使用estimator.predict_scores()方法天真地访问经过训练的模型进行预测。然而,据我所知,这会从检查点文件中重新创建tensorflow图,这对于我预期的应用程序来说非常缓慢。然后,我尝试使用estimator.ex

我正在使用tf.contrib.learn.dnnlinearcombinedregrator和宽深特征列。我使用输入函数将数据发送到此回归器进行训练。我有实特征和分类特征,因此我的深层特征列由带有嵌入的稀疏列和实值列组成。而我的线性列是实值列。经过训练后,我可以使用estimator.predict_scores()方法天真地访问经过训练的模型进行预测。然而,据我所知,这会从检查点文件中重新创建tensorflow图,这对于我预期的应用程序来说非常缓慢。然后,我尝试使用estimator.export_savedmodel(),以查看是否可以在应用程序中进行实际预测之前保存并加载图形。但是我被它卡住了。我面临以下问题:

  • 要导出,我执行了以下操作:

    feature_spec = tf.feature_column.make_parse_example_spec(deep_feature_cols)
    
    export_input_fn = tf.contrib.learn.utils.build_parsing_serving_input_fn(feature_spec) 
    
    servable_model_path = regressor.export_savedmodel(export_dir_base = servable_model_dir, serving_input_fn = export_input_fn, as_text= True)
    
  • (请注意,由于varlenfeature列--嵌入列,原始和默认解析函数对我不起作用)。由于我只使用深列构造feature_spec,我不明白保存的模型如何知道我对线性列使用的是什么。我不知道如何组合这两种类型的列来保存/导出

  • 虽然我能够成功导出经过训练的回归模型,但我不知道如何将其用于预测。我已经看过使用Tensorflow服务(例如)实现这一点的教程。然而,我只想要一些简单的东西,我可以在python中加载和使用。我正在Windows中开发一个交互式GUI应用程序,因此不想使用bazel为Tensorflow服务构建一个保存的模型。我尝试了以下方法,但无法使用我的输入\u fn

    from tensorflow.contrib import predictor
    predict_fn = predictor.from_saved_model(servable_model_path)
    predictions = predict_fn(get_input_fn(X, y, LABEL, num_epochs=1, shuffle=False))
    
  • 其中get_input_fn是我的自定义输入。运行此代码时,出现以下错误:

    AttributeError      Traceback (most recent call last)
    <ipython-input-15-128f4d1ba155> in <module>()
    ----> 1 predictions = predict_fn(get_input_fn(X, y, LABEL, num_epochs=1, 
    shuffle=False))
    
    ~\AppData\Local\Continuum\Anaconda3\envs\tensorflow\lib\site-
    packages\tensorflow\contrib\predictor\predictor.py in __call__(self, input_dict)
     63     """
     64     # TODO(jamieas): make validation optional?
    ---> 65     input_keys = set(input_dict.keys())
     66     expected_keys = set(self.feed_tensors.keys())
     67     unexpected_keys = input_keys - expected_keys
    
    AttributeError: 'function' object has no attribute 'keys'
    
    AttributeError回溯(最近一次调用)
    在()
    ---->1预测=预测\u fn(获取输入\u fn(X,y,LABEL,num\u epochs=1,
    洗牌=错误)
    ~\AppData\Local\Continuum\Anaconda3\envs\tensorflow\lib\site-
    packages\tensorflow\contrib\predictor\predictor.py在调用中(self,input\u dict)
    63     """
    64#TODO(jamieas):是否将验证设置为可选?
    --->65输入键=设置(输入键())
    66预期的\u keys=set(self.feed\u tensors.keys())
    67意外\u键=输入\u键-预期\u键
    AttributeError:“函数”对象没有属性“键”
    

    欢迎任何输入。我在windows 10上,在Anaconda虚拟环境中使用Tensorflow 1.3和Python 3.5。

    再翻一翻,predict\u fn需要一个字典,其键设置为与您的模型所需的功能变量完全相同的名称。在我的CNN模型中,输入是“输入”,如下所示:

    def _cnn_model_fn(features, labels, mode):
      # Input Layer
      print("features shape", features['inputs'])
    
    这是我在predict_fn中传递的内容,其中myimage是一个扁平的np数组

    predictions = predict_fn({"inputs": [myimage]})
    

    我遇到了同样的错误-你有进步吗?如果有任何建议,我将不胜感激。