Keras'ta Erken Durdurma geri aramasının kullandığı metriği değiştirmek için uzakta mısınız?


13

Keras'ta Erken Durdurma geri aramasını kullanırken, bazı metrikler (genellikle doğrulama kaybı) artmadığında eğitim durur. Doğrulama kaybı yerine başka bir metrik (doğruluk, hatırlama, f-ölçü) kullanmanın bir yolu var mı? Şimdiye kadar gördüğüm tüm örnekler buna benziyor: callbacks.EarlyStopping (monitor = 'val_loss', sabır = 5, ayrıntılı = 0, mod = 'otomatik')

Yanıtlar:


11

Modeli derlerken belirttiğiniz herhangi bir metrik işlevi kullanabilirsiniz.

Aşağıdaki metrik işleviniz olduğunu varsayalım:

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

Bu işlevin tek şartı, gerçek y ve tahmin edilen y'yi kabul etmesidir.

Modeli derlerken, 'doğruluk' gibi metriklerde nasıl oluşturulacağına benzer şekilde bu metriği belirtirsiniz:

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

My_metric fonksiyon adını '' olmadan ('doğruluk' derlemesinin aksine) kullandığımıza dikkat edin.

Ardından, EarlyStopping'inizi tanımlarsanız, işlevin adını kullanın (bu sefer '' ile):

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

Modu belirttiğinizden emin olun (eğer daha düşükse min, daha iyiyse maks).

Herhangi bir yerleşik metrik gibi kullanabilirsiniz. Bu muhtemelen ModelCheckpoint gibi diğer Geri Aramalarla da çalışır (ancak bunu test etmedim). Dahili olarak, Keras yeni metriği işlev adını kullanarak bu model için kullanılabilir metrikler listesine ekler.

Model.fit (...) 'de doğrulama için veri belirtirseniz,' val_my_metric 'komutunu kullanarak bu verileri EarlyStopping için de kullanabilirsiniz.


3

Tabii ki, sadece kendi oluşturun!

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)

Ben bunu test etmedim ama bu konuda nasıl genel bir lezzet olmalı. Eğer işe yaramazsa bana haber verin ve hafta sonu tekrar deneyeceğim. Ayrıca kendi f1 puanınızı zaten uyguladığınızı varsayıyorum. Değilse sadece sklearn için ithalat.


+1 Hâlâ 11.02.2020 tarihinden itibaren en son Keras ve Python 3.7
Austin
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.