คำถามที่ดี.
ฉันเจอปรากฏการณ์นี้หลายครั้ง นี่คือข้อสังเกตของฉัน:
ไล่ระดับสีระเบิด
เหตุผล: การไล่ระดับสีขนาดใหญ่ทำให้กระบวนการเรียนรู้นอกเส้นทาง
สิ่งที่คุณควรคาดหวัง:ดูที่บันทึกรันไทม์คุณควรดูที่ค่าการสูญเสียต่อการวนซ้ำ คุณจะพบว่าการเริ่มต้นของการสูญเสียที่จะเติบโตอย่างมีนัยสำคัญnan
จากการทำซ้ำไปซ้ำในที่สุดการสูญเสียจะมีขนาดใหญ่เกินไปที่จะแสดงโดยตัวแปรจุดลอยและมันจะกลายเป็น
คุณทำอะไรได้บ้าง:ลดbase_lr
(ใน solver.prototxt) ตามลำดับขนาด (อย่างน้อย) หากคุณมีการสูญเสียชั้นหลาย ๆ คุณควรตรวจสอบการเข้าสู่ระบบเพื่อดูว่าชั้นเป็นผู้รับผิดชอบสำหรับการไล่ระดับสีระเบิดขึ้นและลดลงloss_weight
(ใน train_val.prototxt) base_lr
สำหรับชั้นเฉพาะที่แทนของทั่วไป
นโยบายและพารามิเตอร์อัตราการเรียนรู้ไม่ดี
เหตุผล: caffe ไม่สามารถคำนวณอัตราการเรียนรู้ที่ถูกต้องและได้รับ'inf'
หรือ'nan'
แทนอัตราที่ไม่ถูกต้องนี้จะคูณการอัปเดตทั้งหมดและทำให้พารามิเตอร์ทั้งหมดเป็นโมฆะ
สิ่งที่คุณควรคาดหวัง:เมื่อดูบันทึกรันไทม์คุณจะเห็นว่าอัตราการเรียนรู้นั้นกลายเป็น'nan'
เช่น:
... sgd_solver.cpp:106] Iteration 0, lr = -nan
คุณสามารถทำอะไรได้บ้าง:แก้ไขพารามิเตอร์ทั้งหมดที่มีผลต่ออัตราการเรียนรู้ใน'solver.prototxt'
ไฟล์ของคุณ
ตัวอย่างเช่นหากคุณใช้lr_policy: "poly"
และลืมกำหนดmax_iter
พารามิเตอร์คุณจะจบลงด้วย lr = nan
...
สำหรับข้อมูลเพิ่มเติมเกี่ยวกับอัตราการเรียนรู้ในคาเฟอีนโปรดดูหัวข้อนี้
ฟังก์ชันการสูญเสียที่ผิดพลาด
เหตุผล:บางครั้งการคำนวณการสูญเสียในชั้นการสูญเสียทำให้nan
s ปรากฏขึ้น ตัวอย่างเช่นInfogainLoss
ชั้นการให้อาหารที่มีค่าที่ไม่เป็นมาตรฐานโดยใช้เลเยอร์การสูญเสียที่กำหนดเองพร้อมข้อบกพร่องเป็นต้น
สิ่งที่คุณควรคาดหวัง:เมื่อดูบันทึกรันไทม์คุณอาจไม่สังเกตเห็นสิ่งผิดปกติ: การสูญเสียกำลังลดลงเรื่อย ๆ และทันใดnan
นั้นก็ปรากฏขึ้น
คุณสามารถทำอะไรได้บ้าง:ดูว่าคุณสามารถสร้างข้อผิดพลาดซ้ำได้หรือไม่เพิ่มงานพิมพ์ในเลเยอร์การสูญเสียและแก้ไขข้อผิดพลาด
ตัวอย่างเช่น: เมื่อฉันใช้การสูญเสียที่ทำให้การลงโทษเป็นปกติตามความถี่ของการเกิดป้ายกำกับในชุดงาน มันเกิดขึ้นเช่นนั้นถ้าหนึ่งในป้ายกำกับการฝึกอบรมไม่ปรากฏในชุดงานเลย - การสูญเสียที่คำนวณได้เกิดnan
ขึ้น ในกรณีนั้นการทำงานกับแบทช์ที่มากพอ (ตามจำนวนป้ายกำกับในชุด) ก็เพียงพอที่จะหลีกเลี่ยงข้อผิดพลาดนี้
การป้อนข้อมูลผิดพลาด
เหตุผล:คุณมีข้อมูลnan
อยู่ในนั้น!
สิ่งที่คุณควรคาดหวัง:เมื่อกระบวนการการเรียนรู้ "ฮิต" การป้อนข้อมูลที่ผิดพลาดนี้ - nan
ส่งออกจะกลายเป็น เมื่อดูบันทึกรันไทม์คุณอาจไม่สังเกตเห็นสิ่งผิดปกติ: การสูญเสียกำลังลดลงเรื่อย ๆ และทันใดnan
นั้นก็ปรากฏขึ้น
คุณสามารถทำอะไรได้บ้าง:สร้างชุดข้อมูลอินพุตของคุณใหม่ (lmdb / leveldn / hdf5 ... ) ตรวจสอบให้แน่ใจว่าคุณไม่มีไฟล์ภาพที่ไม่ดีในชุดการฝึกอบรม / การตรวจสอบความถูกต้อง สำหรับการดีบักคุณสามารถสร้างเน็ตง่ายๆที่อ่านเลเยอร์อินพุตโดยมีการสูญเสียดัมมี่อยู่ด้านบนและรันผ่านอินพุตทั้งหมด: หากหนึ่งในนั้นผิดพลาดเน็ตดัมมี่นี้ก็ควรสร้างnan
ขึ้นเช่นกัน
ก้าวใหญ่กว่าขนาดเคอร์เนลใน"Pooling"
เลเยอร์
ด้วยเหตุผลบางประการการเลือกstride
> kernel_size
สำหรับการรวมกลุ่มอาจส่งผลด้วยnan
s ตัวอย่างเช่น:
layer {
name: "faulty_pooling"
type: "Pooling"
bottom: "x"
top: "y"
pooling_param {
pool: AVE
stride: 5
kernel: 3
}
}
ผลลัพธ์ด้วยnan
s in y
.
ความไม่เสถียรใน "BatchNorm"
มีรายงานว่าภายใต้"BatchNorm"
เลเยอร์การตั้งค่าบางอย่างอาจส่งออกnan
เนื่องจากความไม่แน่นอนของตัวเลข ปัญหา
นี้เกิดขึ้นใน bvlc / caffe และPR # 5136กำลังพยายามแก้ไข
เร็ว ๆ นี้ผมเริ่มตระหนักถึงdebug_info
ธง: การตั้งค่าdebug_info: true
ในการ'solver.prototxt'
ที่จะทำให้การพิมพ์ Caffe เข้าสู่ระบบข้อมูลการแก้ปัญหาอื่น ๆ (รวมถึงการไล่ระดับสีขนาดและค่าเปิดใช้งาน) ในระหว่างการฝึก: ข้อมูลนี้สามารถช่วยในการจำ blowups ลาดและปัญหาอื่น ๆ ในขั้นตอนการฝึกอบรม