คู่มือฉบับสมบูรณ์สำหรับการสร้าง Generative Adversarial Network (GAN) เพื่อสร้างตัวละครอนิเมะของคุณเองด้วย Keras
ในโพสต์นี้ เราจะเรียนรู้เกี่ยวกับการพัฒนาเครือข่ายปฏิปักษ์เชิงสร้างสรรค์ (GAN) เพื่อสร้างตัวละครมังงะหรืออนิเมะที่สมจริง
ฉันประหลาดใจกับแอนิเมชั่นที่สดใสมาโดยตลอด โดยเฉพาะมังงะที่มีรูปลักษณ์และลายเส้นที่โดดเด่น คงจะดีไม่น้อยหากสามารถวาดภาพตัวเองสักสองสามภาพ และสัมผัสประสบการณ์ความตื่นเต้นในการสร้างมันขึ้นมาด้วยความช่วยเหลือของโครงข่ายประสาทเทียมที่พัฒนาขึ้นเอง!
แล้วอะไรทำให้ GAN แตกต่าง?
วิธีที่ดีที่สุดในการฝึกฝนทักษะคือการฝึกฝนและด้นสดจนกว่าคุณจะพอใจกับตัวเองและความพยายามของคุณ สำหรับเครื่องจักรหรือโครงข่ายประสาทเทียม ผลลัพธ์ที่ดีที่สุดที่สามารถสร้างได้คือผลลัพธ์ที่ตรงกับเอาต์พุตที่มนุษย์สร้างขึ้น หรือแม้แต่หลอกให้มนุษย์เชื่อว่ามนุษย์จริงๆ แล้วสร้างเอาต์พุตดังกล่าว นั่นคือสิ่งที่ GAN ทำ อย่างน้อยก็เป็นรูปเป็นร่าง ;)
เมื่อเร็ว ๆ นี้ เครือข่ายปฏิปักษ์ทั่วไปเป็นประเด็นร้อนในการเรียนรู้เชิงลึก เปิดตัวโดย Ian Goodfellow และคณะ พวกเขามีความสามารถในการสร้างผลลัพธ์ตั้งแต่เริ่มต้น
ภาพรวมโดยย่อของเครือข่ายปฏิปักษ์ทั่วไป
ในเครือข่ายปฏิปักษ์โดยกำเนิด สองเครือข่ายจะฝึกฝนและแข่งขันกันเอง ส่งผลให้เกิดการแสดงด้นสดร่วมกัน ตัวสร้างทำให้ผู้เลือกปฏิบัติเข้าใจผิดโดย สร้างอินพุตปลอมที่น่าสนใจและพยายามหลอกผู้เลือกปฏิบัติให้คิดว่าสิ่งเหล่านี้เป็นอินพุตจริง ผู้แยกแยะจะบอกว่าอินพุตนั้นเป็นของจริงหรือของปลอม
มี 3 ขั้นตอนหลักในการฝึกอบรม GAN:
- การใช้ตัวสร้างเพื่อสร้างอินพุตปลอมตามสัญญาณรบกวนแบบสุ่ม หรือในกรณีของเราคือสัญญาณรบกวนปกติแบบสุ่ม
- ฝึกอบรมผู้เลือกปฏิบัติด้วยอินพุตทั้งของจริงและของปลอม (พร้อมกันโดยการเชื่อมอินพุตของจริงและของปลอมเข้าด้วยกัน หรือเชื่อมต่อกันระหว่างอินพุตจริงและของปลอม)
- ฝึกโมเดลทั้งหมด:โมเดลถูกสร้างขึ้นโดยใช้เครื่องแยกแยะรวมกับเครื่องกำเนิดไฟฟ้า
จุดสำคัญที่ควรทราบคือน้ำหนักของผู้เลือกปฏิบัติจะถูกแช่แข็งในระหว่างขั้นตอนสุดท้าย
เหตุผลในการรวมทั้งสองเครือข่ายเข้าด้วยกันคือไม่มีการตอบกลับเกี่ยวกับเอาต์พุตของเครื่องกำเนิดไฟฟ้า แนวทางเดียวคือหากผู้เลือกปฏิบัติยอมรับเอาต์พุตของเครื่องกำเนิด
คุณสามารถพูดได้ว่าพวกเขาเป็นคู่แข่งกันซึ่งถูกกำหนดมาให้กันและกัน ตัวละครหลักคือผู้สร้างที่มุ่งมั่นที่จะดีขึ้นเรื่อยๆ เพื่อทำให้เป้าหมายของเราเป็นจริงโดยการเรียนรู้จากการต่อสู้กับคู่แข่ง ผู้เลือกปฏิบัติ
นั่นเป็นภาพรวมโดยย่อของสถาปัตยกรรมของ GAN หากยังไม่เพียงพอ คุณสามารถดู "คำแนะนำโดยละเอียด" นี้
การเรียนรู้เชิงลึก — สำหรับผู้เชี่ยวชาญ โดยผู้เชี่ยวชาญ เราใช้ประสบการณ์หลายทศวรรษในการส่งมอบ "แหล่งข้อมูลการเรียนรู้เชิงลึกที่ดีที่สุดไปยังกล่องจดหมายของคุณในแต่ละสัปดาห์"
GAN ของเรา
สำหรับงานปัจจุบัน เราใช้ DCGAN (เครือข่ายฝ่ายตรงข้ามที่สร้างเชิงลึกแบบ Convolutional)
แนวทางปฏิบัติบางประการสำหรับ DCGAN:
- แทนที่การรวมกลุ่มสูงสุดทั้งหมดด้วยก้าวก้าวแบบหมุนวน
- ใช้การสลับแบบสลับสำหรับการสุ่มตัวอย่าง
- กำจัดเลเยอร์ที่เชื่อมต่อกันอย่างสมบูรณ์
- ใช้การทำให้เป็นมาตรฐานแบบแบตช์ ยกเว้นเลเยอร์เอาต์พุตสำหรับตัวสร้างและเลเยอร์อินพุตของตัวแยกแยะ
- ใช้ ReLU ในตัวสร้าง ยกเว้นเอาต์พุตซึ่งใช้ tanh
- ใช้ LeakyReLU ในตัวแยกแยะ
รายละเอียดการตั้งค่า
- เวอร์ชัน Keras==2.2.4
- เทนเซอร์โฟลว์==1.8.0
- สมุดบันทึกจูปีเตอร์
- Matplotlib และไลบรารียูทิลิตี้อื่น ๆ เช่น NumPy, Pandas
- หลาม==3.5.7
ชุดข้อมูล
ชุดข้อมูลสำหรับใบหน้าอนิเมะสามารถสร้างขึ้นได้โดยการม้วนงอผ่านเว็บไซต์มังงะต่างๆ และดาวน์โหลดภาพ ครอบตัดใบหน้าออก และปรับขนาดให้เป็นขนาดมาตรฐาน รับด้านล่างเป็นลิงค์สำหรับรหัส A Python ที่แสดงให้เห็นสิ่งเดียวกัน:
ฉันโชคดีที่พบชุดข้อมูลที่ประมวลผลล่วงหน้า (ครอบตัดใบหน้า) จากไซต์ต่อไปนี้:
ภาพรวมของชุดข้อมูล-
นางแบบ
ตอนนี้เรามาดูสถาปัตยกรรมของโครงข่ายประสาทเทียมของเรากันดีกว่า! อย่าลืมประเด็นที่เราพูดคุยกันก่อนหน้านี้เกี่ยวกับ DCGAN
การใช้งาน GAN นี้ใช้เลเยอร์ deconv ใน Keras ฉันได้ลองใช้เลเยอร์ต่างๆ รวมกัน เช่น:
- Conv + การสุ่มตัวอย่าง
- Conv + ไบลิเนียร์
- Conv + การลดขนาดพิกเซลย่อย
หมายเหตุ: คุณสามารถอ้างถึง พื้นที่เก็บข้อมูลของฉัน สำหรับโค้ดที่สมบูรณ์
เครื่องกำเนิดไฟฟ้า
เครื่องกำเนิดไฟฟ้าประกอบด้วยชั้นขนย้ายแบบหมุนวน ตามด้วยการทำให้เป็นมาตรฐานแบบแบทช์ และฟังก์ชันการเปิดใช้งาน ReLU ที่รั่วสำหรับการอัปแซมปลิง เราจะใช้พารามิเตอร์ก้าวในเลเยอร์การบิด ทำเช่นนี้เพื่อหลีกเลี่ยงการฝึกที่ไม่มั่นคง Leaky ReLUs เป็นความพยายามอย่างหนึ่งในการแก้ไขปัญหา "ReLU ที่กำลังจะตาย" แทนที่จะให้ฟังก์ชันเป็นศูนย์เมื่อ x ‹ 0 ReLU ที่รั่วจะมีความชันเป็นลบเล็กน้อยแทน (เท่ากับ 0.01 หรือมากกว่านั้น)
รหัส
ผู้เลือกปฏิบัติ
ตัวแยกแยะยังประกอบด้วยเลเยอร์การบิดซึ่งเราใช้ความก้าวหน้าในการสุ่มตัวอย่างและการทำให้เป็นมาตรฐานแบบแบทช์เพื่อความเสถียร
รหัส
GAN ที่คอมไพล์แล้ว
ในการดำเนินการ back propagation สำหรับเครื่องกำเนิดไฟฟ้า เพื่อที่จะตรวจสอบเอาท์พุตของมัน เรารวบรวมเครือข่ายใน Keras—เครื่องกำเนิดตามด้วย discriminator
ในเครือข่ายนี้ อินพุตจะเป็นสัญญาณรบกวนแบบสุ่มสำหรับเครื่องกำเนิดไฟฟ้า และเอาต์พุตจะเป็นเอาต์พุตของเครื่องกำเนิดไฟฟ้าที่ป้อนให้กับเครื่องแบ่งแยก ซึ่งจะทำให้น้ำหนักของผู้เลือกปฏิบัติถูกแช่แข็งเพื่อหลีกเลี่ยง การล่มสลายของฝ่ายตรงข้าม.ฟังดูเท่ใช่ไหมล่ะ? "ค้นดูสิ!"
รหัส
การฝึกอบรมโมเดล
การกำหนดค่าพื้นฐานของโมเดล
- สร้างสัญญาณรบกวนปกติแบบสุ่มสำหรับอินพุต
2. เชื่อมต่อข้อมูลจริงที่สุ่มตัวอย่างจากชุดข้อมูลเข้ากับสัญญาณรบกวนที่สร้างขึ้น
3. เพิ่มเสียงรบกวนให้กับป้ายกำกับอินพุต
4. ฝึกอบรมเฉพาะเครื่องกำเนิดไฟฟ้าเท่านั้น
5. ฝึกอบรมเฉพาะผู้เลือกปฏิบัติ
6. ฝึกอบรม GAN แบบรวม
7. การบันทึกอินสแตนซ์ของเครื่องกำเนิดและเครื่องแยกแยะ
ฉันฝึกโค้ดนี้กับ Acer-Predator helios 300 ซึ่งใช้เวลาเกือบครึ่งชั่วโมงสำหรับ 10,000 ขั้นตอนและรูปภาพประมาณ 32,000 ภาพ ด้วย GPU Nvidia GTX GeForce 1050Ti
ผลลัพธ์ของ Manga-Generator
หลังจากฝึกครบ 10,000 ก้าว ผลลัพธ์ที่ได้ก็ดูเจ๋งและน่าพึงพอใจ ลองดูสิ!
ในแง่ของการปรับปรุงโมเดล ฉันคิดว่าการฝึกเป็นระยะเวลานานขึ้นและชุดข้อมูลที่ใหญ่ขึ้นจะช่วยปรับปรุงผลลัพธ์ให้ดียิ่งขึ้น (ใบหน้าบางหน้าก็น่ากลัวแปลกๆ! ไม่ใช่ Manga ทั่วไป ฉันต้องบอกว่า :D)
บทสรุป
งานสร้างใบหน้าสไตล์มังงะนั้นน่าสนใจอย่างแน่นอน
แต่ยังเหลือพื้นที่อีกเล็กน้อยสำหรับการปรับปรุงด้วยการฝึกอบรม แบบจำลอง และชุดข้อมูลที่ดีขึ้น แบบจำลองของเราไม่สามารถทำให้มนุษย์สงสัยว่าใบหน้าเหล่านี้ที่สร้างขึ้นนั้นเป็นของปลอมหรือไม่ ถึงกระนั้นก็ตาม มันก็ทำงานได้ดีมากในการสร้างภาพสไตล์มังงะ ลองใช้ท่ามังงะแบบเต็มๆ ได้เลย
พื้นที่เก็บข้อมูล
นี่คือลิงค์ไปยังที่เก็บ GitHub ของฉัน คุณสามารถดู โคลน หรือด้นสดได้ตามใจชอบ ยินดีรับข้อเสนอแนะและคำวิจารณ์ทุกประเภท กรุณาโหวตถ้าคุณชอบเนื้อหาและการนำไปใช้
แหล่งที่มา
- https://towardsdatascience.com/generate-anime-style-face-using-dcgan-and-explore-its-latent-feature-representation-ae0e905f3974
- https://github.com/pavitrakumar78/Anime-Face-GAN-Keras
- https://medium.com/@jonathan_hui/gan-dcgan-deep-convolutional-generative-adversarial-networks-df855c438f
ฉันหวังว่าคุณจะสนุกกับบทความแรกของฉันเกี่ยวกับเครือข่ายปฏิปักษ์เชิงสร้างสรรค์สำหรับการสร้างหน้ามังงะ! อย่าลืมกดโหวตและปุ่มติดตาม!
หมายเหตุสำหรับบรรณาธิการ: Heartbeat เป็นสิ่งพิมพ์ออนไลน์และชุมชนที่ขับเคลื่อนโดยผู้ร่วมให้ข้อมูล ซึ่งอุทิศตนเพื่อจัดหาทรัพยากรทางการศึกษาชั้นนำสำหรับวิทยาการข้อมูล การเรียนรู้ของเครื่อง และผู้ปฏิบัติงานด้านการเรียนรู้เชิงลึก เรามุ่งมั่นที่จะสนับสนุนและสร้างแรงบันดาลใจให้กับนักพัฒนาและวิศวกรจากทุกสาขาอาชีพ
Heartbeat เป็นอิสระด้านบรรณาธิการ สนับสนุนและเผยแพร่โดย Comet ซึ่งเป็นแพลตฟอร์ม MLOps ที่ช่วยให้นักวิทยาศาสตร์ข้อมูลและทีม ML สามารถติดตาม เปรียบเทียบ อธิบาย และเพิ่มประสิทธิภาพการทดลองของพวกเขา เราจ่ายเงินให้กับผู้ร่วมให้ข้อมูล และเราไม่ขายโฆษณา
หากคุณต้องการมีส่วนร่วม ตรงไปที่ เรียกผู้ร่วมให้ข้อมูล ของเรา คุณยังสามารถลงทะเบียนเพื่อรับจดหมายข่าวรายสัปดาห์ของเรา ("Deep Learning Weekly" และ "Comet Newsletter") เข้าร่วมกับเราที่ « ""Slack" และติดตาม Comet บน "Twitter" และ "LinkedIn" เพื่อดูแหล่งข้อมูล กิจกรรม และ อีกมากมายที่จะช่วยให้คุณสร้างโมเดล ML ที่ดีขึ้น เร็วขึ้น