มีการเปลี่ยนแปลงตัวชี้วัดที่ใช้โดยการโทรกลับก่อนหยุดใน Keras หรือไม่


13

เมื่อใช้การเรียกกลับก่อนหยุดในการฝึกซ้อมของ Keras จะหยุดเมื่อตัวชี้วัดบางตัว (โดยปกติสูญเสียการตรวจสอบ) ไม่เพิ่มขึ้น มีวิธีใช้ตัวชี้วัดอื่น (เช่นความแม่นยำการเรียกคืนการวัด f) แทนการสูญเสียการตรวจสอบหรือไม่ ตัวอย่างทั้งหมดที่ฉันเคยเห็นมีความคล้ายคลึงกับนี้: callbacks.EarlyStopping (monitor = 'val_loss', อดทน = 5, verbose = 0, mode = 'auto')

คำตอบ:


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 ของคุณเพียงแค่ใช้ชื่อของฟังก์ชั่น (เวลานี้กับ ''):

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

ตรวจสอบให้แน่ใจว่าระบุโหมด (ต่ำสุดถ้าต่ำกว่าดีกว่าสูงสุดถ้าสูงกว่าดีกว่า)

คุณสามารถใช้งานได้เช่นเดียวกับการวัดในตัว นี่อาจใช้ได้กับ Callbacks อื่น ๆ เช่น ModelCheckpoint (แต่ฉันยังไม่ได้ทดสอบ) ภายใน Keras เพิ่งเพิ่มตัวชี้วัดใหม่ในรายการตัวชี้วัดที่มีให้สำหรับรุ่นนี้โดยใช้ชื่อฟังก์ชัน

หากคุณระบุข้อมูลสำหรับการตรวจสอบความถูกต้องใน model.fit (... ) ของคุณคุณสามารถใช้ข้อมูลนี้สำหรับ EarlyStopping โดยใช้ '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 ของคุณเองแล้ว ถ้าไม่เพียงแค่นำเข้า sklearn


+1 ยังทำงานตั้งแต่ 2/11/2020 โดยใช้ Keras และ Python 3.7 ล่าสุด
Austin
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.