Saya mencoba mendapatkan perkiraan waktu prediksi model keras saya dan menyadari sesuatu yang aneh. Terlepas dari menjadi cukup cepat secara normal, sesekali model membutuhkan waktu yang cukup lama untuk menghasilkan prediksi. Dan tidak hanya itu, saat-saat itu juga meningkatkan semakin lama model berjalan. Saya menambahkan contoh kerja minimal untuk mereproduksi kesalahan.
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))
Waktu tidak tergantung pada sampel (dipilih secara acak). Jika tes diulangi, indeks dalam for loop tempat prediksi membutuhkan waktu lebih lama akan (hampir) sama lagi.
Saya menggunakan:
tensorflow 2.0.0
python 3.7.4
Untuk aplikasi saya, saya perlu menjamin eksekusi dalam waktu tertentu. Namun ini tidak mungkin mengingat perilaku itu. Apa yang salah? Apakah itu bug di Keras atau bug di backend tensorflow?
EDIT:
predict_on_batch
menunjukkan perilaku yang sama, namun lebih jarang:
y_pred = model(sample, training=False).numpy()
menunjukkan beberapa outlier berat juga, namun, mereka tidak meningkat.
EDIT 2: Saya diturunkan ke versi tensorflow 1 terbaru (1.15). Tidak hanya masalahnya tidak ada lagi, juga waktu prediksi "normal" meningkat secara signifikan! Saya tidak melihat kedua paku sebagai masalah, karena mereka tidak muncul ketika saya mengulangi tes (setidaknya tidak pada indeks yang sama dan meningkat secara linear) dan persentasi tidak sebesar seperti pada plot pertama.
Dengan demikian kita dapat menyimpulkan bahwa ini tampaknya menjadi masalah yang melekat pada tensorflow 2.0, yang menunjukkan perilaku serupa dalam situasi lain seperti yang disebutkan @OverLordGoldDragon.
y_pred = model(sample).numpy()
dan dengan y_pred = model(sample, training=False).numpy()
?
predict_classes
tetap saja yang tercepat .... sepertinya. Bagaimana dengan adil predict
?
predict_on_batch
?