"Pratik" Görüntü parazitini azaltmak için evrişimli otomatik kodlayıcı kullanın (açık kaynak kodu)

1Xinzhiyuan önerilir

Önsöz

Bu hafta işte çok meşguldüm. Başlangıçta Dikkat ekini yazmak istedim, ama zaman ayıramadım, bu yüzden zamanım olduğunda daha sonra yazacağım. Bu hafta basit bir gerçek otomatik kodlayıcı koduna bir göz atalım. Otomatik kodlayıcı teorisini ayrıntılı olarak tanıtmayacağım. İnternette çok araştırma yaptım. En basit kendi kendine kodlayıcı, girişi bir kodlayıcı ve kod çözücü aracılığıyla yeniden oluşturmaktır.Örneğin, bir ağa bir resim giriyoruz ve kendi kendini kodlayıcının kodlayıcısı sıkıştırılmış bilgileri almak için resmi sıkıştırıyor ve ardından kod çözücü Bu bilginin kodu, orijinal görüntüyü yeniden oluşturmak için çözülür.

Çizim aracı: OmniGraffle

Kendi kendine kodlayıcı aslında hedef ve girdi arasındaki farkı en aza indirerek, yani çıktı katmanının orijinal bilgileri olabildiğince yeniden üretmesine izin vererek optimize edilir. Otomatik kodlayıcının temel biçimi nispeten basit olduğu için, bunun DAE, SDAE, VAE vb. Dahil birçok çeşidi vardır. İlgileniyorsanız, İnternette diğer ilgili bilgileri arayabilirsiniz.

Bu makale iki demo uygulayacaktır: İlk bölüm basit bir giriş-gizli-çıkış bağlantı otomatik kodlayıcı uygulamaktır ve ikinci kısım, görüntü gürültüsünü azaltmak için birinci kısım temelinde bir evrişimli otomatik kodlayıcı uygulayacaktır.

Araç açıklaması

  • TensorFlow1.0

  • jupyter defter

  • Veri: MNIST el yazısı veri seti

  • Tam kod adresi: NELSONZHAO / zhihu

ilk kısım

İlk olarak, yukarıda gösterilen yapı ile en basit AutoEncoder'ı uygulayacağız.

Verileri İndir

Burada, deneyler için MNIST el yazısı veri setini kullanıyoruz. Her şeyden önce, verileri içe aktarmamız gerekiyor.TensorFlow bu deneysel veri kümesini zaten kapsülledi, bu nedenle kullanımı çok basit.

Verilerin gri tonlamalı görüntüleri göstermesini istiyorsanız, plt.imshow (img.reshape ((28,28)), cmap = 'Greys_r') kodunu kullanın.

Veri setimizi input_data aracılığıyla yükleyebiliriz. Küçük ortak zaten yerel olarak MNIST veri kümesine (dört sıkıştırılmış paket) sahipse, bu dört sıkıştırılmış paketi MNIST_data dizini altına koyabilirsiniz, böylece TensorFlow verileri tekrar indirmeden doğrudan çıkarır. Imshow aracılığıyla bir görüntüyü istediğimiz zaman görebiliriz. Yüklediğimiz veriler 784 boyutlu bir vektöre işlendiğinden, yeniden görüntülenirken yeniden şekillendirilmesi gerekiyor.

Model oluştur

Verileri yükledikten sonra en basit modellemeyi gerçekleştirebiliriz. Bundan önce, önce girdi verisinin boyutunu alalım.Yüklediğimiz görüntü 28x28 piksellik bir blok ve TensorFlow bunu bizim için 784 boyutlu bir vektör haline getirdi. Aynı zamanda gizli katmanın boyutunu da belirlememiz gerekiyor.

Burada 64 belirledim. Hidden_units ne kadar küçükse o kadar fazla bilgi kaybedilir.Arkadaş sonuçları görmek için başka boyutları da deneyebilirler.

AutoEncoder üç katman içerir: giriş, gizli ve çıktı:

Gizli katmanda, aktivasyon işlevi olarak ReLU kullanıyoruz.

Bu noktada, basit bir AutoEncoder oluşturulur ve ardından eğitim için TensorFlow grafiğini başlatabiliriz.

Eğitim sonuçlarını görselleştirin

