私のケラスモデルの予測時間の見積もりを取得しようとしたところ、奇妙なことがわかりました。通常はかなり高速であることは別にして、モデルは予測を出すのにかなり長い時間が必要です。それだけでなく、それらの時間はモデルの実行時間が長くなるほど増加します。エラーを再現するための最小限の実用例を追加しました。
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
私のアプリケーションでは、特定の時間での実行を保証する必要があります。ただし、これはその動作を考えると不可能です。何が問題になっていますか?Kerasのバグですか、それともtensorflowバックエンドのバグですか?
編集:
predict_on_batch
同じ動作を示しますが、よりまばらです:
y_pred = model(sample, training=False).numpy()
はいくつかの重い外れ値も示していますが、増加していません。
編集2:私は最新のtensorflow 1バージョン(1.15)にダウングレードしました。問題が存在しなくなっただけでなく、「通常の」予測時間も大幅に改善されました。2つのスパイクは問題ありません。テストを繰り返したときに表示されなかったため(少なくとも同じインデックスではなく、直線的に増加している)、最初のプロットほど大きくはありません。
したがって、これは、@ OverLordGoldDragonが言及するように、他の状況でも同様の動作を示すtensorflow 2.0に固有の問題であると結論付けることができます。
y_pred = model(sample).numpy()
としてy_pred = model(sample, training=False).numpy()
?
predict_classes
、それでも最速です...と思われます。ちょうどpredict
どうですか?
predict_on_batch
代わりに試してみるとどうなりますか?