मैंने अपने केरस मॉडल की भविष्यवाणी के समय का अनुमान लगाने की कोशिश की और कुछ अजीब सा महसूस किया। सामान्य रूप से काफी तेज होने के अलावा, हर बार एक समय में मॉडल को एक भविष्यवाणी के साथ आने के लिए काफी लंबे समय की आवश्यकता होती है। और इतना ही नहीं, उन समय में मॉडल के चलने में भी अधिक समय लगता है। मैंने त्रुटि को पुन: उत्पन्न करने के लिए एक न्यूनतम काम करने का उदाहरण जोड़ा।
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))
समय नमूने पर निर्भर नहीं करता है (इसे यादृच्छिक रूप से उठाया जा रहा है)। यदि परीक्षण दोहराया जाता है, तो लूप के लिए सूचकांक जहां भविष्यवाणी में अधिक समय लगता है, वही फिर से होने वाला है (लगभग)।
मैं उपयोग कर रहा हूँ:
tensorflow 2.0.0
python 3.7.4
मेरे आवेदन के लिए मुझे एक निश्चित समय में निष्पादन की गारंटी देने की आवश्यकता है। हालाँकि उस व्यवहार को देखते हुए यह असंभव है। क्या गलत हो रहा है? क्या यह केरस में एक बग या टेनसफ़्लो बैकएंड में एक बग है?
संपादित करें:
predict_on_batch
एक ही व्यवहार दिखाता है, हालांकि, अधिक विरल:
y_pred = model(sample, training=False).numpy()
कुछ भारी आउटलेर्स को भी दिखाता है, हालांकि, वे नहीं बढ़ रहे हैं।
EDIT 2: मैंने नवीनतम टेंसोरफ़्लो 1 संस्करण (1.15) को डाउनग्रेड किया। न केवल समस्या अस्तित्व में नहीं है, बल्कि "सामान्य" भविष्यवाणी समय में भी काफी सुधार हुआ है! मैं दो स्पाइक्स को समस्याग्रस्त नहीं देखता, क्योंकि जब मैंने परीक्षण दोहराया (कम से कम एक ही सूचकांक और रैखिक रूप से नहीं बढ़ रहा था) तो वे दिखाई नहीं दिए और पहले प्लॉट में जितने बड़े हैं उतने बड़े नहीं हैं।
हम इस प्रकार यह निष्कर्ष निकाल सकते हैं कि यह एक समस्या है जो टेंसरफ़्लो 2.0 में निहित है, जो अन्य स्थितियों में @OverLordGoldDragon उल्लेखों के समान व्यवहार दिखाता है।
y_pred = model(sample).numpy()
और किसके साथ होता है y_pred = model(sample, training=False).numpy()
?
predict_classes
अभी भी सबसे तेज है .... ऐसा लगता है। क्या बस के बारे में predict
?
predict_on_batch
इसके बजाय कोशिश करते हैं तो क्या होगा ?