【问题标题】:Reducing time taken to predict probabilities减少预测概率所需的时间
【发布时间】:2018-06-04 12:54:29
【问题描述】:

我正在使用带有 Tensorflow 后端的 Keras。一旦我有了模型,我就会使用 model.predict_proba 来预测概率。这个预测函数所花费的时间似乎与数组的大小无关,或者更不依赖于它所预测的数组的大小。

我可以做些什么来减少这个时间?

首先我运行循环 100 次,并按如下方式对预测进行计时

fname_model = folder+"/my_modelbuy_rocbased.h5"
best_model = load_model(fname_model)
best_model.compile(loss='categorical_crossentropy', optimizer='Adam', 
metrics=['acc'])
X_test_orig = pd.read_csv(folder+"/ret_out_20170402.csv",sep=",")
x_test = X_test_orig.as_matrix()
y1=np.array([x_test[1]])
print y1.shape 
t1=datetime.now().strftime("%H:%M:%S.%f")
for i in range(0,100,1):
prob1= best_model.predict_proba(y1)
t2=datetime.now().strftime("%H:%M:%S.%f")   
print "time taken ", t1,t2

************************************************之后运行中***********************

耗时 11:50:53.909226 11:50:54.372596


因此,对于 100 个预测,所用时间为 11:50:54.372596 减去 11:50:53.909226,大约为 463 毫秒,这意味着每个预测需要 4.63 毫秒

但是,如果我只为一个预测运行循环,如下所示,

fname_model = folder+"/my_modelbuy_rocbased.h5"
best_model = load_model(fname_model)
best_model.compile(loss='categorical_crossentropy', optimizer='Adam', 
metrics=['acc'])
X_test_orig = pd.read_csv(folder+"/ret_out_20170402.csv",sep=",")
x_test = X_test_orig.as_matrix()
y1=np.array([x_test[1]])
print y1.shape 
t1=datetime.now().strftime("%H:%M:%S.%f")
for i in range(0,1,1):
prob1= best_model.predict_proba(y1)
t2=datetime.now().strftime("%H:%M:%S.%f")   
print "time taken ", t1,t2

************************************************之后运行中***********************

耗时 11:54:40.683225 11:54:41.144969


因此,对于 1 次预测,所用时间为 11:54:40.683225 减去 11:54:41.144969,也就是大约 440 毫秒。

无论调用次数如何,模型所需的时间似乎都是固定的。我怎样才能减少这种情况?

【问题讨论】:

  • 我发现第一个预测总是在我的 ANN 上花费更长的时间,而其他预测几乎是即时的。尝试进行一次预测,然后再进行两次。

标签: python keras prediction


【解决方案1】:

这是意料之中的,因为您正在预测单个输入并且计算图(模型)是相同的,因此预测需要相同的时间。就好像您期望相同的计算有不同的运行时,但这是不会发生的。

现在有一种加快速度的方法:不是预测单个元素,而是将它们转换为 ndarray(样本、特征),然后调用 model.predict,它将分批处理并运行计算并行取决于您的后端设置。

还有一点是你不需要编译来预测。编译会将损失和优化器操作添加到图形中,如果您只是进行预测,则不需要这些操作。这将减少模型加载到内存等的时间。

【讨论】:

  • 实际上,我的 y1 将永远是 shape(1,31)。也就是说,我将永远只有一个样本可以预测。每次大约需要 400 毫秒。但是,后端正在发生一些可能不需要的设置,这就是为什么当我 for 循环预测所花费的时间保持不变的原因。有没有办法让我摆脱这个“额外的设置”。我可以将图表加载到内存中以便更快地进行预测吗?
猜你喜欢
  • 2019-10-01
  • 2016-05-23
  • 2019-09-16
  • 1970-01-01
  • 1970-01-01
  • 2015-11-15
  • 1970-01-01
  • 2013-05-22
相关资源
最近更新 更多