Tentei obter uma estimativa do tempo de previsão do meu modelo keras e percebi algo estranho. Além de ser bastante rápido normalmente, de vez em quando o modelo precisa de muito tempo para apresentar uma previsão. E não apenas isso, esses tempos também aumentam quanto mais tempo o modelo é executado. Adicionei um exemplo de trabalho mínimo para reproduzir o erro.
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))
O tempo não depende da amostra (está sendo escolhida aleatoriamente). Se o teste for repetido, os índices no loop for, onde a previsão leva mais tempo, serão (quase) os mesmos novamente.
Estou a usar:
tensorflow 2.0.0
python 3.7.4
Para minha aplicação, preciso garantir a execução em um determinado período de tempo. No entanto, isso é impossível considerando esse comportamento. O que está acontecendo de errado? É um bug no Keras ou no backend tensorflow?
EDIT:
predict_on_batch
mostra o mesmo comportamento, no entanto, mais esparsos:
y_pred = model(sample, training=False).numpy()
mostra alguns outliers pesados também, no entanto, eles não estão aumentando.
EDIT 2: Fiz o downgrade para a versão mais recente do tensorflow 1 (1.15). Além de o problema não existir mais, o tempo de previsão "normal" melhorou significativamente! Não vejo os dois picos como problemáticos, pois não apareceram quando repeti o teste (pelo menos não nos mesmos índices e aumentando linearmente) e são percentuais não tão grandes quanto no primeiro gráfico.
Assim, podemos concluir que esse parece ser um problema inerente ao tensorflow 2.0, que mostra um comportamento semelhante em outras situações, como menciona o @OverLordGoldDragon.
y_pred = model(sample).numpy()
e com y_pred = model(sample, training=False).numpy()
?
predict_classes
ainda é o mais rápido .... parece. Que tal apenas predict
?
predict_on_batch
?