Görüntü oluşturmak için GAN'ı kullanın, bu en iyi yoldur

Leifeng.com'un notu: Bu makalenin orijinal yazarı Tian Yusu, orijinal metin yazarın Zhihu sütununda yer almaktadır-Makineler öğrenmiyor, Leifeng.com yayınlamaya yetkilidir.

Önsöz

Önceki makalemizde, MNIST el yazısıyla yazılmış resimler oluşturmak için basit bir GAN'ın nasıl oluşturulacağını öğrendik. Görüntü problemleri için, evrişimli sinir ağları, tamamen bağlı sinir ağlarından daha fazla avantaja sahiptir. Bu nedenle, bu bölümde GAN'ın derinliklerine inmeye ve evrişimli sinir ağlarını birleştirerek GAN'ımızı iyileştirmeye devam edeceğiz. Derin evrişim GAN. GAN'ı kendiniz uygulamadıysanız, önceki sütunu inceleyebilirsiniz: Generative Adversarial Network'ün (GAN) MNIST veri üretimi.

Sütundaki tüm kodlar GitHub'ımdadır, star and fork'a hoş geldiniz.

Bu sefer kod, iki dosya içeren NELSONZHAO / zhihu / dcgan'da:

  • dcgan_mnist: MNIST el yazısı veri kümesine dayalı derin bir evrişimli GAN modeli oluşturun

  • dcgan_cifar: CIFAR veri kümesine dayalı derin bir evrişimli GAN modeli oluşturun

Bu makale esas olarak MNIST'i tanıtmak için örnek olarak alır, ikisi arasında özünde bir fark yoktur, sadece küçük parametreler ayarlanır. Yoksul öğrencilerin sınırlı kaynakları nedeniyle, modele yapılan yinelemelerin sayısında artış olmadı ve daha derin bir model inşa edilmedi. Ve çok yüksek pikselli hiçbir görüntü seçilmez, bu da çok fazla hesaplama gerektirir. Bu bölüm, herkesin DCGAN'ın yapısını anlamasını sağlamak için sadece bir giriş niteliğindedir.Eğer kaynaklara sahip arkadaşlar daha net resimler ve daha derin yapıları kendi kendilerine deneyebilirlerse, çok iyi sonuçlar alacaklarına inanıyorum.

araç

  • Python3

  • TensorFlow 1.0

  • Jupyter not defteri

Metin

Tüm vücut bölümü aşağıdaki bölümleri içerecektir:

-Veri yükleme

-Model girişi

-Jeneratör

-Ayrıcı

-Kayıp

-Optimizer

-Eğitim modeli

-Görselleştirme

Veri yükleme

Veri yükleme bölümü, yüklemek için TensorFlow'daki input_data arayüzünü kullanır. Yükleme detayları bir önceki yazıda defalarca yazılmıştı, makalemi okuyan arkadaşların da MNIST yüklemesine çok aşina olduğuna inanıyorum, bu yüzden burada tekrar etmeyeceğim.

Model girişi

GAN'da girişimiz iki bölümden oluşur; biri gerçek bir resimdir ve ayrımcıya doğrudan girilerek bir ayrım sonucu elde edilir; diğeri ise resmin malzemesini oluşturmak için jeneratör olarak kullanılacak rastgele gürültüdür ve jeneratör daha sonra resmi oluşturur. Ayrımcılık sonucu almak için bunu ayrımcıya iletin.

Yukarıdaki işlev, giriş görüntüsü ve gürültü görüntüsünün iki tensörünü tanımlar.

Jeneratör

Jeneratör bir gürültü sinyali alır, sinyale göre bir resim oluşturur ve bunu ayırıcıya girer. Bir önceki sütunda, Generative Adversarial Network (GAN) MNIST veri üretimi, jeneratörümüz tamamen bağlı bir katmana sahip bir sinir ağıdır ve bu bölümde jeneratörü daha fazlasını yapmak için evrişimli bir yapı içeren bir ağa dönüştüreceğiz. Resim girişini işlemek için uygundur. Tüm jeneratör yapısı aşağıdaki gibidir:

Gürültülü görüntümüzü giriş görüntüsü ile aynı şekle sahip oluşturulmuş bir görüntüye dönüştürmek için aktarılmış evrişim kullanıyoruz. Spesifik uygulama koduna bir göz atalım:

Yukarıdaki kod, bazı hileler içeren tüm jeneratörün uygulama detaylarıdır, adım adım göz atalım.

