Keras model.predict() 花费了不合理的时间

Ole*_*gen 2 python machine-learning keras tensorflow

我正在开展一个项目,我们使用编译的 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!")
Run Code Online (Sandbox Code Playgroud)

代码的一些说明:
shift() 方法返回 pred_queue() 中的第一个条目。这将是一个包含 38 个浮点数的数组,也可能是 None,具体取决于队列是否为空。

是什么可能使这些预测如此缓慢?

编辑
预测时间混乱的原因是我们在编译之前对某些数据运行了相同的模型。这些数据点是从 csv 文件中收集的,放入 pandas 数据框中,最后传递给预测方法。这些数据并未实时传输,但数据集要大得多,大约有 9000 行,每行包含 38 个浮点数。当我们计时时,这个预测花了 0.3 秒。显然比我们现在的速度要快得多!

Les*_*rel 5

您可以尝试直接使用该__call__方法,如该方法的文档predict所述(重点是我的):

计算是分批进行的。该方法专为大规模输入的性能而设计。对于适合一批的少量输入,__call__建议直接使用以加快执行速度,例如model(x),或者model(x, training=False)如果您有诸如tf.keras.layers.BatchNormalization在推理期间表现不同的层。另请注意,测试损失不受噪声和 dropout 等正则化层的影响。

请注意,您注意到的性能下降可能与计算机资源有限有关。调查 CPU 使用情况、RAM 使用情况等。