Java การฝึกอบรมโครงข่ายประสาท Encog ช้าเกินไป

ฉันกำลังฝึกโครงข่ายประสาทเทียมเพื่อจัดประเภทรูปภาพ และใช้เวลานานเกินไปในการวนซ้ำหนึ่งครั้ง...ประมาณห้านาทีก็ยังไม่เสร็จ ฉันใช้ Encog 3.1 มีอะไรผิดปกติกับรหัสของฉันหรือไม่?

BasicNetwork network = new BasicNetwork();
        network.addLayer(new BasicLayer(null,true,5625));
        network.addLayer(new BasicLayer(new ActivationSigmoid(),true,(intIdealCount+5625)/2));
        network.addLayer(new BasicLayer(new ActivationSigmoid(),true,intIdealCount));
        network.getStructure().finalizeStructure();

นี่คือรหัสการฝึกอบรมของฉัน:

final ResilientPropagation train = new ResilientPropagation(network, trainingSet);

        int epoch = 1;

        do {
            train.iteration();
            System.out.println("Epoch #" + epoch + " Error:" + train.getError());
            epoch++;
        } while(train.getError() > 0.01);

การตอบสนองใด ๆ จะได้รับการชื่นชม ขอบคุณ


person Ray Lionfang    schedule 10.11.2013    source แหล่งที่มา
comment
ฉันไม่คุ้นเคยกับไลบรารีนี้ แต่คุ้นเคยกับการเรียนรู้ของเครื่องและการประยุกต์ใช้กับการสร้างภาพ อาจใช้เวลานาน...   -  person Steve P.    schedule 10.11.2013
comment
สวัสดี ขออภัยสำหรับ OT แต่ฉันเริ่มต้นด้วย encog และมีบางอย่างที่ฉันไม่เข้าใจทั้งหมด ฉันขอเวลาคุณช่วยสักนิดได้ไหม? หากใช่ โปรดตรวจสอบคำถามของฉัน:stackoverflow.com/questions/21847695/ ขอบคุณ   -  person user2886091    schedule 20.02.2014


คำตอบ (1)


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

คุณมีเซลล์ประสาทอินพุตประมาณ 5,000 เซลล์ สมมติว่าคุณมีเซลล์ประสาทเอาท์พุตประมาณ 10 เซลล์ คุณมีเซลล์ที่ซ่อนอยู่ประมาณ 2,500 เซลล์ ดังนั้นเครือข่ายของคุณจึงมีน้ำหนัก (5,000+1)*2500 + (2500+1)*10 (ประมาณ 12,500,000) ตอนนี้ สมมติว่าคุณมีรูปภาพ N รูปในชุดการฝึกของคุณ - หนึ่งยุคต้องมีการคำนวณ (และอัปเดต) ค่า 12,500,000 * N ดังนั้นแม้ว่าคุณจะมีรูปภาพเพียงประมาณ 200 ภาพ แต่ก็มีการอัปเดตให้ประมวลผลถึง 2,500,000,000 รายการ

มีอย่างน้อยสามวิธีที่เป็นไปได้:

  • ลองใช้ไลบรารี FANN ซึ่งเป็นหนึ่งในไลบรารีที่มีประสิทธิภาพมากที่สุด
  • ลดขนาดของภาพของคุณโดยใช้ตัวอย่าง PCA (และผลที่ตามมาคือ - ลดขนาดของเครือข่าย)
  • คุณแน่ใจหรือว่าต้องการโหนดที่ซ่อนอยู่ 2,500 โหนด? มันค่อนข้างมาก
person lejlot    schedule 10.11.2013
comment
คุณแนะนำชั้นที่ซ่อนอยู่กี่ชั้น? ฉันกำลังวินิจฉัยโรคผิวหนังผ่านการจดจำภาพ - person Ray Lionfang; 10.11.2013
comment
ฉันแนะนำให้เล็กที่สุดเท่าที่จะทำได้ จำนวนที่มากขึ้นไม่เพียงแต่หมายถึงการคำนวณที่ยาวนานขึ้นเท่านั้น แต่ยังรวมถึงความเป็นไปได้ที่จะมีการติดตั้งมากเกินไปอีกด้วย เพียงเริ่มต้นด้วยสิ่งเล็กๆ แล้วเพิ่มขนาดหากจำเป็น ไม่ใช่วิธีอื่น - person lejlot; 11.11.2013
comment
ฉันไม่เคยใช้ Encog มาก่อน - แต่นั่นไม่ใช่ภาพรวมทั้งหมด ในขณะที่จำนวนมาก - นั่นเพียง 2.5 GigaFLOPs คอร์ 2 Q6600 (ไม่หรูหรา) สามารถทำได้ 38 GigaFLOPs ต่อวินาที แม้จะสมมติว่าการลงโทษสำหรับ Java ช้ากว่า C/C++ สำหรับทรูพุตดิบ - ก็ควรจะเป็นไปได้ที่จะทำให้เสร็จ 1 ยุคในเวลาที่เหมาะสม - person Raff.Edward; 11.11.2013
comment
ตอนนี้ฉันได้รับอัตราการวนซ้ำที่ดีขึ้น... ประมาณ 3 รอบเป็นเวลาห้านาที... ฉันต้องการถามตอนนี้ว่าจะใช้ค่า raw single-int rgb สำหรับเซลล์ประสาทอินพุตการจดจำรูปภาพเพื่อที่ฉันจะได้ประหยัดพื้นที่หน่วยความจำได้หรือไม่ หรือฉันควรใช้ค่าสีแดง เขียว และน้ำเงินเป็นเซลล์ประสาทสามเซลล์ที่แยกจากกัน - person Ray Lionfang; 11.11.2013
comment
คุณควรใช้แยกกันหรือพิจารณาใช้ค่าเฉดสีเทา อย่าลืมเกี่ยวกับการทำให้ข้อมูลเป็นมาตรฐาน/มาตราส่วนที่ถูกต้องด้วย - person lejlot; 11.11.2013
comment
+1 ให้แฟนน์ นั่นเป็นสิ่งใหม่สำหรับฉัน และดูเหมือนว่าฉันจะสามารถใช้ฟีเจอร์ต่างๆ ของมันได้ ขอบคุณ! - person KathyA.; 26.09.2014