İlk olarak, giriş gürültü görüntüsünü tamamen bağlı bir katman aracılığıyla 1 x 4 * 4 * 512 yapısına dönüştürdük ve sonra onu bir şekle yeniden şekillendirdik Şimdiye kadar dönüşümün ilk adımını gerçekten tamamladık. Daha sonra, yakınsamayı hızlandırmak ve evrişimli sinir ağlarının performansını iyileştirmek için çok etkili bir yöntem kullandık - BN (toplu normalleştirme) ekledik, fikri mevcut katman girişini normalize etmektir, böylece ortalama değeri 0 ve varyans 1. Ağ girişini normalleştirme şeklimize benzer. Avantajı, yakınsamayı hızlandırabilmesidir ve BN ile eklenen evrişimli sinir ağı ağırlık başlangıcından çok az etkilenir, çok iyi kararlılığa sahiptir ve evrişim performansını iyileştirmede iyi bir etkiye sahiptir. Toplu normalizasyon hakkında, aşağıdaki sütunda ayrıntılı bir giriş yapacağım.

BN'yi tamamladıktan sonra aktivasyon fonksiyonu olarak Leaky ReLU kullanıyoruz.Bu fonksiyondan bir önceki sütunda bahsetmiştik, bu yüzden burada tekrar etmeyeceğim. Son olarak bırakma düzenlemesini ekleyin. Yer değiştirmiş evrişim yapı katmanının geri kalanı benzerdir, ancak son katmanda BN kullanmıyoruz ve üretilen görüntüyü çıkarmak için doğrudan tanh aktivasyon işlevini kullanıyoruz.

Yukarıdaki aktarılmış evrişimde, birçok küçük ortak, her katmanın boyutundaki değişiklik konusunda kesinlikle kafaları karışacaktır.Burada, TensorFlow'daki her bir özellik haritası katmanının boyutunun nasıl hesaplanacağından bahsedelim. Her şeyden önce, evrişimli sinir ağında, mxmxd görüntüsünü sarmak için bir kxk filtresi kullanırsak, adımlar s'dir.TensorFlow'da, padding = 'aynı' olarak ayarladığımızda, evrişimden sonraki her özellik Haritanın yüksekliği ve genişliği

; Padding = 'valid' ayarlandığında, her özellik haritasının yüksekliği ve genişliği

. Öyleyse öte yandan, 7 x 7 şeklini 14 x 14 olarak değiştirmek gibi bir transpoze evrişim işlemi gerçekleştirmek istiyorsak, bu durumda, filtre boyutuyla aynı olmayan padding = 'same', strides = 2 ayarlayabiliriz. İlişki; ve 4 x 4, 7 x 7 olarak değiştirilirse, dolgu = 'geçerli' ayarlandığında, yani

, Şu anda s = 1, k = 4 hedefimize ulaşmak için.

Yukarıdaki kodda, her adımda şekil değişikliğini de işaretledim.

Ayrımcı

Discriminator bir resim alır ve bir ayrım sonucu (olasılık) verir. Aslında, Discriminator, evrişimli sinir ağları içeren görüntüler için iki sınıflı bir sınıflandırıcı olarak görülebilir. Yapı aşağıdaki gibidir:

Uygulama kodu aşağıdaki gibidir:

Yukarıdaki kod aslında basit bir evrişimli sinir ağı görüntü tanıma problemidir ve sonunda logitleri (kaybı hesaplamak için kullanılır) ve çıktıları döndürür. Havuz katmanının buraya eklenmemesinin nedeni, görüntünün kendisinin çok katmanlı evrişimden sonra zaten çok küçük olması ve eğitimi hızlandırmak için toplu normalleştirme ekledik ve eğitimi hızlandırmak için özellik çıkarımı için maksimum havuzlamaya gerek kalmamasıdır.

Kayıp İşlevi

Kayıp bölümü, Jeneratörün kaybını ve Ayırıcı'nın kaybını ayrı ayrı hesaplar Daha önce olduğu gibi, aşırı oturmayı önlemek ve genelleme yeteneğini geliştirmek için etiket yumuşatma ekliyoruz.

Optimizer

GAN aslında iki sinir ağı içerir, bu nedenle bu iki sinir ağının ayrı ayrı optimize edilmesi gerekir. kod aşağıdaki gibi gösterilir:

