Python Keras模型。predict()花费了不合理的时间

Python Keras模型。predict()花费了不合理的时间,python,tensorflow,machine-learning,keras,Python,Tensorflow,Machine Learning,Keras,我正在从事一个项目,我们正在使用一个已编译的keras ANN模型,根据接收到的传感器数据对不同的位置进行分类。这些数据被连续地馈送到模型,以便通过后台收集数据的守护进程线程进行预测。我们遇到了这样一个问题:model.predict()需要2秒钟才能完成,即使是在输入小数据集时也是如此。数据点是数组,每个数组包含38个浮点。预测时间似乎不受提供的行数的影响,直到达到一定数量为止。我们试着只提供一排,最多数百排。经过的时间保持在2秒左右。即使对于更大的数据集,这种时间消耗不是异常高吗 如果有帮助

我正在从事一个项目,我们正在使用一个已编译的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!")
值=[]
行数=0
当行数小于20时:
val=pred_queue.shift()
如果val!=无:
values.append(val)
行数+=1
行数=0
值=np.挤压(值)
开始时间=时间。性能计数器()
预测=模型。预测(值)
已用时间=四舍五入(time.perf_counter()-开始时间,2)
打印(“预测时间:”,已用时间)
对于范围内的i(len(预测)):
打印(预测[i].argmax())
#打印(f“预测的{分类}以{经过的时间}秒为单位!”)
对代码的一些澄清:
shift()方法返回pred_队列()中的第一个条目。这将是一个包含38个浮点数的数组,也可以是无浮点数的数组,具体取决于队列是否为空

是什么让这些预测如此缓慢?

编辑

造成预测时间混乱的原因是,在编译之前,我们在一些数据上运行了相同的模型。这些数据点从csv文件中收集,并放入熊猫数据帧中,最后传递给预测方法。这些数据不是实时流传输的,但数据集要大得多,大约9000行,每行包含38个浮动。当我们计时时,这个预测用了0.3秒。显然比我们现在的速度快得多

您可以尝试直接使用
\uuu调用
方法,因为状态(emphasis是我的):

计算是分批进行的。这种方法是为在大规模输入下的性能而设计的对于适合一个批次的少量输入,建议直接使用
\uuuu call\uuuu
以更快地执行,例如
模型(x)
,或者
模型(x,training=False)
,如果您有在推理过程中表现不同的层,例如
tf.keras.layers.BatchNormalization
。另外,请注意,测试损耗不受正则化层(如噪声和衰减)的影响


请注意,您注意到的这种性能影响可能与机器资源有限这一事实有关。调查CPU使用率、RAM使用率等。

这是我们需要的解决方案。我们以前尝试过call方法,但我们放弃了这种方法,因为它最初不起作用。结果是我们输入的形状不对。感谢您让我们重试此方法!