โครงข่ายประสาทเทียมมากเกินไป การออกกลางคันไม่ได้ช่วยอะไร


16

ฉันกำลังเล่นกับ convnets เล็กน้อย โดยเฉพาะฉันใช้ชุดข้อมูล cats-vs-dogs kaggle ซึ่งประกอบไปด้วยรูปภาพ 25,000 ภาพที่มีป้ายกำกับว่าเป็น cat หรือ dog (12500 อัน)

ฉันจัดการเพื่อให้บรรลุความถูกต้องจำแนก 85% ในชุดทดสอบของฉัน แต่ฉันกำหนดเป้าหมายของการบรรลุความแม่นยำ 90%

ปัญหาหลักของฉันคือ overfitting อย่างใดก็มักจะเกิดขึ้นเสมอ (ปกติหลังจากยุค 8-10) สถาปัตยกรรมของเครือข่ายของฉันได้รับแรงบันดาลใจมาจาก VGG-16 โดยเฉพาะอย่างยิ่งภาพของฉันได้รับการปรับขนาดเป็น128x128x3จากนั้นฉันเรียกใช้:

Convolution 1 128x128x32 (kernel size is 3, strides is 1)
Convolution 2 128x128x32 (kernel size is 3, strides is 1)
Max pool    1 64x64x32   (kernel size is 2, strides is 2)
Convolution 3 64x64x64   (kernel size is 3, strides is 1)
Convolution 4 64x64x64   (kernel size is 3, strides is 1)
Max pool    2 32x32x64   (kernel size is 2, strides is 2)
Convolution 5 16x16x128  (kernel size is 3, strides is 1)
Convolution 6 16x16x128  (kernel size is 3, strides is 1)
Max pool    3 8x8x128    (kernel size is 2, strides is 2)
Convolution 7 8x8x256    (kernel size is 3, strides is 1)
Max pool    4 4x4x256    (kernel size is 2, strides is 2)
Convolution 8 4x4x512    (kernel size is 3, strides is 1)
Fully connected layer 1024 (dropout 0.5)
Fully connected layer 1024 (dropout 0.5)

เลเยอร์ทั้งหมดยกเว้นอันสุดท้ายมี relus เป็นฟังก์ชันเปิดใช้

โปรดทราบว่าฉันได้ลองใช้ชุดค่าผสมที่แตกต่างกัน (ฉันเริ่มด้วยชุดรูปแบบที่ง่ายกว่า)

นอกจากนี้ฉันได้เพิ่มชุดข้อมูลโดยทำมิเรอร์รูปภาพเพื่อให้โดยรวมแล้วฉันมี 50,000 ภาพ

นอกจากนี้ฉันกำลังทำให้รูปภาพเป็นปกติโดยใช้การปรับค่าสูงสุดขั้นต่ำโดยที่ X คือรูปภาพ

X=X0/2550

รหัสถูกเขียนใน tensorflow และขนาดของชุดงานคือ 128

ชุดข้อมูลการฝึกอบรมจบลงด้วยการล้นและมีความแม่นยำ 100% ในขณะที่ข้อมูลการตรวจสอบดูเหมือนว่าจะหยุดเรียนที่ประมาณ 84-85%

ฉันได้พยายามเพิ่ม / ลดอัตราการออกกลางคัน

เครื่องมือเพิ่มประสิทธิภาพที่ใช้คือ AdamOptimizer ด้วยอัตราการเรียนรู้ 0.0001

ในขณะนี้ฉันได้เล่นกับปัญหานี้ในช่วง 3 สัปดาห์ที่ผ่านมาและ 85% ดูเหมือนจะเป็นอุปสรรคต่อหน้าฉัน

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

ปรับปรุง:

ฉันกำลังใช้งานเครือข่ายเดียวกันด้วยขนาดแบทช์ที่แตกต่างกันในกรณีนี้ฉันใช้ขนาดแบตช์ที่เล็กกว่ามาก (16 แทน 128) จนถึงตอนนี้ฉันถึงความแม่นยำ 87.5% (แทนที่จะเป็น 85%) ที่กล่าวว่าเครือข่ายจบลงด้วยการ overfitting ต่อไป ถึงกระนั้นฉันก็ยังไม่เข้าใจว่าการลดลง 50% ของหน่วยไม่ได้ช่วย ... เห็นได้ชัดว่าฉันกำลังทำอะไรผิดที่นี่ ความคิดใด ๆ

