Nasıl bir yüzleşme ağı GAN oluşturacağınızı öğretin, GAN modeliyle oynamak için 50 satırlık kod (kaynak kodu ile)

Kaynak: AI Youdao

Bu makale hakkında 2820 Word, önerilen okuma 12 dakika.

Bu makale, herkes için Rakip Ağını (GAN) tanıtır, bunu en basit dille açıklar ve nihayet, anlayışınızı derinleştirmenize yardımcı olacak basit bir GAN programı uygular.

GAN nedir?

Peki, GAN çok güçlü, nasıl bir model yapısı? Daha önce öğrendiğimiz makine öğrenimi veya sinir ağı modelleri iki şeyi yapabilir: tahmin ile sınıflandırma , İşte aşina olduğumuz şey bu. Öyleyse makine modeli otomatik olarak bir resim ve bir ses oluşturabilir mi? Farklı modellerin giriş vektörlerini ayarlayarak belirli resimler ve sesler elde edebilirsiniz. Örneğin, kırmızı saçlı ve mavi gözlü bir yüz elde etmek için giriş parametrelerini ayarlayabilir, bir kadın ses klibi elde etmek için giriş parametrelerini vb. Ayarlayabilirsiniz. Başka bir deyişle, böyle bir makine modeli, talebe göre istediğimiz şeyi otomatik olarak üretebilir. Bu nedenle GAN ortaya çıktı!

GAN, yani Generative Adversarial Network, temel olarak iki modülden oluşur:

  • Jeneratör (Üretici Model)
  • Ayrımcı (Ayrımcı Model)

Üretken model ile ayırt edici model arasındaki oyun ve öğrenme oldukça iyi çıktılar üretir. Örnek olarak resim çekerken, jeneratörün ana görevi, ayırt edici kişiyi "aldatmak" için kendi başına oluşturulan resimlerin gerçek resimlere daha yakın olması için bir dizi gerçek resim öğrenmektir. Ayrımcının asıl görevi, jeneratör tarafından oluşturulan resmi bulmak, onu gerçek resimden ayırmak ve doğru ile yanlışı ayırt etmektir. Yinelemeli süreç boyunca, oluşturucu sürekli olarak üretilen resimlerin daha gerçek görünmesi için çabalar ve ayrımcı sürekli olarak resimlerin doğru ve yanlışını belirlemeye çalışır. Bu, oluşturucu ve ayırıcı arasındaki oyuna benzer Tekrarlanan yinelemelerle, ikisi nihayet bir dengeye ulaşır: Oluşturucu tarafından oluşturulan resim gerçek resme çok yakındır ve ayırıcı, doğru ve yanlış resimler arasındaki farkı belirlemekte güçlük çeker. Performans, doğru ve yanlış resimler için, ayırıcının olasılık çıktısının 0,5'e yakın olmasıdır.

Hala GAN kavramı hakkında biraz belirsiz misiniz? Önemli değil, açıklamak için canlı bir örnek verin.

Geçenlerde Van Usta'nın resimlerini gördüğüm ve benzer işler yapmak istediğim için resim okumak istiyorum. Usta Fanın tablosu şuna benzer:

Resimden bahsediyorsanız, sadece resim yapın.Usta Vatikan'ın eserlerini uzun yıllardır inceleyen Profesör Wang'dan bana rehberlik etmesini istedim. Profesör Wang tecrübeli ve keskin gözlü Piyasada Usta Fan'ı taklit eden resimlerden kaçmak zor. Profesör Wang bana dedi ki: Resminiz beni kandırabildiği zaman, başarılı sayılacaksınız.

Çok heyecanlandım ve hemen Profesör Wang için şu resmi çizdim:

Profesör Wang hafifçe baktı, yüzü siyah çizgilerle doluydu ve öfkeyle titredi, "0 puan! Buna resim de deniyor mu? Çok fazla fark var!" Profesör Wang'ın sözlerini dinledikten sonra kendimi düşünmeye başladım ve resmin iyi olmadığı doğruydu. Gözleri ve burnu bile yok. Bu yüzden başka bir resim çizdim:

Profesör Wang bunu görür görmez, 2 saniye içinde dört kelimeyi düşürdü: 1 puan! Yeniden boyayın! Bunu düşündüğümde hala yapamadım. Resim çok kötüydü, bu yüzden Usta Fanın resimlerinin stilini çalışmaya geri döndüm, sürekli geliştirip yeniden yarattım, ta ki bir güne kadar yeni bir resim alıp Profesör Wang'a gösterdim:

