วิธีจัดการกับภาพขนาดใหญ่ใน CNN


15

สมมติว่ามีภาพขนาด 10K ขนาด 2400 x 2400 ที่จำเป็นต้องใช้ใน CNN.Acc กับมุมมองของฉันคอมพิวเตอร์ทั่วไปที่ผู้คนใช้จะถูกใช้งาน ตอนนี้คำถามคือทำอย่างไรถึงจะจัดการกับภาพขนาดใหญ่เช่นนี้ได้โดยไม่มีสิทธิ์ในการสุ่มตัวอย่าง

นี่คือข้อกำหนดของระบบ: -

Ubuntu 16.04 RAM 64 GB GPU 16 GB 8 GB HDD 500 GB

1) มีเทคนิคใดบ้างในการจัดการภาพขนาดใหญ่ที่ต้องผ่านการฝึกอบรม?
2) ขนาดชุดใดที่เหมาะสมที่จะใช้?
3) มีข้อควรระวังในการใช้หรือเพิ่มหรือลดทรัพยากรฮาร์ดแวร์ที่ฉันสามารถทำได้หรือไม่?

คำตอบ:


14

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

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

1) มีเทคนิคใดบ้างในการจัดการภาพขนาดใหญ่ที่ต้องผ่านการฝึกอบรม?

งานวิจัยโดยทั่วไปปรับขนาดภาพให้มีขนาดที่เป็นกันเอง แต่ถ้านั่นไม่ใช่ตัวเลือกสำหรับคุณคุณจะต้อง จำกัด CNN ของคุณ นอกเหนือจากการลดการสุ่มตัวอย่างในชั้นแรก ๆ ฉันขอแนะนำให้คุณกำจัดชั้น FC (ซึ่งมักใช้พารามิเตอร์ส่วนใหญ่) เพื่อสนับสนุนเลเยอร์ convolutionalในความโปรดปรานของชั้นความสับสนนอกจากนี้คุณจะต้องสตรีมข้อมูลของคุณในแต่ละยุคเพราะมันจะไม่พอดีกับ GPU ของคุณ

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

2) ขนาดชุดใดที่เหมาะสมที่จะใช้?

นี่คือปัญหาอื่น ภาพเดียวจะใช้เวลา2400x2400x3x4(3 ช่องสัญญาณและ 4 ไบต์ต่อพิกเซล) ซึ่งเป็น ~ 70Mb ดังนั้นคุณจึงสามารถจ่ายได้แม้ขนาดแบตช์ 10 ยิ่งสมจริงมากขึ้นจะเป็น 5 โปรดทราบว่าหน่วยความจำส่วนใหญ่จะใช้พารามิเตอร์ CNN ฉันคิดว่าในกรณีนี้มันสมเหตุสมผลแล้วที่จะลดขนาดโดยใช้ค่า 16- บิตมากกว่า 32- บิต - วิธีนี้คุณจะสามารถเพิ่มแบทช์ได้สองเท่า

3) มีข้อควรระวังในการใช้หรือเพิ่มหรือลดทรัพยากรฮาร์ดแวร์ที่ฉันสามารถทำได้หรือไม่?

คอขวดของคุณคือหน่วยความจำ GPU หากคุณสามารถซื้อ GPU ตัวอื่นได้ให้รับมาและแบ่งเครือข่ายให้ทั่ว ทุกอย่างอื่นไม่มีนัยสำคัญเมื่อเทียบกับหน่วยความจำ GPU


1
ขอขอบคุณ. ฉันทำตามคำแนะนำที่คุณให้ไว้ในคำตอบนี้แล้ว คำตอบที่ดี.
WaterRocket8236

5

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

[1] แต่มีเทคนิคบางอย่างที่สามารถช่วยคุณลดขนาดชุดคุณลักษณะวิธีการเช่น PCA (การวิเคราะห์องค์ประกอบหลัก) ช่วยคุณในการเลือกชุดย่อยคุณลักษณะที่สำคัญ

สำหรับการเชื่อมโยงข้อมูลดูรายละเอียดhttp://spark.apache.org/docs/latest/ml-features.html#pca

[2] นอกจากนั้นเพื่อลดค่าใช้จ่ายในการคำนวณในขณะที่ฝึกอบรมโครงข่ายประสาทของคุณคุณสามารถใช้ Stochastic Gradient Descent แทนการใช้วิธีการไล่ระดับสีแบบเดิมซึ่งจะลดขนาดของชุดข้อมูลที่จำเป็นสำหรับการฝึกอบรมในการทำซ้ำแต่ละครั้ง ดังนั้นขนาดชุดข้อมูลของคุณที่จะใช้ในการวนซ้ำครั้งเดียวจะลดลงดังนั้นจะช่วยลดเวลาที่ต้องใช้ในการฝึกอบรมเครือข่าย

ขนาดแบทช์ที่แน่นอนที่จะใช้ขึ้นอยู่กับการกระจายของคุณสำหรับชุดข้อมูลการฝึกอบรมและชุดข้อมูลการทดสอบการใช้งานทั่วไปมากขึ้นคือ 70-30 คุณสามารถใช้วิธี Stochastic ที่กล่าวถึงข้างต้นเพื่อลดเวลาที่ต้องการ

รายละเอียดสำหรับ Stochastic Gradient Descent http://scikit-learn.org/stable/modules/sgd.html

[3] ฮาร์ดแวร์ดูเหมือนจะเหมาะสำหรับการอัปเกรดจะต้องใช้ แต่ถ้าจำเป็นต้องดูโซลูชันคลาวด์เช่น AWS ซึ่งคุณสามารถรับบัญชีสมาชิกฟรีได้ไม่เกินการใช้งาน


ขอบคุณสำหรับคำตอบ อัปเดตคำตอบหากคุณได้รับข้อมูลเพิ่มเติม
WaterRocket8236

ขอบคุณสำหรับลิงก์ใน Stochastic Gradient Descent และยินดีต้อนรับสู่ AI!
DukeZhou

2

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

  1. ขายภาพทั้งหมดของคุณให้มีขนาดเล็กลง คุณสามารถลดขนาดให้เหลือ 112x112 พิกเซล ในกรณีของคุณเนื่องจากคุณมีรูปสี่เหลี่ยมจัตุรัสจึงไม่จำเป็นต้องครอบตัด คุณจะยังไม่สามารถโหลดรูปภาพทั้งหมดเหล่านี้ลงใน RAM ของคุณได้ตามเป้าหมาย

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


3
ทำไมคุณต้องเลือกขนาด 112x112 พิกเซล มันไม่มีประสิทธิภาพของ 2 และไม่ใช่ตัวหาร 2400
Andi R

@AndiR นี่คือสิ่งที่ เมื่อพูดถึงมิติข้อมูลท่านมีอิสระที่จะเลือกขนาดที่เคย นี่เป็นเพราะหากมีความไม่ลงรอยกันของมิติในเครือข่ายสิ่งนี้สามารถแก้ไขได้อย่างง่ายดายโดยใช้การเติมเต็มศูนย์ ดังนั้นจึงไม่มีวิธีการแก้ไขกับขนาดของอินพุต สิ่งที่ต้องระวังคือการทำให้แน่ใจว่าการสุ่มตัวอย่างมากเกินไปไม่ส่งผลกระทบต่อคุณภาพของข้อมูล โปรดดูกระดาษนี้ที่ใช้ประโยชน์จากขนาด 112x112 ( cv-foundation.org/openaccess/content_iccv_2015/papers/… )
rocksyne
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.