อัปเดต 2:

ดูเหมือนว่าปัญหาจะเกี่ยวข้องกับขนาดแบทช์เช่นเดียวกับขนาดที่เล็กกว่า (16 แทนที่จะเป็น 128) ตอนนี้ฉันได้รับความถูกต้องแม่นยำ 92.8% ในชุดทดสอบของฉันด้วยขนาดแบตช์ที่เล็กลง ด้วยความแม่นยำ 100%) อย่างไรก็ตามการสูญเสีย (ข้อผิดพลาด) จะลดลงและโดยทั่วไปจะมีเสถียรภาพมากขึ้น ข้อเสียคือเวลาทำงานช้าลงมาก แต่มันก็คุ้มค่ากับการรอ


2
คุณสามารถให้รายละเอียดเพิ่มเติมเกี่ยวกับการประเมินความเหมาะสมของคุณหรือไม่ ตัวอย่างเช่นความถูกต้องของการตรวจสอบความถูกต้องจะลดลงณ จุดใด ๆ ควบคู่กับความแตกต่างจากผลการฝึกอบรมและการตรวจสอบความถูกต้องหรือไม่ ฟังก์ชั่นการสูญเสียเป็นอย่างไร?
Neil Slater

คำถามที่ดีดังนั้นโดยการ overfitting ฉันหมายถึงความจริงที่ว่า mini-batches ในรถไฟได้รับความแม่นยำ 100% และการสูญเสีย 0.08 ในขณะที่การตรวจสอบความถูกต้องดูเหมือนจะไม่ต่ำกว่า 0.35 และความแม่นยำยังคงอยู่ที่ 88% ตามการตรวจสอบดูเหมือนว่าจะไม่ลดลง (อย่างน้อยก็ไม่มากเกินไป) ดูเหมือนว่าจะแบน แต่ทำไมมินิแบทช์ถึงได้รับการสูญเสียต่ำในขณะที่การตรวจสอบยังห่างไกลจากมัน?
Juan Antonio Gomez Moriano

ฉันไม่ทราบคำตอบสำหรับคุณ แต่พฤติกรรมนี้ - ความแตกต่างมากระหว่างรถไฟและการตรวจสอบ แต่ยังคงตรวจสอบที่ราบสูง OK-ish - เป็นสิ่งที่ฉันเคยเห็นมาไม่กี่ครั้ง ฉันเกือบจะลังเลที่จะเรียกมันว่ากระชับเกินไปเพราะบางครั้งผลการทดสอบเป็นที่ยอมรับ
Neil Slater

"ถึงกระนั้นฉันก็ยังไม่เข้าใจว่าการลดลงของหน่วย 50% นั้นไม่ได้ช่วยอะไร" ฉันเห็นผู้คนใช้ค่าการออกกลางคันที่สูงขึ้นมากและประสบความสำเร็จ
Ricardo Cruz

คำตอบ:


14

ตกลงดังนั้นหลังจากการทดลองจำนวนมากฉันมีการจัดการเพื่อให้ได้ผลลัพธ์ / ข้อมูลเชิงลึกบางอย่าง

ในสถานที่แรกทุกอย่างเท่ากันชุดเล็กในชุดฝึกอบรมช่วยมากเพื่อเพิ่มประสิทธิภาพทั่วไปของเครือข่ายเป็นด้านลบกระบวนการฝึกอบรมจะช้าลง muuuuuch

ประเด็นที่สองข้อมูลมีความสำคัญไม่มีอะไรใหม่ที่นี่ แต่เมื่อฉันเรียนรู้ในขณะที่ต่อสู้กับปัญหานี้ข้อมูลจำนวนมากดูเหมือนจะช่วยได้บ้าง

