Tôi đã cố gắng để có được ước tính về thời gian dự đoán của mô hình máy ảnh của tôi và nhận ra một điều kỳ lạ. Ngoài việc khá nhanh bình thường, thỉnh thoảng người mẫu cần khá lâu để đưa ra dự đoán. Và không chỉ vậy, những lần đó cũng tăng thời gian chạy mô hình. Tôi đã thêm một ví dụ làm việc tối thiểu để tái tạo lỗi.
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))
Thời gian không phụ thuộc vào mẫu (nó đang được chọn ngẫu nhiên). Nếu thử nghiệm được lặp lại, các chỉ số trong vòng lặp for nơi dự đoán sẽ mất nhiều thời gian hơn (gần như) một lần nữa.
Tôi đang sử dụng:
tensorflow 2.0.0
python 3.7.4
Đối với ứng dụng của tôi, tôi cần đảm bảo thực hiện trong một thời gian nhất định. Điều này tuy nhiên không thể xem xét hành vi đó. Điều gì đang xảy ra? Đây có phải là một lỗi trong Keras hay là một lỗi trong phần phụ trợ kéo căng?
EDIT:
predict_on_batch
hiển thị cùng một hành vi, tuy nhiên, thưa thớt hơn:
y_pred = model(sample, training=False).numpy()
cho thấy một số ngoại lệ nặng, tuy nhiên, chúng không tăng.
EDIT 2: Tôi đã hạ cấp xuống phiên bản tenorflow 1 mới nhất (1.15). Không chỉ là vấn đề không còn tồn tại nữa, thời gian dự đoán "bình thường" cũng được cải thiện đáng kể! Tôi không thấy hai đột biến này có vấn đề, vì chúng không xuất hiện khi tôi lặp lại thử nghiệm (ít nhất là không ở cùng chỉ số và tăng tuyến tính) và phần trăm không lớn như trong âm mưu đầu tiên.
Do đó, chúng tôi có thể kết luận rằng đây dường như là một vấn đề cố hữu đối với tenorflow 2.0, cho thấy hành vi tương tự trong các tình huống khác như @OverLordGoldDragon đề cập.
y_pred = model(sample).numpy()
và với y_pred = model(sample, training=False).numpy()
?
predict_classes
vẫn là nhanh nhất .... có vẻ như. Thế còn predict
?
predict_on_batch
thay thế?