Có cách nào để thay đổi số liệu được sử dụng bởi cuộc gọi lại Dừng sớm trong Keras không?


12

Khi sử dụng gọi lại Dừng sớm trong đào tạo Keras dừng khi một số số liệu (thường là mất xác thực) không tăng. Có cách nào để sử dụng một số liệu khác (như độ chính xác, thu hồi, f-đo) thay vì mất xác nhận không? Tất cả các ví dụ tôi đã thấy cho đến nay đều tương tự như ví dụ này: callbacks.EarlyStopping (Monitor = 'val_loss', patience = 5, verbose = 0, mode = 'auto')

Câu trả lời:


10

Bạn có thể sử dụng bất kỳ hàm số liệu nào mà bạn đã chỉ định khi biên dịch mô hình.

Giả sử bạn có hàm số liệu sau:

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

Yêu cầu duy nhất cho chức năng này là phải chấp nhận y thực và y dự đoán.

Khi bạn biên dịch mô hình, bạn chỉ định số liệu này, tương tự như cách bạn chỉ định xây dựng theo số liệu như 'độ chính xác':

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

Lưu ý rằng chúng tôi đang sử dụng tên hàm my_metric mà không có '' (trái ngược với bản dựng trong 'độ chính xác').

Sau đó, nếu bạn xác định EarlyStopping của mình, chỉ cần sử dụng tên của hàm (lần này với ''):

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

Đảm bảo chỉ định chế độ (tối thiểu nếu thấp hơn là tốt hơn, tối đa nếu cao hơn là tốt hơn).

Bạn có thể sử dụng nó giống như bất kỳ số liệu tích hợp nào. Điều này có lẽ cũng hoạt động với các Callbacks khác như ModelCheckpoint (nhưng tôi chưa kiểm tra điều đó). Trong nội bộ, Keras chỉ cần thêm số liệu mới vào danh sách các số liệu có sẵn cho mô hình này bằng tên hàm.

Nếu bạn chỉ định dữ liệu để xác thực trong mô hình của mình.fit (...), thì bạn cũng có thể sử dụng dữ liệu đó cho EarlyStopping bằng cách sử dụng 'val_my_metric'.


3

Tất nhiên, chỉ cần tạo của riêng bạn!

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)

Tôi đã không thử nghiệm điều này nhưng đó sẽ là hương vị chung cho cách bạn đi về nó. Nếu nó không hoạt động hãy cho tôi biết và tôi sẽ thử lại vào cuối tuần. Tôi cũng cho rằng bạn đã thực hiện điểm số F1 của riêng mình. Nếu không chỉ nhập cho sklearn.


+1 Vẫn hoạt động kể từ ngày 2/11/2020 bằng cách sử dụng Keras và Python 3.7 mới nhất
Austin
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.