क्या केरस में अर्ली स्टॉपिंग कॉलबैक द्वारा उपयोग किए जाने वाले मीट्रिक को बदलने के लिए दूर है?


13

जब कुछ मीट्रिक (आमतौर पर सत्यापन हानि) नहीं बढ़ रहा है, तो केरस प्रशिक्षण में प्रारंभिक रोक कॉलबैक का उपयोग करना बंद हो जाता है। क्या सत्यापन हानि के बजाय किसी अन्य मीट्रिक (जैसे सटीक, याद, एफ-माप) का उपयोग करने का कोई तरीका है? अब तक मैंने जितने भी उदाहरण देखे हैं, वे एक समान हैं: कॉलबैक।

जवाबों:


11

आप मॉडल को संकलित करते समय आपके द्वारा निर्दिष्ट किसी भी मीट्रिक फ़ंक्शन का उपयोग कर सकते हैं।

मान लें कि आपके पास निम्न मीट्रिक फ़ंक्शन है:

def my_metric(y_true, y_pred):
     return some_metric_computation(y_true, y_pred)

इस फ़ंक्शन के लिए एकमात्र आवश्यकता यह है कि यह सही y और अनुमानित y को स्वीकार करता है।

जब आप मॉडल संकलित करते हैं, तो आप इस मीट्रिक को निर्दिष्ट करते हैं, इसी तरह आप 'सटीकता' जैसे मैट्रिक्स में निर्माण को कैसे निर्दिष्ट करते हैं:

model.compile(metrics=['accuracy', my_metric], ...)

ध्यान दें कि हम फ़ंक्शन नाम का उपयोग कर रहे हैं my_metric बिना '' ('सटीकता' में बिल्ड के विपरीत)।

फिर, यदि आप अपने अर्लीस्टॉपिंग को परिभाषित करते हैं, तो केवल फ़ंक्शन के नाम का उपयोग करें (इस बार '' के साथ):

EarlyStopping(monitor='my_metric', mode='min')

मोड निर्दिष्ट करना सुनिश्चित करें (यदि कम बेहतर है, तो अधिकतम बेहतर है तो अधिकतम)।

आप इसे किसी भी बिल्ड-इन मीट्रिक की तरह उपयोग कर सकते हैं। यह शायद अन्य कॉलबैक जैसे कि मॉडलचेकपॉइंट के साथ भी काम करता है (लेकिन मैंने इसका परीक्षण नहीं किया है)। आंतरिक रूप से, Keras केवल फ़ंक्शन नाम का उपयोग करके इस मॉडल के लिए उपलब्ध मीट्रिक की सूची में नई मीट्रिक जोड़ता है।

यदि आप अपने model.fit (...) में सत्यापन के लिए डेटा निर्दिष्ट करते हैं, तो आप 'val_my_metric' का उपयोग करके अर्लीस्टॉपिंग के लिए भी इसका उपयोग कर सकते हैं।


3

बेशक, बस अपना खुद का बनाएं!

class EarlyStopByF1(keras.callbacks.Callback):
    def __init__(self, value = 0, verbose = 0):
        super(keras.callbacks.Callback, self).__init__()
        self.value = value
        self.verbose = verbose


    def on_epoch_end(self, epoch, logs={}):
         predict = np.asarray(self.model.predict(self.validation_data[0]))
         target = self.validation_data[1]
         score = f1_score(target, prediction)
         if score > self.value:
            if self.verbose >0:
                print("Epoch %05d: early stopping Threshold" % epoch)
            self.model.stop_training = True


callbacks = [EarlyStopByF1(value = .90, verbose =1)]
model.fit(X, y, batch_size = 32, nb_epoch=nb_epoch, verbose = 1, 
validation_data(X_val,y_val), callbacks=callbacks)

मैंने इसका परीक्षण नहीं किया है, लेकिन आपको इसके बारे में सामान्य स्वाद होना चाहिए। अगर यह काम नहीं करता है तो मुझे बताएं और मैं सप्ताहांत में फिर से प्रयास करूंगा। मैं यह भी मान रहा हूँ कि आपका अपना f1 स्कोर पहले से ही लागू है। अगर सिर्फ स्केलेन के लिए आयात न करें।


+1 अभी भी नवीनतम Keras और पायथन 3.7 का उपयोग कर 2/11/2020 के रूप में काम करता है
ऑस्टिन
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.