Keras modelimin tahmin süresini tahmin etmeye çalıştım ve garip bir şey fark ettim. Normalde oldukça hızlı olmanın yanı sıra, her seferinde modelin bir tahmin bulmak için oldukça uzun sürmesi gerekir. Ve sadece bu değil, o zamanlar modelin daha uzun süre çalışmasını da artırır. Hatayı yeniden oluşturmak için minimal bir çalışma örneği ekledim.
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))
Zaman numuneye bağlı değildir (rastgele seçilmektedir). Test tekrarlanırsa, for döngüsünde tahminin daha uzun sürdüğü indeksler (neredeyse) tekrar aynı olacaktır.
Kullanıyorum:
tensorflow 2.0.0
python 3.7.4
Başvurum için, belirli bir zamanda uygulamayı garanti etmem gerekiyor. Ancak bu davranış göz önüne alındığında bu imkansızdır. Neler yanlış gidiyor? Keras'ta bir hata mı yoksa tensorflow arka ucunda bir hata mı?
EDIT:
predict_on_batch
aynı davranışı gösterir, ancak daha seyrek:
y_pred = model(sample, training=False).numpy()
bazı ağır aykırı değerleri de gösterir, ancak artmazlar.
EDIT 2: En son tensorflow 1 sürümüne (1.15) geri döndüm. Artık sorun sadece mevcut değil, aynı zamanda "normal" tahmin süresi de önemli ölçüde iyileşti! Testi tekrarladığımda (en azından aynı indekslerde değil ve doğrusal olarak arttığında) ortaya çıkmadıkları ve ilk arsadaki kadar büyük olmadığı için iki ani problemli görmüyorum.
Bu nedenle, bunun tensorflow 2.0'a özgü bir sorun gibi göründüğü sonucuna varabiliriz;
y_pred = model(sample).numpy()
ve birlikte y_pred = model(sample, training=False).numpy()
?
predict_classes
hala en hızlı ... öyle görünüyor. Sadece ne olacak predict
?
predict_on_batch
bunun yerine denerseniz ne olur ?