TensorFlow模型服务之Estimator.predict预测

在使用TensorFlow进行建模、训练和预测时,可以使用estimator这样的高阶函数方便使用。基本的套路是:

训练 fit
from tensorflow.contrib import learn
classifier = learn.Estimator(model_fn=lstm_model(stepLength, config['lstm_layers'], config['dense_layers']),
                           model_dir=config['log_dir'])
validation_monitor = learn.monitors.ValidationMonitor(x['val'], y['val'],
                                every_n_steps=config['print_steps'],
                                early_stopping_rounds=1000)
classifier.fit(x['train'], y['train'],monitors=[validation_monitor], batch_size=config['batch_size'], steps=len(x['train'])*config['epochs'])
  • 初始化classifer
  • 配置monitor
  • 使用fit函数进行训练
预测 predict
classifier = learn.Estimator(model_fn=lstm_model(stepLength, config['lstm_layers'], config['dense_layers']),
                           model_dir=config['log_dir'])
pre = classifier.predict(x['test'])
  • 初始化classifier,其中model_dir的配置需要指定为和训练相同的目录
  • 使用predict

根据官方文档的步骤,这样predict即可使用训练好的模型和参数。
但是实际结果是这样predict会报错,具体错误如下:

ValueError: Tried to convert 'values' to a tensor and failed. Error: None values not supported.
修正后的predict

这其实是learn.predict的一个bug,目前社区还没有fix,不过在issue-3208 给出了work around的方法,在predict之前使用eval,类似于声明classifier并没有实例化,在eval的时候,会将其实例化,这样在之后使用predict的时候就不会再报Error: None values not supported.的错误了。当然这样做的缺点是因为eval会使用TF对模型进行运算至少一次,这样会造成一定的性能损耗。
work around的方法

classifier = learn.Estimator(model_fn=lstm_model(stepLength, config['lstm_layers'], config['dense_layers']),
                           model_dir=config['log_dir'])
classifier.evaluate(x=x['val'],y=y['val'],steps=1)
pre = classifier.predict(x['test'])
work around.png

你可能感兴趣的:(TensorFlow模型服务之Estimator.predict预测)