Profesör Wang bir baktı ve biraz benzediğini söyledi. Daha yakından bakmalıyım. Son olarak söyle bana, hayır, hayır, detaylar çok kötü! Tekrar boyamaya devam edin. Ne yazık ki, Profesör Wang gittikçe sertleşiyor! İçimi çektim ve çalışmaya devam etmek için geri döndüm ve sonunda Profesör Wang'a takdir için çok memnun olduğum bir resim verdim:

Bu sırada Profesör Wang gözlük taktı ve dikkatlice inceledi.Uzun bir süre sonra, Profesör Wang omzumu okşadı ve "Resim çok iyi ve gerçeği yanlıştan ayıramıyorum" dedi. Haha, Profesör Wang'dan övgü ve onay aldım ve sonunda Usta Fan gibi resimler yaratabildiğim için çok mutlu oldum. Bundan sonra kariyerinizi değiştirmeyi düşünün.

Tamam, bu örneğin sonu (resim yeteneğimle ilgili herkesin şikayetlerini kabul etmek). Bu örnek aslında bir GAN eğitimi sürecidir. Ben jeneratörüm, amaç Profesör Wang'ı kandırabilecek ve doğru ile yanlışı ayırt etmeyi zorlaştıracak bir resim çıkarmak! Profesör Wang ayrımcıdır, amaç resimlerimi tanımlamak ve sahte olduklarını yargılamaktır! Bütün süreç "nesil-yüzleşme" oyun sürecidir.Sonunda, ben (jeneratör) "gerçek ve sahte" bir resim çıkarıyorum, Profesör Wang'ın (ayırt edici) ayırt etmesi bile zor.

Bu GAN, anla.

GAN modelinin temel yapısı

GAN modelini tanımadan önce, Yann LeCunun gelecekteki derin öğrenmede büyük atılımlar hakkındaki kişisel görüşlerine bir göz atalım:

Bence en önemlisi, düşmanca eğitimdir (Generative Adversarial Networks için GAN olarak da adlandırılır) Bu, ilk olarak Ian Goodfellow tarafından, Montreal Üniversitesi'nde Yoshua Bengio ile öğrenciyken önerilen bir fikirdir (o zamandan beri taşındı) Google Brain'e ve son zamanlarda OpenAI'ye).

Bu ve şu anda önerilen varyasyonlar, bana göre ML'de son 10 yılda en ilginç fikir.

Yann LeCun, GAN'ın derin öğrenme modellerine yeni büyük atılımlar getireceğine ve 20 yıl içinde makine öğrenimi alanındaki en havalı fikir olduğuna inanıyor. GAN'ın gelişme ivmesi son yıllarda çok güçlü olmuştur. Aşağıdaki resim, son yıllarda ICASSP konferanslarında sunulan tüm makalelerdeki "üretken", "muhalif" ve "pekiştirme" anahtar kelimelerini içeren makale sayısının istatistiklerini göstermektedir.

Veriler, 2018 yılında, "üretken" ve "muhalif" anahtar kelimelerini içeren makalelerin sayısında büyük bir artış yaşandığını gösteriyor. Önümüzdeki birkaç yıl içinde GAN ile ilgili daha fazla makale olacağını tahmin etmek zor değil.

GAN'ın temel yapısını tanıtalım. GAN'ın her biri G ve D ile temsil edilen jeneratör ve ayırıcıdan oluştuğunu zaten biliyoruz. Örnek olarak görüntü oluşturma uygulamasını ele alalım, model yapısı aşağıdaki gibidir:

GAN'ın temel modeli, giriş Vektörü, G ağı ve D ağından oluşur. Bunların arasında G ve D genellikle sinir ağlarından oluşur. G'nin çıktısı bir resimdir, ancak tamamen bağlantılı bir formdadır. G'nin çıkışı D'nin girdisidir ve D'nin girişi de gerçek örnek setini içerir. Bu şekilde, D, gerçek örnekler için daha yüksek bir puan çıkarmaya çalışır ve G tarafından üretilen örnekler için daha düşük bir puan çıkarmaya çalışır. Döngünün her yinelemesinde, G ağı sürekli olarak ağ parametrelerini optimize eder, böylece D doğru ve yanlış arasında ayrım yapamaz; D ağı ayrıca tanıma derecesini iyileştirmek için ağ parametrelerini sürekli olarak optimize eder, böylece doğru ve yanlış örneklerin puanları farklı olur.