จุดที่สามการออกกลางคันมีประโยชน์ในเครือข่ายขนาดใหญ่ที่มีข้อมูลจำนวนมากและการวนซ้ำจำนวนมากในเครือข่ายของฉันฉันใช้การออกกลางคันในเลเยอร์ที่เชื่อมต่อเต็มที่สุดท้ายเท่านั้นเลเยอร์ Convolution ไม่ได้รับการดรอปเอาต์

จุดที่สี่ (และนี่คือสิ่งที่ผมเรียนรู้กว่าและมากกว่า): networds ประสาทใช้เวลามากในการฝึกอบรมแม้ใน GPUs ที่ดี (ผมผ่านการฝึกอบรมเครือข่ายนี้ใน floydhub ซึ่งใช้การ์ด NVIDIA ค่อนข้างแพง) ดังนั้นการอดทนเป็นสิ่งที่สำคัญ

ข้อสรุปสุดท้าย: ขนาดของแบตช์มีความสำคัญมากกว่าที่ใคร ๆ อาจคิดว่าเห็นได้ชัดว่าง่ายกว่าในการตีน้อยที่สุดเมื่อแบตช์มีขนาดใหญ่กว่า

รหัสที่ฉันเขียนนั้นมีให้ใช้งานเหมือนโน๊ตบุ๊คไพ ธ อนฉันคิดว่ามันถูกบันทึกไว้อย่างเหมาะสม

https://github.com/moriano/loco-learning/blob/master/cats-vs-dogs/cats-vs-dogs.ipynb


ขอบคุณสำหรับการโพสต์สิ่งที่คุณค้นพบ คำถามอย่างรวดเร็ว: NOTE USE EITHER mean centering or min-max, NOT BOTHฉันกำลังเผชิญปัญหาที่คล้ายกันและฉันเห็นนี้ในสมุดบันทึกที่คุณโพสต์: ขณะนี้ฉันกำลังแบ่งภาพอินพุตของฉัน 255 ภายในinput_fn(Tensorflow Estimator API) ของฉัน จากนั้นในแบบจำลองฉันกำลังเรียกใช้ข้อมูลนั้นผ่านชุดบรรทัดฐาน ฉันควรจะทำแค่หนึ่งในวิธีการฟื้นฟูสภาพปกติเหล่านี้เหรอ? ดูgithub.com/formigone/tf-imagenet/blob/master/models/ …
rodrigo-silveira

ความเข้าใจของฉันที่หารด้วย 255 ทำได้แค่ครั้งเดียวต่อภาพแต่ละภาพและเหตุผลคือเก็บค่าทั้งหมดไว้ระหว่าง 0 ถึง 1 เนื่องจากจะให้ความเสถียรเชิงตัวเลข
Juan Antonio Gomez Moriano

แน่นอนว่าฉันเข้าใจแล้ว แต่คุณคิดว่ามันสมเหตุสมผลหรือไม่ที่จะทำให้ค่าเหล่านั้นเป็นมาตรฐานในช่วง [0, 1]?
rodrigo-silveira

ว่าผมไม่ทราบว่าจะได้รับในขณะที่ตั้งแต่ฉันได้ใช้ชุดฟื้นฟู :)
อันโตนิโอฆ Gomez Moriano

3

ฉันขอแนะนำให้คุณวิเคราะห์แผนการเรียนรู้ของความถูกต้องในการตรวจสอบตามที่ Neil Slater แนะนำ จากนั้นหากความถูกต้องลดลงของการตรวจสอบความถูกต้องพยายามที่จะลดขนาดของเครือข่ายของคุณ (ดูเหมือนลึกเกินไป) ให้เพิ่มการออกกลางคันในชั้น CONV และ BatchNormalization หลังจากแต่ละชั้น มันสามารถช่วยกำจัดการ overfitting และเพิ่มความแม่นยำในการทดสอบ


ขอขอบคุณสำหรับคำแนะนำจะลองใช้อย่างไรก็ตามฉันรู้สึกว่าชั้น CONV ไม่จำเป็นต้องออกกลางคันในเอกสารส่วนใหญ่ที่ฉันได้อ่านดูเหมือนว่าการวางกลางคันจะถูกนำไปใช้กับชั้นที่เชื่อมต่ออย่างเต็มที่เสมอไม่ใช่กับคอนโวลูติน
Juan Antonio Gomez Moriano

