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