การสูญเสีย Keras และค่าเมตริกไม่ตรงกับฟังก์ชันเดียวกันในแต่ละฟังก์ชัน

Aug 18 2020

ฉันใช้ Keras กับฟังก์ชันการสูญเสียที่กำหนดเองดังต่อไปนี้:

def custom_fn(y_true, y_pred):
   # changing y_true, y_pred values systematically
   return mean_absolute_percentage_error(y_true, y_pred)
   

จากนั้นฉันก็โทรmodel.compile(loss=custom_fn)และmodel.fit(X, y,..validation_data=(X_val, y_val)..)

Keras จะถูกบันทึกlossและval_lossอยู่ในประวัติรุ่น เพื่อเป็นการตรวจสอบความมีสุขภาพจิตเมื่อแบบจำลองเสร็จสิ้นการฝึกอบรมฉันกำลังใช้model.predict(X_val)ดังนั้นฉันจึงสามารถคำนวณการสูญเสียการตรวจสอบความถูกต้องด้วยตนเองcustom_fnโดยใช้แบบจำลองที่ได้รับการฝึกอบรม

ฉันกำลังบันทึกโมเดลด้วยช่วงเวลาที่ดีที่สุดโดยใช้การโทรกลับนี้:

callbacks.append(ModelCheckpoint(path, save_best_only=True, monitor='val_loss', mode='min'))

ดังนั้นหลังจากคำนวณสิ่งนี้แล้วการสูญเสียการตรวจสอบความถูกต้องควรตรงกับval_lossค่าของKeras ในยุคที่ดีที่สุด แต่สิ่งนี้ไม่ได้เกิดขึ้น

ในฐานะที่เป็นความพยายามอีกครั้งในการค้นหาปัญหานี้ฉันกำลังทำสิ่งนี้ด้วย:

    model.compile(loss=custom_fn, metrics=[custom_fn])

และทำให้ฉันประหลาดใจval_lossและval_custom_fnไม่ตรงกัน (ไม่ใช่lossหรือloss_custom_fnสำหรับเรื่องนั้น)

นี่เป็นเรื่องแปลกจริงๆของฉันcustom_fnเป็น Keras 'ที่สร้างขึ้นmapeด้วยy_trueและถูกy_predปรับแต่งเล็กน้อย เกิดขึ้นที่นี่คืออะไร?

PS : ชั้นฉันใช้เป็นLSTMชั้นและเป็นครั้งสุดท้ายDenseชั้น แต่ฉันคิดว่าข้อมูลนี้ไม่เกี่ยวข้องกับปัญหา ฉันยังใช้การทำให้เป็นมาตรฐานเป็นไฮเปอร์พารามิเตอร์ แต่ไม่ใช่การออกกลางคัน

อัปเดต

แม้แต่การลบcustom_fnและใช้ keras ในตัวmapeเป็นฟังก์ชันการสูญเสียและเมตริกเช่นนี้:

model.compile(loss='mape', metrics=['mape'])

และเพื่อความเรียบง่ายการลบการModelCheckpointโทรกลับจะมีผลเช่นเดียวกัน val_lossและval_mapeแต่ละยุคจะไม่เทียบเท่ากัน นี่เป็นเรื่องแปลกมากสำหรับฉัน ฉันกำลังทำอะไรบางอย่างหายไปหรือมีข้อผิดพลาดในโค้ด Keras .. แต่ก่อนอาจจะเป็นจริงมากกว่านี้

คำตอบ

3 user7331538 Aug 18 2020 at 19:34

โพสต์บล็อกนี้ชี้ให้เห็นว่า Keras เพิ่มการทำให้เป็นระเบียบที่ใช้ในการฝึกอบรมเมื่อคำนวณการสูญเสียการตรวจสอบความถูกต้อง และเห็นได้ชัดว่าเมื่อคำนวณเมตริกที่เลือกจะไม่มีการใช้การทำให้เป็นมาตรฐาน ด้วยเหตุนี้จึงเกิดขึ้นกับฟังก์ชันการสูญเสียที่เลือกตามที่ระบุไว้ในคำถาม

นี่คือสิ่งที่ฉันไม่พบเอกสารใด ๆ จาก Keras อย่างไรก็ตามดูเหมือนว่าจะยังคงดำเนินต่อไปตั้งแต่เมื่อฉันลบพารามิเตอร์ไฮเปอร์พารามิเตอร์การทำให้เป็นมาตรฐานทั้งหมดval_lossและval_custom_fnตรงกับในแต่ละยุคทุกประการ

วิธีแก้ปัญหาง่ายๆคือใช้custom_fnเป็นเมตริกและบันทึกรูปแบบที่ดีที่สุดตามเมตริก ( val_custom_fn) มากกว่าในไฟล์val_loss. หรือมิฉะนั้นวนval_lossซ้ำแต่ละยุคด้วยตนเองและคำนวณด้วยตนเองที่ถูกต้องหลังจากการฝึกอบรมแต่ละยุค ข้อหลังดูเหมือนจะสมเหตุสมผลกว่าเนื่องจากไม่มีเหตุผลที่จะรวมcustom_fnทั้งเป็นเมตริกและฟังก์ชันการสูญเสีย

หากใครสามารถหาหลักฐานเกี่ยวกับเรื่องนี้ในเอกสาร Keras ที่จะเป็นประโยชน์