我试图估计我的keras模型的预测时间,并意识到一些奇怪的事情。除了正常情况下相当快外,模型偶尔还需要很长时间才能得出预测。不仅如此,这些时间还增加了模型运行的时间。我添加了一个最小的工作示例来重现该错误。
import time
import numpy as np
from sklearn.datasets import make_classification
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense, Flatten
# Make a dummy classification problem
X, y = make_classification()
# Make a dummy model
model = Sequential()
model.add(Dense(10, activation='relu',name='input',input_shape=(X.shape[1],)))
model.add(Dense(2, activation='softmax',name='predictions'))
model.compile(optimizer='adam', loss='sparse_categorical_crossentropy', metrics=['accuracy'])
model.fit(X, y, verbose=0, batch_size=20, epochs=100)
for i in range(1000):
# Pick a random sample
sample = np.expand_dims(X[np.random.randint(99), :], axis=0)
# Record the prediction time 10x and then take the average
start = time.time()
for j in range(10):
y_pred = model.predict_classes(sample)
end = time.time()
print('%d, %0.7f' % (i, (end-start)/10))
时间不取决于样本(它是随机抽取的)。如果重复测试,则预测所需时间更长的for循环中的索引将再次(几乎)相同。
我在用着:
tensorflow 2.0.0
python 3.7.4
对于我的应用程序,我需要保证在一定时间内执行。但是考虑到该行为,这是不可能的。怎么了?是Keras中的错误还是tensorflow后端中的错误?
编辑:
predict_on_batch
显示相同的行为,但是更稀疏:
y_pred = model(sample, training=False).numpy()
也显示了一些严重的离群值,但是它们并没有增加。
编辑2:我降级到最新的tensorflow 1版本(1.15)。不仅不再存在这个问题,而且“正常”的预测时间也大大缩短了!我认为这两个峰值没有问题,因为当我重复测试时它们并没有出现(至少不是在相同的指数处并且线性增加),并且百分比不如第一个图大。
因此,我们可以得出结论,这似乎是tensorflow 2.0固有的问题,它在其他情况下表现出与@OverLordGoldDragon提到的类似的行为。
y_pred = model(sample).numpy()
,并用y_pred = model(sample, training=False).numpy()
?
predict_classes
仍然是最快的。那又如何predict
呢?
predict_on_batch
呢?