Ich versuchte eine Schätzung der Vorhersagezeit meines Keras-Modells zu erhalten und erkannte etwas Seltsames. Abgesehen davon, dass das Modell normalerweise ziemlich schnell ist, braucht es von Zeit zu Zeit ziemlich lange, um eine Vorhersage zu treffen. Und nicht nur das, diese Zeiten verlängern sich auch, je länger das Modell läuft. Ich habe ein minimales Arbeitsbeispiel hinzugefügt, um den Fehler zu reproduzieren.
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))
Die Zeit hängt nicht von der Probe ab (sie wird zufällig ausgewählt). Wenn der Test wiederholt wird, sind die Indizes in der for-Schleife, in denen die Vorhersage länger dauert, wieder (fast) gleich.
Ich benutze:
tensorflow 2.0.0
python 3.7.4
Für meine Bewerbung muss ich die Ausführung in einer bestimmten Zeit garantieren. Dies ist jedoch angesichts dieses Verhaltens unmöglich. Was läuft falsch? Ist es ein Fehler in Keras oder ein Fehler im Tensorflow-Backend?
EDIT:
predict_on_batch
zeigt das gleiche Verhalten, jedoch spärlicher:
y_pred = model(sample, training=False).numpy()
zeigt auch einige starke Ausreißer, die jedoch nicht zunehmen.
EDIT 2: Ich habe auf die neueste Version von Tensorflow 1 (1.15) heruntergestuft. Das Problem besteht nicht nur nicht mehr, auch die "normale" Vorhersagezeit hat sich deutlich verbessert! Ich sehe die beiden Spitzen nicht als problematisch an, da sie bei Wiederholung des Tests nicht aufgetreten sind (zumindest nicht bei denselben Indizes und linear ansteigend) und prozentual nicht so groß sind wie im ersten Diagramm.
Wir können daher den Schluss ziehen, dass dies ein dem Tensorflow 2.0 innewohnendes Problem zu sein scheint, das in anderen Situationen ein ähnliches Verhalten zeigt, wie es @OverLordGoldDragon erwähnt.
y_pred = model(sample).numpy()
und mit y_pred = model(sample, training=False).numpy()
?
predict_classes
aber immer noch der schnellste .... es scheint. Was ist mit nur predict
?
predict_on_batch
stattdessen versuchen ?