Yukarıdaki adımlardan sonra basit bir AutoEncoder oluşturduk, aşağıda performansını görmek için sonuçları görselleştireceğiz.

Burada görselleştirme için test veri setinden 5 örnek seçtim.Aynı şekilde gri tonlamalı görüntüleri gözlemlemek istiyorsanız cmap parametresini 'Greys_r' olarak belirtin. Yukarıdaki çizgi, test veri setindeki orijinal görüntüdür ve ikinci satır, AutoEncoder tarafından çoğaltılan görüntüdür ve piksel bilgilerindeki kayıp açıkça görülebilir.

Benzer şekilde gizli katmanda sıkıştırılmış verileri de görselleştirebiliriz ve sonuçlar şu şekildedir:

Bu beş resim, testteki beş resmin sıkıştırılmış resimlerine karşılık gelir.

Yukarıdaki basit örnekle, AutoEncoder'ın temel çalışma prensibini anlıyoruz, aşağıda modelimizi daha da geliştireceğiz, gizli katmanı görüntü parazitini azaltmak için evrişimli bir katmana dönüştüreceğiz.

Yukarıdaki işlemde kodun bir kısmı atlanmıştır. Kodun tamamı için lütfen yazarın GitHub'ını kontrol edin.

ikinci kısım

Yukarıdaki AutoEncoder çalışma prensibini anlamak temelinde, görüntü paraziti azaltma işlemini gerçekleştirmek için bu bölümde AutoEncoder'a birden çok evrişimli katman ekleyeceğiz.

Evrişimsel sinir ağı konusunda net olmayan küçük bir ortak varsa, öğrenmek için Zhihu'ya gidip büyük tanrıların makalelerini okuyabilirsiniz.

Benzer şekilde, deneyler yapmak için hala MNIST veri setini kullanıyoruz. Veri içe aktarma adımları tekrar edilmeyecektir, lütfen görüntülemek için kodu indirin. Başlamadan önce model yapımızın tamamına bir resim üzerinden bakalım:

Çizim aracı: OmniGraffle

Modele gürültülü bir resim giriyoruz ve modele çıkış ucunda gürültüsüz bir resim veriyoruz ve modelin evrişimli otomatik kodlayıcı aracılığıyla gürültü azaltma sürecini öğrenmesine izin veriyoruz.

Giriş katmanı

Buradaki giriş katmanı, önceki bölümümüzün giriş katmanından farklıdır, çünkü evrişim işlemini kullanacağız.Bu nedenle, giriş katmanı, yükseklik x genişlik x derinlik görüntüsü olmalıdır. Genel görüntü derinliği RGB formatında üç katmandır. MNIST veri setimizin derinliği yalnızca 1'dir.

Enkoder evrişimli katman

Kodlayıcı evrişimli katman, görüntüyü işlemek için üç katmanlı bir evrişim ve havuz katmanı oluşturur.

İlk evrişim katmanında, 3 x 3 boyutunda 64 filtre kullanıyoruz, varsayılan adım sayısı 1'dir ve yüksekliğimiz ve genişliğimiz dolgu aynı ayarlandıktan sonra değişmeyecektir, bu nedenle ilk hacim katmanından sonra Üründen sonra aldığımız veriler orijinal 28 x 28 x 1'den 28 x 28 x 64'e değişir.

Ardından, evrişim sonucu üzerinde maksimum havuzlama gerçekleştirin. Burada boyutu ayarlıyorum ve 2 x 2 adım atıyorum. Havuzlama işlemi evrişim sonucunun derinliğini değiştirmez, bu nedenle havuzlamadan sonraki boyut 14 x 14'tür. x 64.

Diğer evrişimli katmanlar için onları tekrar etmeyeceğim. Tüm evrişimli katmanların aktivasyon fonksiyonları ReLU kullanır.

Üç kat evrişim ve havuzlama işleminden sonra, elde ettiğimiz conv3 aslında önceki bölümdeki gizli AutoEncoder katmanına eşdeğerdir.Bu katmanın verileri 4 x 4 x 32 boyutuna sıkıştırılmıştır.

Bu noktada Enkoder tarafında evrişim işlemini tamamladık ve veri boyutu 28 x 28 x 1'den 4 x 4 x 32'ye değişti.

Dekoder evrişimli katman

