Yazar: HE, Fudan Üniversitesi Uygulamalı Bilgisayar Bilimleri Yüksek Lisansının kaynağı, okuma, yapay zeka ve makine öğreniminin araştırma yönünü.
Generative Adversarial Network (GAN), son yıllarda çok popüler hale gelen derin bir öğrenme modelidir. Son zamanlarda, bu alanda bazı makaleler okudum ve bir GAN kodu çalıştırdım, bu yüzden bu makaleyi GAN'ı tanıtmak için yazdım.
Bu makale esas olarak üç bölüme ayrılmıştır:
Orijinal GAN ilkesini tanıtın
DCGAN ilkesi de çok önemlidir
Başlık resminde gösterildiği gibi bir veri seti eklenmiş olarak anime avatarları oluşturmak için Tensorflow'da DCGAN kodu nasıl çalıştırılır.
GAN'ın okunacak ilk makalesinden bahsetmişken, tabii ki Ian Goodfellow'un Generative Adversarial Networks (arxiv: https://arxiv.org/abs/1406.2661), bu makale bu alandaki öncü çalışma olarak kabul edilebilir.
GAN'ın temel ilkesi aslında çok basittir, işte resim oluşturmanın bir örneği. İki ağımız olduğunu varsayalım, G (Jeneratör) ve D (Ayırıcı). Adından da anlaşılacağı gibi işlevleri şunlardır:
G, resimler üreten bir ağdır, rastgele bir z gürültüsü alır ve G (z) olarak belirtilen bu gürültü aracılığıyla resimler üretir.
D, bir resmin "gerçek" olup olmadığını belirleyen ayırt edici bir ağdır. Giriş parametresi x'tir, x bir resmi temsil eder ve çıktı D (x), x'in gerçek bir resim olma olasılığını temsil eder.1 ise,% 100'ün gerçek bir resim olduğu ve çıkışın 0 olduğu anlamına gelir, bu da gerçek olamayacağı anlamına gelir. resmi.
Eğitim sürecinde, G ağını oluşturmanın amacı, D ağını aldatmak ve ayırt etmek için mümkün olduğunca gerçek resimler oluşturmaktır. D'nin amacı, G'nin oluşturduğu resimleri gerçek resimlerden olabildiğince ayırmaktır. Bu şekilde G ve D dinamik bir "oyun süreci" oluşturur.
Final oyununun sonucu nedir? En ideal durumda, G, "gerçek ve sahte" olan bir G (z) resmi oluşturabilir. D için, G tarafından üretilen resmin gerçek olup olmadığını belirlemek zordur, bu nedenle D (G (z)) = 0.5.
Bu şekilde hedefimize ulaşılır: resimler oluşturmak için kullanılabilecek üretken bir G modeli elde ederiz.
Yukarıdakiler, GAN'ın temel ilkelerine genel bir bakış niteliğindedir. Bunu matematiksel dilde nasıl tanımlayabilirim? Makaledeki formülden doğrudan bir alıntı:
Bu formülü basitçe analiz edin:
Formülün tamamı iki maddeden oluşur. x gerçek resmi temsil eder, z G ağına gürültü girişini temsil eder ve G (z) G ağı tarafından üretilen resmi temsil eder.
D (x), D ağının gerçek resmin gerçek olup olmadığına karar verme olasılığını temsil eder (çünkü x gerçek, dolayısıyla D için, bu değer 1'e ne kadar yakınsa o kadar iyidir). Ve D (G (z)), D ağının G tarafından oluşturulan resmin gerçek olup olmadığına karar verme olasılığıdır.
G'nin Amacı: Yukarıda belirtildiği gibi, D (G (z)), D ağının G tarafından üretilen resmin gerçek olup olmadığına karar verme olasılığıdır ve G, ürettiği resmin "resim ne kadar yakınsa o kadar iyi" olmasını ummalıdır. Başka bir deyişle, G, D (G (z)) 'nin olabildiğince büyük olmasını ister ve V (D, G) bu zamanda küçülecektir. Böylece formülün ön işaretinin min_G olduğunu görüyoruz.
D'nin amacı: D'nin yeteneği ne kadar güçlüyse, D (x) o kadar büyük olmalı ve D (G (x)) küçülmelidir. Şu anda, V (D, G) büyüyecek. Bu nedenle, D'nin formülü maksimize etmektir (maks_D)
Aşağıdaki resim bu süreci iyi açıklamaktadır:
Peki, stokastik gradyan inişini kullanarak D ve G'yi nasıl eğitebilirim? Algoritma ayrıca makalede verilmiştir:
Kırmızı kutu içinde daire içine alınmış kısım, daha fazla dikkat etmemiz gereken şeydir. İlk adımda, D.'yi eğitiyoruz. D, V (G, D) ne kadar büyükse, o kadar iyi olacağını umuyor, bu yüzden gradyan (artan) ekliyoruz. İkinci adımda G eğitimi alırken, V (G, D) mümkün olduğu kadar küçüktür, bu nedenle gradyan çıkarılır. Tüm eğitim süreci değişiyor.
Derin öğrenmede görüntü işleme için en iyi modelin CNN olduğunu biliyoruz, öyleyse CNN ile GAN nasıl birleştirilir? DCGAN, bu konudaki en iyi girişimlerden biridir (kağıt adresi: Derin Evrişimli Üretken Çekişmeli Ağlar ile Denetimsiz Temsil Öğrenimi)
DCGAN'ın prensibi GAN ile aynıdır, bu yüzden burada tekrar etmeyeceğim. Sadece yukarıdaki G ve D'yi iki evrişimli sinir ağıyla (CNN) değiştirir. Ancak doğrudan değiştirmek yeterli değildir. DCGAN, örneğin kalitesini ve yakınsama hızını iyileştirmek için evrişimli sinir ağının yapısında bazı değişiklikler yaptı. Bu değişiklikler şunlardır:
Tüm havuzlama katmanlarını iptal edin. G ağında, üst örnekleme için aktarılmış evrişimli katman, D ağında havuzlama yerine adımla evrişim kullanılır.
Hem D hem de G'de toplu normalleştirme kullanın
FC katmanını kaldırın ve ağı tamamen evrişimli bir ağ yapın
G ağı, aktivasyon işlevi olarak ReLU kullanır ve son katman tanh kullanır
D ağında aktivasyon işlevi olarak LeakyReLU kullanın
DCGAN'daki G ağı şunları gösterir:
Yukarıda bahsedilen bir ilke, aşağıdaki bazı ilginç pratik kısımdır.
DCGAN'ın orijinal yazarı, özellikle ilginç olmayan LSUN yatak odası resimleri oluşturmak için DCGAN'ı kullandı. İnternette anime karakter avatarları oluşturmak için DCGAN kullanan "Chainer Automatic Generation-Qiita" adlı bir makale gördüm. Etkisi şu şekildedir:
Bu çok ilginç pratik bir içerik. Orijinal metnin Chainer ile yapılmış olması üzücü ve pek çok insan bu çerçeveyi kullanmıyor. Bu sonucu Tensorflow'da yeniden oluşturalım.
Orijinal veri setlerinin toplanması
Öncelikle, bir tarayıcı ile çok sayıda animasyon resmini taramamız gerekiyor Orijinal metin bu web sitesinde taranıyor: Bunu denediğimde, bu web sitesine ağ ortamım altında erişemediğimi fark ettim, bu yüzden basit bir tarayıcı yazdım ve başka bir ünlü anime galerisi web sitesini taradım: konachan.net-Konachan.com Anime Duvar Kağıtları.
Tarayıcı kodu aşağıdaki gibidir:
ithalat istekleriBu tarayıcı 120.000 resim tarayarak yaklaşık bir gün koştu, şöyle görünüyor:
Buradaki resimlerin çoğunun oldukça dağınık olduğu ve doğrudan eğitim için veri olarak kullanılamayacağı görülebilir.Eğitim için karakterlerin portrelerini kesmek için uygun araçlar kullanmamız gerekiyor.
Avatar müdahalesi
Avatarın ekran görüntüsü orijinal metinle aynıdır, doğrudan github'da açıklık tabanlı bir araç kullanın: nagadomi / lbpcascade_animeface.
Kodu sarmalamanız yeterlidir:
Resmi çektikten sonra karakter verileri:
Bu eğitim için kullanılabilir!
Resmi sıfırdan taramak istemezseniz, taradığım avatar verilerini (275M, yaklaşık 50.000 resim), Baidu ağ disk adresini doğrudan kullanabilirsiniz: https://pan.baidu.com/s/1eSifHcA, çıkarma kodu: g5qa.
Eğitim
DCGAN'ın Tensorflow'da yapay tekerlekleri var: carpedm20 / DCGAN-tensorflow, bu kodu doğrudan kullanabiliriz.
Ancak, orijinal kodda yalnızca sınırlı sayıda veritabanı sağlanmıştır Kendi verilerinizi nasıl eğitirsiniz? Model.py'de verileri okumak için birkaç satır kod buluyoruz:
config.dataset == 'mnist' ise: data_X, data_y = self.load_mnistBu şekilde veri okuma mantığı çok net, data klasöründe yeni bir anime klasörü oluşturup resimleri direkt olarak bu klasöre koyuyoruz ve çalışırken dataset anime belirliyoruz.
Run komutu (parametre anlamı: oluşturulan resmin boyutunu belirtin 48x48, resmimizin boyutu 96x96, 300 epoch çalıştırın):
python main.py --image_size 96 --output_size 48 --dataset anime --is_crop True --is_train True --epoch 300sonuç
İlk dönemi bitirdi (sadece küçük bir taslak):
5. çağdan sonraki sonuç:
10. çağ:
200 dönem, bazı resimlere yakından bakmak gerçekten de sahte olmak için yeterlidir:
Başlık resmi, benim tarafımdan 300. çağdan üretildi.
Kısaca GAN ve DCGAN prensiplerini tanıtın. Ve resimler oluşturmak için basit bir demo yapmak için Tensorflow'un nasıl kullanılacağı.
Ian Goodfellowun GAN'ın çalışma özeti bölümlerinin özeti gerçekten harika. "Exclusive | GAN's Father NIPS 2016 Speech Live Direct: A Comprehensive Interpretation of the Principles and Future of Generative Adversarial Networks (PPT ile)
Kod dahil olmak üzere GAN belgelerinin bir özeti: https://github.com/zhangqianhui/AdversarialNetsPapers.