Traté de obtener una estimación del tiempo de predicción de mi modelo de keras y me di cuenta de algo extraño. Además de ser bastante rápido normalmente, de vez en cuando el modelo necesita bastante tiempo para llegar a una predicción. Y no solo eso, esos tiempos también aumentan cuanto más tiempo se ejecuta el modelo. Agregué un ejemplo de trabajo mínimo para reproducir el error.
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))
El tiempo no depende de la muestra (se selecciona al azar). Si se repite la prueba, los índices en el bucle for donde la predicción lleva más tiempo serán (casi) los mismos nuevamente.
Estoy usando:
tensorflow 2.0.0
python 3.7.4
Para mi aplicación, necesito garantizar la ejecución en un momento determinado. Sin embargo, esto es imposible teniendo en cuenta ese comportamiento. ¿Qué va mal? ¿Es un error en Keras o un error en el backend de Tensorflow?
EDITAR:
predict_on_batch
muestra el mismo comportamiento, sin embargo, más escaso:
y_pred = model(sample, training=False).numpy()
muestra algunos valores atípicos pesados también, sin embargo, no están aumentando.
EDIT 2: bajé a la última versión de tensorflow 1 (1.15). No solo el problema ya no existe, sino que el tiempo de predicción "normal" mejoró significativamente. No veo los dos picos como problemáticos, ya que no aparecieron cuando repetí la prueba (al menos no con los mismos índices y aumentando linealmente) y son porcentuales no tan grandes como en la primera gráfica.
Por lo tanto, podemos concluir que esto parece ser un problema inherente al tensorflow 2.0, que muestra un comportamiento similar en otras situaciones como menciona @OverLordGoldDragon.
y_pred = model(sample).numpy()
y con y_pred = model(sample, training=False).numpy()
?
predict_classes
sigue siendo el más rápido ... parece. ¿Qué tal solo predict
?
predict_on_batch
?