Я намагався отримати оцінку часу передбачення моєї моделі керас і зрозумів щось дивне. Окрім того, що зазвичай досить швидко, модель час від часу потребує досить довго, щоб придумати прогноз. І не тільки це, ті часи також збільшують тривалість роботи моделі. Я додав мінімальний робочий приклад, щоб відтворити помилку.
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))
Час не залежить від вибірки (його відбирають випадковим чином). Якщо тест повторюється, показники в циклі for, де прогнозування триває більше часу, знову будуть (майже) однаковими.
Я використовую:
tensorflow 2.0.0
python 3.7.4
Для моєї заяви мені потрібно гарантувати виконання в певний час. Однак, враховуючи таку поведінку, це неможливо. Що йде не так? Це помилка в Керасі чи помилка в тендорфлоу-бекенді?
EDIT:
predict_on_batch
показує таку ж поведінку, однак, більш рідкісна:
y_pred = model(sample, training=False).numpy()
показує і деякі важкі люди, які не виходять, проте вони не збільшуються.
EDIT 2: Я перейшов на останню версію tensorflow 1 (1.15). Проблема не тільки не існує, а й «нормальний» час прогнозування значно покращився! Я не вважаю, що ці два шипи є проблематичними, оскільки вони не з'явилися, коли я повторив тест (принаймні, не за тими ж показниками та лінійно зростаючим) і є відсотковими, не такими великими, як у першому сюжеті.
Таким чином, можна зробити висновок, що це, здається, є проблемою, властивою tensorflow 2.0, яка демонструє подібну поведінку в інших ситуаціях, як згадує @OverLordGoldDragon.
y_pred = model(sample).numpy()
і з y_pred = model(sample, training=False).numpy()
?
predict_classes
все-таки найшвидший .... здається. А як же predict
?
predict_on_batch
замість цього?