我正在一个项目中,我们正在使用已编译的keras ANN模型根据接收到的传感器数据对不同位置进行分类。这些数据被连续地馈送到模型,以使其通过后台线程在后台收集数据进行预测。我们遇到了一个问题,即使输入小的数据集,model.predict()也要花费2秒钟才能完成。数据点是每个包含38个浮点数的数组。预测时间似乎不受所提供的行数(最多一定数量)的影响。我们尝试只提供一行,最多提供数百行。经过的时间保持在2秒左右。即使对于较大的数据集,此时间消耗量是否也异常高吗?
如果有帮助:我们的程序正在使用多线程技术,能够从传感器收集数据并对其进行重组,以使其适合模型的预测方法。两个后台程序线程正在后台运行,以收集和重组数据,而主线程正在从已结构化的数据队列中主动选择数据并基于这些数据进行分类。以下是我们根据收集到的数据进行分类的代码:
values = []
rows = 0
while rows < 20:
val = pred_queue.shift()
if val != None:
values.append(val)
rows += 1
rows = 0
values = np.squeeze(values)
start_time = time.perf_counter()
predictions = model.predict(values)
elapsed_time = round(time.perf_counter() - start_time, 2)
print("Predict time: ", elapsed_time)
for i in range(len(predictions)):
print(predictions[i].argmax())
#print(f"Predicted {classification_res} in {elapsed_time}s!")
代码的一些澄清:
shift()方法返回pred_queue()中的第一个条目。这将是一个由38个float组成的数组,或者是一个None,具体取决于队列是否为空。
有什么可能使这些预测如此缓慢?
编辑
预测时间混乱的原因是我们在编译某些数据之前对其运行了相同的模型。这些数据点是从csv文件中收集的,并放入pandas数据框中,最后传递给预测方法。这些数据不是实时流式传输,但是数据集要大得多,大约有9000行,每行包含38个浮点数。当我们计时时,此预测花费了0.3秒。显然比我们目前的速度快得多!
你可以尝试使用__call__
直接方法,作为该的文档predict
方法状态(重点是我的):
计算是分批进行的。此方法专为在大规模输入中的性能而设计。对于适合一批的少量输入,
__call__
建议直接使用以便更快地执行,例如model(x)
,或者model(x, training=False)
如果您有诸如tf.keras.layers.BatchNormalization
在推理过程中表现不同的图层。另外,请注意,测试损失不受诸如噪声和压降之类的正则化层的影响。
请注意,您注意到的这种性能下降可能与计算机资源有限这一事实有关。研究CPU使用率,RAM使用率等。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句