나는 케 라스 모델의 예측 시간을 추정하려고 시도하고 이상한 것을 깨달았습니다. 일반적으로 상당히 빠르다는 것 외에도, 가끔씩 모델은 예측을하기 위해 꽤 긴 시간이 필요합니다. 뿐만 아니라 그 시간은 모델 실행 시간이 길어질 수도 있습니다. 오류를 재현하기 위해 최소 작업 예를 추가했습니다.
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)으로 다운 그레이드했습니다. 문제가 더 이상 존재하지 않을뿐만 아니라 "정상"예측 시간도 크게 개선되었습니다! 테스트를 반복 할 때 (적어도 같은 지수는 아니고 선형 적으로 증가 할 때) 나타나지 않았고 첫 번째 플롯에서만큼 크지 않은 두 스파이크는 문제가되지 않습니다.
따라서 이것은 @OverLordGoldDragon이 언급 한 것처럼 다른 상황에서도 유사한 동작을 나타내는 tensorflow 2.0 고유의 문제인 것으로 판단 할 수 있습니다.
y_pred = model(sample).numpy()
와 함께 y_pred = model(sample, training=False).numpy()
?
predict_classes
여전히 가장 빠릅니다 ..... 그냥 predict
어때?
predict_on_batch
대신에 시도하면 어떻게됩니까 ?