J'ai essayé d'obtenir une estimation du temps de prédiction de mon modèle de kéros et j'ai réalisé quelque chose d'étrange. En plus d'être assez rapide normalement, le modèle a besoin de temps en temps pour établir une prédiction. Et non seulement cela, ces temps augmentent également plus le modèle fonctionne. J'ai ajouté un exemple de travail minimal pour reproduire l'erreur.
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))
Le temps ne dépend pas de l'échantillon (il est prélevé au hasard). Si le test est répété, les indices de la boucle for où la prédiction prend plus de temps seront à nouveau (presque) les mêmes.
J'utilise:
tensorflow 2.0.0
python 3.7.4
Pour ma candidature, je dois garantir l'exécution dans un certain temps. Ceci est cependant impossible compte tenu de ce comportement. Qu'est-ce qui ne va pas? Est-ce un bug dans Keras ou un bug dans le backend tensorflow?
EDIT:
predict_on_batch
montre le même comportement, cependant, plus clairsemé:
y_pred = model(sample, training=False).numpy()
montre également de fortes valeurs aberrantes, mais elles n'augmentent pas.
EDIT 2: J'ai rétrogradé à la dernière version de tensorflow 1 (1.15). Non seulement le problème n'existe plus, mais le temps de prédiction "normal" s'est considérablement amélioré! Je ne vois pas les deux pointes comme problématiques, car elles ne sont pas apparues lorsque j'ai répété le test (du moins pas aux mêmes indices et en augmentant linéairement) et sont en pourcentage pas aussi grandes que dans le premier graphique.
Nous pouvons donc conclure que cela semble être un problème inhérent à tensorflow 2.0, qui montre un comportement similaire dans d'autres situations comme le mentionne @OverLordGoldDragon.
y_pred = model(sample).numpy()
et avec y_pred = model(sample, training=False).numpy()
?
predict_classes
c'est toujours le plus rapide ... semble-t-il. Et juste predict
?
predict_on_batch
place?