Buradaki Optimizer daha önce bizimkinden farklıdır TensorFlow'da toplu normalleştirme işlevini kullandığımız için, bu işlevde dikkat edilmesi gereken birçok püf noktası vardır. Öncelikle eğitim aşamasında ve eğitim dışı aşamada toplu normalizasyon hesaplama yönteminin farklı olduğunu bilmemiz gerekir, bu nedenle toplu normalleştirme kullanma sürecinde eğitim parametresini belirtmemiz gerekir. Tf.control_dependencies öğesinin yukarıdaki kullanımı, hareketli ortalamaların eğitim aşamasında her zaman güncellenebilmesini sağlamak içindir. Ayrıntılar için lütfen Tensorflow-Rui Shu'da Toplu Normalleştirmeyi Kullanmaya Yönelik Kısa Bir Kılavuz'a bakın.

Eğitim

Şimdiye kadar, derin evrişimli GAN'ın yapımını tamamladık ve sonra GAN'ımızı eğitebilir ve yinelemenin sonuçlarını görselleştirmek için bazı yardımcı fonksiyonlar tanımlayabiliriz. Kod koymak için çok uzun, indirmek için doğrudan GitHub'ıma gidebilirsiniz.

Burada sadece 5 tur dönem ayarlıyorum ve sonuçları her 100 partide basıyorum ve her satır aynı çağdaki 25 resmi temsil ediyor:

El yazısıyla yazılmış çok net sayıların yalnızca birkaç yinelemeden sonra üretildiğini ve eğitim hızının çok hızlı olduğunu görebiliyoruz.

Yukarıdaki şekil, son birkaç yinelemenin sonucudur. Bir önceki makalede basit, tamamen bağlı bir GAN katmanını inceleyebiliriz, yakınsama hızı açıkça derin evrişimli GAN kadar iyi değildir.

sonuç olarak

Şimdiye kadar, derin bir evrişimli GAN öğrendik ve derin evrişimli GAN'ın performansının önceki basit GAN'dan daha iyi olduğunu gördük. Tabii ki MNST veri setine ek olarak arkadaşlar daha önce kullandığımız CIFAR veri seti gibi birçok başka resmi de deneyebilirler, burada bir CIFAR veri seti görüntü oluşturma uyguladım, sadece atların resimlerini seçtim Trene:

İlk antrenman sırasında:

50 çağ eğitin:

Burada sadece 50 yineleme belirledim ve sonunda derin evrişimli GAN'ın avantajlarını gösteren çok bariz bir at görüntüsünün oluşturulduğunu görebilirsiniz.

GitHub'ım: NELSONZHAO (Nelson Zhao)

Yukarıdakiler sütunumdaki tüm kod uygulamalarını, karşılama yıldızı, karşılama çatalı içerir.

Aynısı fantezi büyüsü, yerel olarak üretilen Batı filmleri kadar iyi değil mi?
önceki
Bose Sleepbuds beyaz gürültüsünün sırlarını keşfedin
Sonraki
Yerli ürünler kendi kendine yetmeli, yerel CPU performansı i3 işlemciye yakın, Intel i5 ile aynı seviyede
Xiaomi'nin son çılgınlığı: MIX2'ler ve Mi 8, fiyatlarını her ikisi de amiral gemisi olarak 2.000 yuan'a düşürdü, kimi seçersiniz?
Wu Jing, Londra'da koltuk değnekleriyle ödülü kazandıktan sonra Çin'e döndü ve Yu Nan, karısı Xie Nan kıskandı.
Sıra Eksikliği MIMO Sisteminde Kullanılan Küre Kod Çözücü Araştırması
Tüm yönetmenler SIGGRAPH2017'de, VR animasyonunun içinden geçtiği "çukurlar" olan "Tucao" ya toplandı
49. Hafta | "Dream Travels" 800 milyon gişeyi aştı, "Fang Hua" ilk ona girmedi
Güzel bir kız tarafından dürtmek ister misin? Ajans "Poke VR" ı ücretsiz olarak başlatıyor
Snapdragon 660 + 48MP ana kamera, 999 fiyatına sahip Redmi Note7, başarıdan yalnızca "satın alabilirsiniz"!
Apple nihayet dayanamıyor mu? IPhone yerel kanalları, fiyatları 450 yuan'a kadar düşürdü
"The Shape of Water" için yedi adaylık önde gelen Altın Küre Ödülleri için adaylar
Wenli resminde farklı bir kış manzarasının tadını çıkarın!
CES2019: Lenovo'nun kurtarıcısı Y9000K, RTX 20 serisi grafik kartı oyunuyla tanıtıldı
To Top