Tensorflow Estimator预测很慢

时间:2017-12-13 15:22:35

标签: performance tensorflow tensorflow-estimator

我训练了一个tf.estimator.LinearClassifier。虽然训练和评估模型需要一段合理的时间用于我的数据大小(约60秒),但预测需要更长的时间(约1小时)。

预测代码如下:

predictionResult = estimator.predict(input_fn=lambda: my_input_fn2(predictionValidationFile, False, 1))
predictionList = [prediction for prediction in  predictionResult]

with:

def my_input_fn2(file_path, perform_shuffle=False, repeat_count=1):
def _parse_function(example_proto):      
  keys_to_features = {"xslm": tf.FixedLenFeature([10000], tf.float32),
                      "xrnn": tf.FixedLenFeature([10000], tf.float32),
                      "target": tf.FixedLenFeature([10000], tf.float32)}
  parsed_features = tf.parse_single_example(example_proto, keys_to_features)      
  myfeatures = {'xrnn':parsed_features['xrnn'], 'xslm':parsed_features['xslm']}
  return myfeatures, parsed_features['target'] 

dataset = (tf.data.TFRecordDataset(file_path)                
           .map(_parse_function))     
dataset = dataset.repeat(repeat_count) 
dataset = dataset.batch(1)  
iterator = dataset.make_one_shot_iterator()
batch_feature,  batch_labels = iterator.get_next()    
xs= tf.reshape(batch_feature['xslm'],[-1,1])
xr= tf.reshape(batch_feature['xrnn'],[-1,1])
x = {'xrnn':xr, 'xslm':xs}
y = tf.reshape(batch_labels, [-1,1])
return x, y

当运行10 000个样本(对应于一个批次)时,第二行需要0.8秒才能执行。有500万个样本,预测需要一个多小时。

我在这个阶段的猜测是,这种缓慢的性能仅仅是由估计器predict()函数返回python生成器而不是返回实际预测结果这一事实引起的。对于每个批次,生成器最终会对函数进行10 000次调用以获得10 000个预测结果。这似乎效率低下。

有什么方法可以加快速度吗?

2 个答案:

答案 0 :(得分:0)

您对它运行缓慢的原因是正确的。它正在为每个项目调用函数,因为功能中的bach大小默认为1。

您应将批量大小作为参数传递给函数并替换

dataset = dataset.batch(1) 

使用

dataset = dataset.batch(batch_size) 

答案 1 :(得分:0)

我有一个类似的问题(在colab笔记本中使用tensorflow 1.15)。就我而言,保存和加载模型(在新单元格中)解决了问题。

model.save_weights("weights.h5", overwrite=True)
# in a new cell
model = create_model()
model.load_weights("weights.h5")
y_pred = np.array(model.predict(x_test))