Makine öğrenimi derin öğrenme kuru depo www.jqbxx.com
Generative Adversarial Network (GAN), son yıllarda oldukça popüler hale gelen bir derin öğ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.
1. GAN İlkesine Giriş
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 alanda öncü bir ç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:
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 oluşturulan 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 ilkelerinin kaba bir özetidir, matematiksel dilde nasıl tanımlanır? Makaledeki formülden doğrudan bir alıntı:
Aşağıdaki resim bu süreci iyi açıklamaktadır:
Öyleyse, stokastik gradyan inişini kullanarak D ve G'yi nasıl eğitebilirim? Algoritma ayrıca makalede verilmiştir:
Buradaki kırmızı kutuda daire içine alınan kısım, ekstra dikkat göstermemiz için. İlk adımda, D.'yi eğitiyoruz. D, V (G, D) ne kadar büyükse, o kadar iyi olacağını umuyor, bu nedenle gradyan (artan) ekliyoruz. İkinci adımda G eğitimi alırken, V (G, D) olabildiğince küçük olduğundan gradyan çıkarılır. Tüm eğitim süreci değişiyor. İki, DCGAN ilkesinin tanıtımı
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 Tartışmalı 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 şunları içerir:
DCGAN'daki G ağı şunları gösterir:
Üç, Tensorflow'da DCGAN
Yukarıda bahsedilen bir ilke, aşağıdaki içeriğin bazı ilginç pratik kısmıdır.
DCGAN'ın orijinal yazarı, özellikle ilgi çekici olmayan LSUN yatak odası resimleri oluşturmak için DCGAN'ı kullandı. Daha önce internette anime karakter avatarları oluşturmak için DCGAN kullanan Chainer Automatic Generation-Qiita adlı bir makale görmüştüm. Etkisi aşağıdaki gibidir:
Bu çok ilginç pratik bir içerik. Orijinal metnin Chainer ile yazılmış olması üzücü ve pek çok insan bu çerçeveyi kullanmıyor. Aşağıda bu sonucu Tensorflow'da yeniden oluşturacağız.
1. 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, ağ ortamımda bu web sitesine 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 istekleri
bs4'ten BeautifulSoup içe aktarın
işletim sistemini içe aktar
geri dönüşü içe aktar
def indir (url, dosya adı):
os.path.exists (dosya adı) ise:
print ('dosya var!')
dönüş
Deneyin:
r = request.get (url, stream = True, timeout = 60)
r.raise_for_status ()
f olarak open (dosya adı, 'wb') ile:
r.iter_content içindeki yığın için (chunk_size = 1024):
yığın ise: # canlı tut yeni parçaları filtreleyin
f.write (yığın)
f.flush ()
dosya adını döndür
KeyboardInterrupt hariç:
os.path.exists (dosya adı) ise:
os.remove (dosya adı)
KeyboardInterrupt'ı yükselt
İstisna hariç:
traceback.print_exc ()
os.path.exists (dosya adı) ise:
os.remove (dosya adı)
os.path.exists ('imgs') False ise:
os.makedirs ('imgs')
start = 1
end = 8000
aralıktaki i için (başlangıç, bitiş + 1):
url = 'http: //konachan.net/post? page =% dtags ='% i
html = request.get (url) .text
çorba = BeautifulSoup (html, 'html.parser')
çorba.find_all ('img', sınıf _ = "önizleme") içinde img için:
target_url = 'http:' + img
dosyaadı = os.path.join ('imgs', target_url.split ('/'))
indir (target_url, dosya adı)
baskı ('% d /% d'% (i, bitiş))
Bu 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 veri eğitimi için kullanılamayacağı görülüyor.Eğitim için karakterlerin portrelerini kesmek için uygun araçlar kullanmamız gerekiyor.
2. Avatar müdahalesi
Avatarın engellenmesi, doğrudan github: nagadomi / lbpcascade_animeface'de açıklık tabanlı bir araç kullanılarak orijinaliyle aynıdır.
Kodu sarmalamanız yeterlidir:
cv2 içe aktar
ithalat sys
os.path'i içe aktar
glob import glob'dan
def algılama (dosya adı, cascade_file = "lbpcascade_animeface.xml"):
os.path.isfile (cascade_file) değilse:
RuntimeError hatasını yükselt ("% s: bulunamadı"% cascade_file)
cascade = cv2.CascadeClassifier (cascade_file)
image = cv2.imread (dosya adı)
gray = cv2.cvtColor (resim, cv2.COLOR_BGR2GRAY)
gray = cv2.equalizeHist (gri)
yüzler = cascade.detectMultiScale (gri,
# algılayıcı seçeneği
scaleFactor = 1.1,
minNeighbors = 5,
minSize = (48, 48))
i, (x, y, w, h) için numaralandırmada (yüzler):
yüz = görüntü
yüz = cv2.resize (yüz, (96, 96))
save_filename = '% s-% d.jpg'% (os.path.basename (dosyaadı) .split ('.'), i)
cv2.imwrite ("yüzler /" + kaydet_dosyaadı, yüz)
__name__ == '__ main__' ise:
os.path.exists ('faces') False ise:
os.makedirs ('yüzler')
file_list = glob ('imgs / *. jpg')
dosya_listesindeki dosya adı için:
algıla (dosya adı)
Resmi çektikten sonra karakter verileri:
Bu eğitim için kullanılabilir! Resmi sıfırdan taramak istemiyorsanız, taradığım avatar verilerini doğrudan kullanabilirsiniz (275M, yaklaşık 50.000 resim): https://pan.baidu.com/s/1eSifHcA Çıkarma kodu: g5qa
3. 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ğitebilirsiniz? Model.py'de verileri okumak için birkaç satır kod buluyoruz:
config.dataset == 'mnist' ise:
data_X, data_y = self.load_mnist ()
Başka:
data = glob (os.path.join ("./ data", config.dataset, "* .jpg"))
Bu şekilde veri okuma mantığı çok nettir.Veri klasöründe yeni bir anime klasörü oluşturur, resimleri direkt olarak bu klasöre koyar ve çalıştırırken --dataset anime belirleriz.
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 300 --input_fname_pattern "* .jpg"
4. Sonuçlar
İlk dönemi bitirdi (sadece küçük bir taslak):
5. çağdan sonraki sonuçlar:
10. çağ:
200 çağ, bazı resimlere daha yakından bakmak gerçekten de sahte olmak için yeterli:
Başlık resmi, benim tarafımdan 300. çağdan üretildi.
Dört, özet ve takip
Kısaca GAN ve DCGAN prensiplerini tanıtın. Ve resim oluşturmak için basit bir demo yapmak için Tensorflow'un nasıl kullanılacağı.
Bazı takip okumaları:
Ian Goodfellowun bir dizi GAN çalışma özeti ppt'si gerçekten harika, tavsiye ediliyor: Özel | GAN baba NIPS 2016 konuşması doğrudan canlı: yüzleşme ağları (PPT ile) oluşturma ilkesinin ve geleceğinin kapsamlı bir yorumu, kod: zhangqianhui / AdversarialNetsPapers
Makine öğrenimi derin öğrenme kuru depo www.jqbxx.com