Apakah ada cara lain untuk mengubah metrik yang digunakan oleh panggilan balik Penghentian Awal di Keras?

13

Saat menggunakan panggilan balik Penghentian Awal dalam pelatihan Keras berhenti saat beberapa metrik (biasanya kehilangan validasi) tidak meningkat. Apakah ada cara untuk menggunakan metrik lain (seperti ketepatan, penarikan, ukuran-f) alih-alih kehilangan validasi? Semua contoh yang saya lihat sejauh ini mirip dengan yang ini: callbacks.EarlyStopping (monitor = 'val_loss', sabar = 5, verbose = 0, mode = 'auto')

P. Joseph
sumber

Jawaban:

11

Anda dapat menggunakan fungsi metrik apa pun yang Anda tentukan saat menyusun model.

Katakanlah Anda memiliki fungsi metrik berikut:

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

Satu-satunya persyaratan untuk fungsi ini adalah ia harus menerima y yang benar dan y yang diprediksi.

Saat Anda mengompilasi model, Anda menentukan metrik ini, mirip dengan cara Anda menentukan metrik build seperti 'akurasi':

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

Perhatikan bahwa kami menggunakan nama fungsi my_metric tanpa '' (berbeda dengan build dalam 'akurasi').

Lalu, jika Anda mendefinisikan EarlyStopping Anda, cukup gunakan nama fungsi (kali ini dengan ''):

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

Pastikan untuk menentukan mode (min jika lebih rendah lebih baik, maks jika lebih tinggi lebih baik).

Anda dapat menggunakannya sama seperti metrik bawaan apa pun. Ini mungkin juga berfungsi dengan Callback lain seperti ModelCheckpoint (tapi saya belum mengujinya). Secara internal, Keras hanya menambahkan metrik baru ke daftar metrik yang tersedia untuk model ini menggunakan nama fungsi.

Jika Anda menentukan data untuk validasi di model.fit Anda (...), maka Anda juga dapat menggunakannya untuk EarlyStopping dengan menggunakan 'val_my_metric'.

Michael
sumber
3

Tentu saja, buat saja sendiri!

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)

Saya belum menguji ini tetapi itu harus menjadi rasa umum untuk bagaimana Anda melakukannya. Jika tidak berhasil, beri tahu saya dan saya akan mencoba lagi selama akhir pekan. Saya juga berasumsi Anda sudah menerapkan skor f1 Anda sendiri. Jika tidak hanya mengimpor untuk sklearn.

Pucuk topi
sumber
+1 Masih berfungsi pada 2/11/2020 menggunakan Keras dan Python terbaru 3.7
Austin