Makine öğrenmiyor: GAN, ilkelerin tanıtımından Demo üretimine kadar öğreniyor

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.

  • 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 anime avatarları oluşturmak için Tensorflow'da DCGAN kodu nasıl çalıştırılır ve bir veri kümesi eklenir :-)
  • 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:

    • 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'dir, x bir resmi temsil eder, çıktı D (x) x'in gerçek bir resim olma olasılığını temsil eder, eğer 1 ise,% 100 gerçek bir resim anlamına gelir ve çıktı 0'dır, bu 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 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ı:

    • Bu formülü basitçe analiz edin: tüm formül 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, yani 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:

    Ö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:

    • Tüm havuzlama katmanlarını iptal edin. G ağı, üst örnekleme için aktarılmış evrişimli katman kullanır ve D ağı, havuzlama yerine aşamalı evrişim kullanır. Hem D hem de G'de, parti normalizasyonu, FC katmanını kaldırmak için kullanılır, böylece ağ, tamamen evrişimli bir ağ haline gelir ReLU, G ağında aktivasyon fonksiyonu olarak kullanılır ve son katman, tanhD ağında aktivasyon fonksiyonu olarak LeakyReLU kullanır.

    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

    İ56500 + 1060 orta seviye oyun platformu seçimi! 4848 yuan yapılandırma ekranı
    önceki
    21: 9 oran! Sony Xperia XZ4 açıkta, üçlü arka kamera
    Sonraki
    Makine öğrenmiyor: AlphaZero'nun şifresini çözmek için bir resim (Pytorch uygulamasıyla)
    Baofengyingyin Uygulama güncelleme günlüğü, bu şaka biraz fazla
    Makine öğrenmiyor: öneri sistemlerinde derin öğrenmenin uygulanması
    80PLUS Platinum da insanlara yakın, Jinhetian Z ZP600P-GF güç kaynağını denetler
    Makine öğrenmiyor: Derin öğrenme CNN'ye dayalı kısa metin benzerliği hesaplama şeması
    68.000'e satılan 3D baskılı elektrikli arabalar: sıradan arabalardan 4 kat daha güçlü, sadece 450kg
    Makine öğrenmiyor: derin öğrenmeye dayalı kişiselleştirilmiş ürün incelemesi etiketi çıkarma
    Üreticiler madencilik madenciliğine dayanamaz: grafik kartı madenciliği garanti edilmez!
    Paranızın tam karşılığı olan MSI Z170 Krait GAMING anakartın sınırlı bir zaman artışı var
    Alüminyum levha + cam, istifleme de moda! Jinhetian 21+, V10'un yandan kasa ekranını öngörüyor
    Makineler öğrenmiyor: Yapay zekayı çıplak kızları bikiniyle otomatik olarak "giydirmek" için kullanın ve annem artık benim için endişelenmiyor
    "Tembel insanların" favorisi, Korbel Smart Tek Bardak İçme Makinesi CBK02S'nin kullanım ekranı
    To Top