Daha sonra Dekoder tarafında evrişime başlayacağız. Bundan önce, bazı arkadaşlar sormak zorunda kalabilir, çünkü Kodlayıcı resimleri zaten 4 x 4 x 32 boyutuna çevirdi, eğer Kod Çözücü üzerinde kıvrılmaya devam edersek, veri boyutu küçülmez mi? Bu nedenle, kod çözücü tarafında, sadece evrişim işlemlerini gerçekleştirmiyoruz, aynı zamanda Üstörnek (Çince çeviri üst örnekleme olabilir) + evrişim kombinasyonunu kullanıyoruz.

Evrişim işleminin resimdeki her yamayı bir filtre aracılığıyla taradığını ve ardından yamadaki piksel bloklarının ağırlıklı toplamından sonra doğrusal olmayan işlem gerçekleştirdiğini biliyoruz. Örneğin, orijinal görüntüdeki yamamızın boyutu 3 x 3 ise (popüler olan nokta, bir resimdeki 3 x 3 piksel bloklarından birini almamızdır) ve sonra 3 x 3 filtre kullanıyoruz Bu yamayı işleyin, ardından bu yama evrişimden sonra 1 piksel blok haline gelir. Ters evrişimde (veya ters çevrilmiş evrişimde), bu işlem tersine çevrilir. 1 piksel bloğu 3 x 3 piksel bloğuna genişletilecektir.

Ancak Ters Evrişimin bazı dezavantajları vardır, resimde dama tahtası modellerine neden olur, çünkü Ters Evrişim sürecinde filtrede çok fazla örtüşme olacaktır. Bu sorunu çözmek için, birisi Upsample artı bir evrişimli katman kullanmayı önerdi.

Upsample ile ilgili iki yaygın yol vardır, biri en yakın komşu enterpolasyonudur ve diğeri çift doğrusal enterpolasyondur.

Bu makale ayrıca kod çözücü tarafını işlemek için Upsample artı evrişimi kullanacaktır.

Upsample işlemi de TensorFlow içinde kapsüllenir Encoder evrişim sonucunu yeniden boyutlandırmak için resize_nearest_neighbor'ı kullanırız ve ardından evrişim işlemi gerçekleştiririz. Üç Upsample işleminden sonra, 28 x 28 x 64 veri boyutuna sahibiz. Son olarak, bu sonucu tekrar dönüştürmemiz ve orijinal resmimizin boyutuna getirmemiz gerekiyor.

Son adım, kayıp ve optimize edici tanımlamaktır.

Kayıp fonksiyonunu hesaplamak için çapraz entropi kullanıyoruz ve optimizasyon fonksiyonu öğrenme oranı 0.001'dir.

Gürültü verilerini oluşturun

Yukarıdaki adımlarla, tüm evrişimli otomatik kodlayıcı modelini oluşturduk. Görüntüyü denoize etmek için bu modeli kullanmak istediğimizden, eğitimden önce gürültü verilerimizi de orijinal verilere dayanarak oluşturmamız gerekiyor.

Nasıl gürültü ekleneceğini görmek için yukarıdaki basit bir örneği ele alalım: Bir resmin (784 boyutunda) data imajını elde ederiz ve resimdeki pikselleri değiştirecek olan rastgele bir sayı ile çarpılan parazit faktörünü ekleriz. . Ardından, MNIST verilerinin her piksel verisi 0-1 arasında bir sayıya işlendiğinden, her piksel verisinin hala 0-1 arasında olmasını sağlamak için görüntüyü gürültüyle kırpmak için numpy.clip kullanırız. .

Np.random.randn (* img.shape) işleminin çalışması np.random.randn'a (img.shape, img.shape) eşittir

Gürültü eklemeden önce ve sonra görüntü karşılaştırmasına bir göz atalım.

Eğitim modeli

Model yapımı ve gürültü işlemeyi tanıttıktan sonra, modelimizi bir sonraki adımda eğitebiliriz.

Modeli eğitirken, girdimiz gürültü eklenmiş veriler haline geldi ve çıktı bizim orijinal gürültüsüz verilerimizdir. Asıl önemli olan, orijinal verileri girdilerle aynı biçimde yeniden şekillendirmektir_. Evrişim işleminin derinliği nedeniyle model eğitimi biraz yavaştır.Çalışmak için GPU kullanılması önerilir.