Son olarak, birden fazla eğitim yinelemesinden sonra GAN modeli oluşturulur:

Nihai GAN modelinde, G tarafından oluşturulan örnekler yanlış ve doğrudur ve D'nin puan çıktısı 0,5'e yakındır, bu da doğru ve yanlış örneklerin ayırt edilmesinin zor olduğu ve eğitimin başarılı olduğu anlamına gelir.

Burada odak noktası giriş vektörünü açıklamaktır. Giriş vektörü ne için kullanılır? Aslında, giriş vektöründeki her boyut, çıktı resminin belirli bir özelliğini temsil edebilir. Örneğin, oluşturulan resmin saç rengini ayarlamak için vektörün ilk boyutunun değerini girin, değer ne kadar büyükse, değer o kadar küçük siyah olur; giriş vektörünün ikinci boyutu, oluşturulan resmin ten rengini ayarlayabilir; giriş vektörü Üçüncü boyutun değeri, üretilen resmin duygusunu ayarlayabilir, vb.

GAN'ın gücü tam olarak budur.Giriş vektörünü ayarlayarak, farklı özelliklere sahip resimler üretilebilir. Ve oluşturulan bu resimler gerçek örnek setinde değil, görülmemiş makul resimlerdir. İlginç değil mi? Aşağıdaki resim, farklı vektörlerin farklı resimler oluşturduğunu göstermektedir.

GAN modelinden bahsettikten sonra, GAN algoritması prensibine kısaca bir göz atalım. İki modül olduğu için: G ve D, her modülün ilgili ağ parametreleri vardır.

İlk önce D modülüne bakalım.Amaç, gerçek örnek puanını olabildiğince büyük yapmak ve G tarafından oluşturulan örnek puanını olabildiğince küçük yapmaktır. Daha sonra D'nin kayıp fonksiyonu şu şekilde elde edilebilir:

Bunlar arasında, x gerçek örnektir ve G (z), G tarafından üretilen örnektir. D (x) 'in olabildiğince büyük, D (G (z))' nin olabildiğince küçük olmasını umuyoruz, yani -D (x) mümkün olduğunca küçük ve -log (1-D (G (z))) mümkün olduğunca küçüktür. Daha iyi. Kayıp fonksiyonu perspektifinden, yukarıdaki formül elde edilebilir.

G modülüne tekrar bakıldığında amacı, ürettiği modelin D'de daha yüksek puan alabileceğini, daha iyi olmasını ummaktır. Daha sonra G'nin kayıp fonksiyonu şu şekilde elde edilebilir:

Kayıp işlevini öğrendikten sonra, modeli eğitmek için çeşitli optimizasyon algoritmalarını kullanabilirsiniz.

Bir GAN modeli yazın

Sonra, basit bir GAN modeli uygulamak için PyTorch'u kullanacağım. Hâlâ resim yaratmayı örnek olarak ele alalım, aşağıdaki "ünlü tabloları" yaratmak istediğimizi varsayalım (örnek olarak sinüs şekillerini alın):

"Sanat resmini" oluşturmanın kodu aşağıdaki gibidir:

def artist_works (): # ünlü sanatçıdan resim (gerçek hedef)

r = 0,02 * np.random.randn (1, ART_COMPONENTS)

resimler = np.sin (PAINT_POINTS * np.pi) + r

resimler = torch.from_numpy (resimler) .float ()

resimleri iade etmek

Ardından sırasıyla G ağı ve D ağ modellerini tanımlayın:

G = nn.Sequential (# Oluşturucu

nn.Linear (N_IDEAS, 128), # rastgele fikirler (normal dağılımdan olabilir)

nn.ReLU (),

nn.Linear (128, ART_COMPONENTS), # bu rastgele fikirlerden bir resim yapmak

)

D = nn.Sıralı (# Ayırıcı

nn.Linear (ART_COMPONENTS, 128), # ya ünlü sanatçıdan ya da G gibi bir acemiden sanat eseri alır

nn.ReLU (),

nn.Linear (128; 1),

nn.Sigmoid (), # sanat eserinin sanatçı tarafından yapılmış olma olasılığını söyle

)

Adam algoritmasını aşağıdakileri optimize edecek şekilde ayarladık:

opt_D = torch.optim.Adam (D.parameters (), lr = LR_D)

opt_G = torch.optim.Adam (G.parameters (), lr = LR_G)

Son olarak, GAN'ın yinelemeli eğitim sürecini oluşturun:

plt.ion () # sürekli çizim hakkında bir şeyler

D_loss_history =

G_loss_history =

