Ho cercato di ottenere una stima del tempo di previsione del mio modello di keras e ho realizzato qualcosa di strano. Oltre ad essere abbastanza veloce normalmente, ogni tanto il modello ha bisogno di molto tempo per elaborare una previsione. E non solo, quei tempi aumentano anche più a lungo il modello funziona. Ho aggiunto un esempio minimo di lavoro per riprodurre l'errore.
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))
Il tempo non dipende dal campione (viene scelto casualmente). Se il test viene ripetuto, gli indici nel ciclo for in cui la previsione impiega più tempo saranno (quasi) nuovamente gli stessi.
Sto usando:
tensorflow 2.0.0
python 3.7.4
Per la mia applicazione devo garantire l'esecuzione entro un certo tempo. Questo è tuttavia impossibile considerando quel comportamento. Cosa non va? È un bug in Keras o un bug nel backend tensorflow?
EDIT:
predict_on_batch
mostra lo stesso comportamento, tuttavia, più scarso:
y_pred = model(sample, training=False).numpy()
mostra anche alcuni valori anomali pesanti, tuttavia non aumentano.
EDIT 2: ho eseguito il downgrade all'ultima versione di tensorflow 1 (1.15). Non solo il problema non esiste più, ma anche il tempo di previsione "normale" è notevolmente migliorato! Non vedo i due picchi come problematici, in quanto non sono apparsi quando ho ripetuto il test (almeno non agli stessi indici e aumentando linearmente) e sono percentuali non grandi come nel primo grafico.
Possiamo quindi concludere che questo sembra essere un problema inerente a tensorflow 2.0, che mostra un comportamento simile in altre situazioni come menziona @OverLordGoldDragon.
y_pred = model(sample).numpy()
e con y_pred = model(sample, training=False).numpy()
?
predict_classes
è ancora il più veloce .... sembra. Che dire solo predict
?
predict_on_batch
invece?