3

มีวิธีแก้ปัญหาที่เป็นไปได้หลายอย่างสำหรับปัญหาของคุณ

  1. ใช้ Dropout ในเลเยอร์ก่อนหน้า (เลเยอร์ convolutional) ด้วย

  2. เครือข่ายของคุณดูเหมือนจะค่อนข้างใหญ่สำหรับงานที่ "ง่าย" พยายามลด สถาปัตยกรรมขนาดใหญ่ยังได้รับการฝึกฝนเกี่ยวกับชุดข้อมูลที่ใหญ่กว่ามาก

หากคุณต้องการให้สถาปัตยกรรม "ใหญ่" ของคุณลอง:

  1. การเพิ่มรูปภาพเพื่อเพิ่มข้อมูลการฝึกอบรมของคุณ

  2. ลองใช้การฝึกอบรมเชิงรุก บางครั้งมันก็ช่วย


"เครือข่ายของคุณดูเหมือนจะค่อนข้างใหญ่สำหรับงานที่" ง่าย "ลองลดมันสถาปัตยกรรมขนาดใหญ่ก็ได้รับการฝึกฝนในชุดข้อมูลที่ใหญ่กว่ามาก" ฉันไม่เห็นด้วยเมื่อฉันเพิ่มการโน้มน้าวใจมากขึ้นความแม่นยำเพิ่มขึ้น (เริ่มแรกฉันบรรลุ 68% ด้วยการโน้มน้าวเพียงสองครั้ง) นอกจากนี้ฉันกำลังเพิ่มชุดข้อมูลของฉันฉันทำงานด้วยภาพ 50,000 ภาพ
Juan Antonio Gomez Moriano

2

สิ่งหนึ่งที่ยังไม่ได้รับการกล่าวถึงและคุณสามารถพิจารณาได้ในอนาคต: คุณยังสามารถเพิ่มการออกกลางคันในเลเยอร์ที่เชื่อมต่ออย่างสมบูรณ์

ฉันอ่านกระดาษหนึ่งครั้งที่ใช้อัตราการออกกลางคัน 90% แม้ว่ามันจะมีหลาย ๆ โหนด (2048 ถ้าฉันจำได้ถูกต้อง) ฉันได้ลองตัวเองบนเลเยอร์ที่มีโหนดน้อยกว่าและมันก็มีประโยชน์มากในบางกรณี

ฉันแค่ดูว่ามันเป็นกระดาษอะไร ฉันจำไม่ได้ว่าเอกสารเล่มไหนที่ฉันจำได้ แต่ฉันพบว่ามันประสบความสำเร็จด้วยอัตราการออกกลางคัน 90%

Karpathy, A. , Toderici, G. , Shetty, S. , เหลียง, T. , Sukthankar, R. , & Fei-Fei, L. (2014) การจัดหมวดหมู่วิดีโอขนาดใหญ่พร้อมเครือข่ายประสาทเทียม ในการดำเนินการประชุม IEEE ด้านการมองเห็นด้วยคอมพิวเตอร์และการจดจำรูปแบบ (หน้า 1725-1732)

Simonyan, K. , & Zisserman, A. (2014) เครือข่ายแบบสองสายสนทนาเพื่อการจดจำการกระทำในวิดีโอ ในความก้าวหน้าในระบบประมวลผลข้อมูลประสาท (หน้า 568-576)

Varol, G. , Laptev, I. , & Schmid, C. (2017) ความเชื่อมั่นทางโลกระยะยาวเพื่อการรับรู้การกระทำ ธุรกรรม IEEE เกี่ยวกับการวิเคราะห์รูปแบบและความชาญฉลาดของเครื่องจักร


0

ฉันมีปัญหานี้เช่นกัน หลังจากคิดไปหลายชั่วโมงโดยบังเอิญฉันตัดสินใจสับข้อมูลก่อนที่จะป้อนเข้าสู่ระบบและ voila มันเริ่มทำงาน ฉันใช้เวลาเล็กน้อยในการคิดว่ามันเป็นสับที่ทำเคล็ดลับ! หวังว่านี่จะช่วยชีวิตใครบางคนจากความยุ่งยาก!

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