aralıktaki adım için (10000):

artist_paintings = artist_works () # sanatçıdan gerçek resim

G_ideas = torch.randn (BATCH_SIZE, N_IDEAS) # rastgele fikirler

G_paintings = G (G_ideas) # G'den sahte resim (rastgele fikirler)

prob_artist0 = D (artist_paintings) # D bu probu artırmayı deneyin

prob_artist1 = D (G_paintings) # D bu probu azaltmayı deneyin

D_loss = -torch.mean (torch.log (prob_artist0) + torch.log (1.-prob_artist1))

G_loss = torch.mean (torch.log (1.-prob_artist1))

D_loss_history.append (D_loss)

G_loss_history.append (G_loss)

opt_D.zero_grad ()

D_loss.backward (keep_graph = True) # hesaplama grafiğini yeniden kullanma

opt_D.step ()

opt_G.zero_grad ()

G_loss.backward ()

opt_G.step ()

adım% 50 == 0 ise: # çizim

plt.cla ()

plt.plot (PAINT_POINTS, G_paintings.data.numpy (), c = '# 4AD631', lw = 3, label = 'Oluşturulan boyama',)

plt.plot (PAINT_POINTS, np.sin (PAINT_POINTS * np.pi), c = '# 74BCFF', lw = 3, etiket = 'standart eğri')

plt.text (-1, 0.75, 'D doğruluğu =%. 2f (D'nin yakınsaması için 0.5)'% prob_artist0.data.numpy (). mean (), fontdict = {'size': 8})

plt.text (-1, 0.5, 'D puanı =% .2f (G'nin yakınsaması için -1.38)'% -D_loss.data.numpy (), fontdict = {'size': 8})

plt.ylim ((- 1, 1)); plt.legend (loc = 'alt sağ', fontsize = 10); plt.draw (); plt.pause (0.01)

plt.ioff ()

plt.show ()

GAN modelinin eğitimini her zaman gözlemlemek için dinamik bir çizim yöntemi kullandım.

Yineleme sayısı 1 olduğunda:

Yineleme sayısı 200 olduğunda:

Yineleme sayısı 1000 olduğunda:

Yineleme sayısı 10000 olduğunda:

mükemmel! 10.000 eğitim tekrarından sonra, oluşturulan eğri standart eğriye çok yakındır. D puanı da beklendiği gibi 0.5'e yakın.

Kodun tamamı .py ve .ipynb sürümlerinde mevcuttur ve aşağıdaki bağlantıda arama yapılarak elde edilebilir.

https://github.com/RedstoneWill/MachineLearningInAction/tree/master/GAN

WiFi ana anahtarı Chen Xiaoguang: Çevrimdışı trafik hafife alınır
önceki
Wuhan Altın Sonbahar Alışveriş Karnavalı "çekiliş", bin yuan alışveriş kartı ödülleri 15'inde başlayacak
Sonraki
Dört yıl önce kariyerinin son ikili kırmızı kulübünü tamamladı, ancak sadece 38 saniye oynadı!
Yıllık Keşif: Metal Hidrojen! Asırlık teori nihayet muhteşem gerçeğe dönüşünü tamamladı!
Springside | Bir ayağınız Yeni Yıla giriyor, yaşlı Jinan "endişelenmeyin" dedi unutulmaması gereken bir şey var
Almanya: CIIE aracılığıyla Çin pazarına daha fazla entegrasyon için sabırsızlanıyoruz
Heavy | Hinton, LeCun, Bengio ortak imzalı derin öğrenme incelemesi
Avrupa elemeleri çok üzüldü! Milli futbol takımının 45 sıra altındalar ve Avrupa takımlarını 10 dakikada devirdiler.
Yu Jian | Çin "Bahar Şenliği", aslında sadece yüz yıl geçti
Kuru ürünler Bayesci çıkarıma dayalı sınıflandırma modeli, karşılaşacağınız makine öğrenimi "çukurları"
Hareket kontrolü, gerçek zamanlı çeviri ve fizyolojik veri algılama ... Bu 3000 RMB kulaklığı satın alacak mısınız?
Zidane'nin gözleri sert! Real Madrid generali süper hata yaptı, ceza sahasında beyinsiz operasyon yaparak rakiplerine boş gol yolladı
"Double Eleven" tan sonra üniversite öğrencileri ekspres teslimat için bir araya geliyor
League of Legends takım savaşlarını nasıl yönetiyor? AI, karar vermenize yardımcı olur (kaynaklarla)
To Top