En son oturumu kapatmayı unutmayın.

Sonuçların görselleştirilmesi

Yukarıdaki uzun eğitimin ardından modelimiz nihayet eğitildi.Ardından modelin görselleştirme yoluyla nasıl çalıştığını görelim.

Evrişimli otomatik kodlayıcı aracılığıyla gürültü azaltma etkimizin hala çok iyi olduğu, oluşturulan son görüntünün çok düzgün göründüğü ve gürültünün neredeyse görünmez olduğu görülebilir.

Bazı arkadaşlar, gürültü azaltmayı sağlamak için AutoEncoder'ın gizli girdi-çıktı yapısının temel versiyonunu da kullanabileceğimizi düşünebilir. Bu nedenle, modelin gürültü azaltma eğitimi için en basit girdi-gizli-çıktı yapısını kullanan bir sürümünü de uyguladım (kod GitHub'ımda). Sonuçlarına bir göz atalım:

Evrişimli otomatik kodlayıcı ile karşılaştırıldığında gürültü azaltma etkisinin daha kötü olduğu ve yeniden şekillendirilen görüntüde bazı gürültü gölgelerinin görülebildiği görülebilir.

son

Bu noktada, AutoEncoder modelinin temel versiyonunu tamamladık ve görüntü gürültüsünü azaltmak için bu temelde evrişimli bir katman ekledik. Arkadaşlarımın da AntoEncoder hakkında bir ön anlayışa sahip olduğuna inanıyorum.

Kodun tamamı, altı dosya içeren GitHub'ıma (NELSONZHAO / zhihu) yerleştirildi:

  • AutoEncoder'ın temel sürümü olan BasicAE (iki dosya içerir: jupyter not defteri ve html)

  • EasyDAE, gürültü azaltma AutoEncoder'ın temel sürümü (iki dosya içerir: jupyter dizüstü bilgisayar ve html)

  • ConvDAE, Evrişimli Gürültü Azaltma Otomatik Kodlayıcı (iki dosya içerir: jupyter not defteri ve html)

Kendinizi iyi hissediyorsanız, GitHub'da bana bir yıldız verebilirsiniz, daha da iyisi!

Bu makalenin yazarı Tian Yusu, yazar tarafından kendini tanıma sütununu yeniden basması için yetkilendirildi, teşekkürler!

Tüm ailenin valizlerini ve Yeni Yıl eşyalarını tutabilir! Bu 400.000 sınıf SUV'ler Yeni Yıl için bir zorunluluktur!
önceki
Şangay'ın güvenliğini koruyan 4000 silahlı polis
Sonraki
Xi'an bir bağımlılıktır, gitmezseniz tedavi edilemez; Chengdu bırakamayacağınız bir hastalıktır
Yüksek Hızlı Sürüşün "Dört Tabusu"! Bahar Şenliği boyunca uzun mesafeler koşmayı unutmamalısın!
Çin Ligi'nde torunların ayrılması! Stadyumun "sarı zemini" iklimden kaynaklandığını açıkladı!
Zimbabwe banknotları kağıttan daha düşük ve petrol fiyatları dünyadaki en yüksek. Kritik bir anda, Afrika'da renminbi yanıyor
7 yaşındaki bir McKinsey çalışanı şu tavsiyede bulunuyor: Yetenek sorunları denen şeylerin hepsi tutum sorunlarıdır
Sabah, bu kış tatil yerlerinden hiçbirinin yenilemeyeceğini gerçeklerle açıkladı!
Şiirler l On Du Mu şiiri, hepsi yedi karakterlik dörtlükler, sevdiğiniz bir şey olmalı
`` İş Modellerinin Tam Analizi '' Google, Amazon ve Facebook AI çağında doğabilir mi?
Eğlenceli konuşma, birkaç çayın aşk anlamı
"Kar ve Buzla Mücadele" Jiangxi Kar "Polisi" yanınızda
İran, ABD dolarını RMB ile değiştirdi ve İran ham petrolünün yeni bir alıcı bulmasının ardından işler yeni bir ilerleme kaydetti.
En yararsız araba konfigürasyonu, kullanamayacağınız için yılda birkaç kez kullanamazsınız
To Top