Makineler öğrenmez: CNN'in kalbini katman katman soymaya istekliyseniz

Makine www.jqbxx.com'u öğrenmiyor: Derin toplu makine öğrenimi, derin öğrenme algoritmaları ve teknik mücadele

CNN'in kalp katmanını katman katman soymak istiyorsanız, ne yaptığını anlayacaksınız.

Uzun zamandır, evrişimli sinir ağları insanlar için bir kara kutu oldu. Sadece görüntüleri tanımadaki doğruluğunun harika olduğunu biliyoruz, ancak nasıl yapılacağını ve görüntüleri ayırt etmek için hangi özellikleri kullandığını biliyoruz, hiçbir şey bilmiyoruz. . Sayısız bilim adamı ve araştırmacı, CNN'nin dahili çalışma mekanizmasını anlamaya çalışıyor ve hatta evrişimli sinir ağı ile biyolojik sinir ağı arasındaki bağlantıyı bulmaya çalışıyor. New York Üniversitesi'nden Matthew Zeiler ve Rob Fergus'un 2013'te Evrişimli Sinir Ağlarını Görselleştirme ve Anlama başlıklı makalesi, CNN'nin her katmanında hangi özelliklerin tanımlandığını ortaya çıkarmak için görselleştirme yöntemlerini kullandı ve ayrıca CNN'deki gizemi ortaya çıkardı. O zamandan beri, her CNN katmanının aktivasyon değerlerini, filtrelerini vb. Görselleştirmek için giderek daha fazla bilim insanı çeşitli yöntemler kullanarak CNN'in sırlarını her yönden anlamamıza izin verdi.

Bugünün makalesi, her bir CNN katmanının işlevlerine farklı açılardan bakmanızı sağlayacak.

1. Her bir CNN katmanının çıktısı nedir

Bu, CNN'nin her katmanını anlamanın en doğrudan yoludur .. Bir resim verildiğinde, her evrişimli katmandan sonra resim ne hale gelir.

Burada, VGG19 ağını doğrudan içe aktarmak için Keras'ı kullanıyorum ve sonra kendime bir fotoğraf yüklüyorum, bu fotoğrafın VGG'den geçmesine izin veriyorum ve her katmanın çıktısını aynı anda kaydediyorum ve ardından çıktıyı çiziyorum.

Önce gerekli paketleri tanıtın:

kerasları içe aktar

keras.applications.vgg19'dan VGG19'u içe aktarın

keras'tan. önişleme içe aktarma görüntüsü

keras.applications.vgg19'dan preprocess_input dosyasını içe aktarın

keras.models'ten içe aktarma Modeli

numpy'yi np olarak içe aktar

matplotlib.pyplot dosyasını plt olarak içe aktar

% matplotlib satır içi

Şimdi erkek tanrımın resmini yükleyelim ve keras'ın görüntü işleme aracını kullanarak onu doğrudan ağa atılabilecek bir forma dönüştürelim:

img_path = 'andrew.jpg'

img = image.load_img (img_path, target_size = (200, 300))

plt.imshow (img)

x = image.img_to_array (img)

x = np.expand_dims (x, axis = 0)

x = preprocess_input (x)

x.shape

Girdiğim görüntü:

Ardından, VGG modelini içe aktarıyoruz ve FC katmanını kaldırıyoruz (yani include_top'u FALSE olarak ayarla), çünkü bir FC katmanı varsa, FC katmanındaki nöron sayısı sabit olduğundan, ağın giriş şekli sınırlıdır ve bunu takip etmelidir. Orijinal ağın girişi tamamen aynıdır. Ancak evrişimli katman, giriş şekli ile sınırlı değildir, bu nedenle yalnızca evrişimli katmanı (ve havuz katmanını) tutuyoruz.

VGG19'un 19 CONV veya FC katmanı vardır, ancak tüm katmanları yazdırırsak, POOL katmanını içerecektir, yani 19'dan fazla katman vardır. Burada araştırmamızın nesnesi olarak 2. ila 20. katmanların çıktılarını alıyorum:

base_model = VGG19 (ağırlıklar = 'imagenet', include_top = False)

# Her katmanın çıktısını alın:

layer_outputs =

# Her katmanın adını alın:

layer_names =

base_model.layers'daki katman için:

layer_names.append (layer.name)

print (layer_names)

Buradaki çıktının henüz gerçek bir değeri olmadığını unutmayın! Bu sadece bir kabuk, resmi modele girdikten sonra değeri var.

Ardından yeni modelimizi bir araya getiriyoruz: her katmanın girdi görüntüleri ve çıktı etkinleştirme değerleri:

# Montaj modeli:

model = Model (inputs = base_model.input, outputs = layer_outputs)

# Her katman aktivasyonunun aktivasyon değerlerini almak için önceki görüntü verisini x modele girin:

activations = model.predict (x)

O kadar kolay! (Kodun anlamını anlamıyorsanız, Keras belgelerine bakabilirsiniz.)

Bu aktivasyonlarda her katmanın tüm aktivasyon değerleri yüklenir. Bir katmanın aktivasyonunu bulabilir ve görmek için şeklini yazdırabiliriz:

baskı (activations.shape)

#Çıktı:

# (1, 200, 300, 64)

Bu ne anlama geliyor?

1. Girilen resimlerin sayısını temsil eder Buraya sadece bir resim giriyoruz, yani 1;

200.300, resmin boyutunu temsil eder;

Katmanda kaç filtre olduğunu temsil eden 64. Bu nedenle, bu katman 64 tek kanallı resme eşdeğerdir.

Her katman aktivasyonuyla elde edilen resimleri yazdırabiliriz. Her katmandaki tüm filtrelere karşılık gelen resimleri görüntülemek için bir araya getirdik, kod aşağıdaki gibidir:

matematik ithal etmek

aktivasyon için, zip içinde layer_name (aktivasyonlar, layer_names):

h = activation.shape

w = activation.shape

num_channels = activation.shape

cols = 16

satırlar = math.ceil (num_channels / cols)

img_grid = np.zeros ((h * satırlar, w * sütunlar))

aralıktaki c için (kanal_sayısı):

f_r = math.ceil ((c + 1) / cols)

f_c = (c + 1) eğer f_r == 1 değilse (c + 1- (f_r-1) * cols)

img_grid = aktivasyon

plt.figure (figsize = (25,25))

plt.imshow (img_grid, görünüm = 'eşit', cmap = 'viridis')

plt.grid (Yanlış)

plt.title (layer_name, fontsize = 16)

plt.show ()

Bu kod pek iyi yazılmış gibi görünmüyor. . . Okuyucunun daha iyi bir yöntemi varsa, lütfen bana bildirin.

Son olarak, 18 büyük resim çıktı. Yerleşim kısıtlamaları nedeniyle, görüntülenmeleri için bazılarını seçeceğim:

Bu en üst katmandır (block1_conv2):

Gördüğünüz gibi, içindeki birçok resim bizim girdi resimlerimize çok benziyor. Yakınlaştırır ve dikkatlice gözlemlersek, örneğin:

Pek çok resmin orijinal resmin kenarlarını çizdiği görülebilir. Bu nedenle, bu katmanın ana işlevinin kenar algılama olduğunu biliyoruz.

Analiz ettiğimiz fikirlerden bahsedeyim:

Daha önce açıklanan CNN ilkesine göre, filtre orijinal görüntümüzün karşılık gelen kısmına daha çok benzediğinde, bunların kıvrımlarının sonucunun daha büyük olacağını, dolayısıyla çıktı pikselinin daha parlak olacağını biliyoruz! Bu nedenle, çıktı görüntüsünün hangi kısımlarının daha parlak olduğunu analiz ederek bu katmandaki filtrelerin rolünü bilebiliriz.

Yani aslında bu katman sadece "kenar algılama" değil, aynı zamanda bir işlev - "renk algılama" dır. Çünkü bunun gibi birçok resim de buldum:

Bu resimlerdeki vurgulanan kısımların tümü, orijinal resimdeki tüm bloğun rengine karşılık gelir, bu nedenle bu katmandaki bazı filtrelerin renkleri algılama işlevi olduğu sonucuna varabiliriz.

Çok ilginç ~

Orta katmana (block2_conv2) bakalım:

Veya yakınlaştırın ve bir göz atın:

Bu katman çok daha karmaşık görünüyor, çünkü bu vurgulanan kısımların ne tür bir özellik olduğunu bilmiyoruz, bir çeşit doku gibi görünüyorlar. Bu nedenle, önceki çok sığ katmanla karşılaştırıldığında, bu katman tarafından çıkarılan özellikler o kadar basit değildir.

Sonra çok derin bir katmana bakarız:

(Resim çok büyük, ben katılacağım)

Bu muhtemelen VGG'nin onuncu katmanıdır. Tekrarlanan evrişimden sonra görüntünün boyutu küçülür ve böylece giderek daha fazla "pikselleşir" olur. Şu anda, bu etkinleştirilmiş görüntüleri orijinal görüntülerle karşılaştırabilir ve görebiliriz Orijinal görüntünün hangi kısımlarının etkinleştirildiği:

Bu resimden de görebileceğiniz gibi, Andrew'un tüm üst gövdesi harekete geçirilmiştir. Şuna bir daha bak:

Andrew'un eli harekete geçirildi. Herkesin denemesini bekleyen daha fazla örnek var. Buradan, bu katmanın "eller", "vücut" gibi özellikler gibi bazı daha karmaşık şeyleri zaten tanıyabildiğini makul bir şekilde tahmin edebiliriz. Bu özellikler, önceki sığ "kenar", "renk" ve diğer özelliklerden çok daha gelişmiştir.

Herkesin her katmanın durumunu daha kapsamlı görmesini sağlamak için her katmandan bir resmi ayarlayıp birlikte bastırdım:

Özetle:

CNN katmanlarının sayısı arttıkça, her katmanın çıktı görüntüsü gittikçe daha soyut hale gelir, bu da filtrelerimizin gittikçe daha karmaşık hale geldiği anlamına gelir; CNN'nin derinleşmesiyle ağ katmanının öğrendiği sonucunu makul bir şekilde çıkarabiliriz. Özellikler daha gelişmiş ve karmaşık hale geliyor.

İkinci olarak, her bir CNN katmanının filtreleri tarafından hangi özellikler tanınır?

Yukarıda, her katmanın çıktısının neye benzediğini zaten biliyoruz ve bundan, her katmanın filtrelerinin giderek daha karmaşık hale geldiği sonucuna varıyoruz. Öyleyse, daha fazlasını keşfetmek istiyoruz, bu filtreler neyi tanımlıyor ve neye benziyor?

Burada büyük bir sorun var: Örneğin, VGG, daha önce bunun çok normal bir ağ olduğundan bahsetmiştik ve tüm filtre boyutları 3 × 3'tür. Bu kadar küçük bir şeyle, onu çizdiğimde hiçbir numara göremiyorum. Yukarıda her katmanın aktivasyon değerini çizdiğimiz gibi hepsi analiz edilemez.

Peki ne yapmalı? Fikirleri şu anda analiz etmek için hala kullanabiliriz:

Giriş görüntüsü filtreye daha benzer olduğunda, evrişim çıktıları daha büyük olacaktır. Bu nedenle, CNN'e çok sayıda resim aktarın ve hangisinin en yüksek çıktıya sahip olduğunu görün. Ancak bu mümkün değildir, bu nedenle düşüncemizi değiştirebiliriz: doğrudan gürültülü bir görüntü girebilir ve görüntüyü sürekli güncellemek için gradyan inişine benzer bir yöntem kullanabiliriz, böylece çıktı sonuçlarımız artmaya devam eder, sonra bu görüntü filtreyi belirli bir ölçüde yansıtır. Gibi görünüyor.

Aslında, gradyan inişini kullanmak yerine, gradyan çıkışını kullanıyoruz çünkü minimum değer problemi değil, maksimum değer problemi istiyoruz.

Gradyan inişinin w parametresini güncelleme işlemi w-- > w- · dw, burada öğrenme hızıdır ve dw, w'ye olan kayıp gradyanıdır.

Gradyan yükselmesi benzerdir, x girişini günceller ve güncellemenin yönü değişir: x-- > x + s · dx, burada s adım boyutunu temsil eder, 'ya benzer şekilde, dx aktivasyon değerinin x'e olan gradyanıdır.

Bu nedenle, gradyan çıkış algoritmasını oluşturmak için gradyan iniş yöntemini taklit edebiliriz. Belirli yöntemler ve kodlar için, lütfen keras'ın mucidi olan Fchollet tarafından yazılan öğreticiye bakın: konvnetlerin öğrendiklerini görselleştirme

Burada sığdan derine 5 evrişimli katmanın filtrelerini gösteriyorum (bunun gerçek bir filtre olmadığını, ancak bir girdi görüntüsü olduğunu unutmayın, çünkü bu giriş görüntüsünün ve filtrelerin evrişim sonucu maksimize edilmiştir, bu yüzden burada kullanıyoruz Filtrelerin görünümünü temsil etmek için resmin görünümünü girin):

[Uyarı: Resim, teröriste rahatsızlık verebilir]

block1-conv3:

Bu katman önceki çıkarımımızı doğrular: Girişe çok yakın olan sığ filtrelerin işlevleri "kenar algılama" ve "renk algılama" dır.

Belki sınıf arkadaşlarımdan bazıları hala anlamıyor. Sonuçta, bu soruyu uzun süredir düşünüyordum.Resimler neden bu kadar yoğun ve görmek bu kadar kafa karıştırıcı? Çünkü bu gerçek bir filtre değil! Filtre boyutu yalnızca 3 × 3'tür ve bu resimlerin boyutu, belirlediğimiz giriş resmi boyutu 150 × 150'dir. Filtrelerimizden birini eklemek dikey kenarları tespit etmektir, bu nedenle giriş resmi evrişim sonucunu en üst düzeye çıkarmak istiyorsa, kaçınılmaz olarak her yerde olacaktır. Her köşe dikey şeritlerle kaplıdır, bu nedenle gördüğümüz resimler, belirli desenlerin yoğun şekilde paketlenmiş yığınlarıdır.

blok2-dönüşüm3:

block3-conv3:

Bu katta spiraller, dalgalar, kareler, göz gibi şekiller, kiremit gibi şekiller gibi daha karmaşık desenler görmeye başladım ...

block4-conv3:

block5-conv3:

Bu daha derin düzeyde, resmin deseninin daha karmaşık olduğunu görüyoruz. Ön taraftaki küçük desenlerden oluşan büyük bir desen gibi görünüyor, örneğin bir bükülmeye benzer bir şekil, bir örümcek ağına benzer bir şekil vb. Doğrudan söyleyemeyiz. , Ama açıkçası bu filtrelerin tanıdığı özellikler daha gelişmiş. Filtrelerin yalnızca bir kısmını görselleştirme için seçtiğim için burada daha fazla desen göremiyorum. Belki bu katmana yüzlerce filtre yazdırarak böcekler, kollar vb. Gibi bazı desenler bulabiliriz.

Aynı zamanda, seviye ne kadar derin olursa resmin yoğunluğunun azalacağını gördük, çünkü seviye ne kadar derinse, orijinal görüntüye karşılık gelen filtrelerin görüş alanı o kadar büyük olacak, bu nedenle özellik modelinin aralığı daha geniş olacak, bu yüzden o kadar yoğun olmayacak. Yukarı.

Ek olarak, dikkatli olursanız, katman ne kadar derin olursa, şekilde giderek daha fazla geçersiz görsel olarak gösterilen filtrelerin o kadar seyrekleştiğini fark edebiliriz:

Bu resimler tamamen parazittir, yani hiçbir şey aktif değildir. Özel neden bana hala net değil, daha sonra bulduğumda ekleyeceğim. Ancak başka bir açıdan anlayabiliriz: Katman ne kadar derin olursa, filtre sayısı o kadar artar. Örneğin, blok1-dönüşümü yalnızca 64 filtreye sahiptir, ancak son blok5-dönüşüm3 katmanında 512 kadar filtre vardır, bu nedenle yararlı filtreler Daha seyrek olmalı.

Özetle:

Artık CNN'in sığ filtrelerinin genel olarak "kenar" ve "renk" gibi birinci düzey özellikleri algıladığını anlayabiliyoruz (sadece çıkarsak). Bundan sonra, filtreler çeşitli "doku desenlerini" belirleyebilir. Derin katmanlar söz konusu olduğunda, Filtreler, önceki temel özelliklerden oluşan "bükülme", "örümcek" vb. Gibi kalıpları algılayabilir.

Üç, bir adım daha yakın, filtreleri görselleştirmek için Deconvnet'i kullanın

CNN görselleştirmesindeki en ünlü makale, makalenin başında bahsettiğimiz makaledir: Matthew D. Zeiler ve Rob Fergus: Evrişimli Ağları Görselleştirme ve Anlama. İster Wu Endanın derin öğrenimi isterse Li Feifeinin bilgisayar görüşü hakkındaki konuşması olsun, bu makaledeki makaleden alıntı yapacaklardır. Örneğin, zamanınız olduğunda herkesin bu makaleyi okumasını tavsiye ederim.

Uzun süre okudum ve anlamadım, ancak yukarıdaki "Birinci Bölüm" ü yazdıktan sonra yazarın düşüncesini anladım.

"Bir" de aldığımız belirli bir derin aktivasyon değerine geri dönelim:

Sonra, orijinal resimleri nerede çakıştıklarını görmek için yapıştırmaya çalıştım:

O zaman, "vücudun üst kısmı", "el" ve "Ng" nin doğru bir şekilde aktive edildiğini bulmak bizi çok şaşırttı.

Ve yukarıdaki makalenin yazarı, Deconvnet'in yapısını kullanarak "aktivasyon değerini giriş resmine denkleştirme" (benim tahminim) fikrini takip ederek, aktivasyon değeri CNN boyunca giriş alanına geri eşlenir ve Filtrelerin neyi belirlediğini daha net bilmek için giriş görüntüsünü yeniden oluşturun. Bu fikrin yukarıda tanıttığımız "bir" ve "iki" nin biçimsel bir birleşimi olduğu söylenebilir!

Göstermek için bir taslak çiziyorum:

Eskizim oldukça "el yazısı", sadece bir jest. Spesifik yöntem aslında orijinal CNN'nin sırasını tamamen tersine çevirmektir, ancak bileşenler aynı kalır (yani, filtreler, POOL, vb. Değişmez).

Örneğin, orijinal sipariş şu şekildedir: giriş-- > Dönş-- > relu-- > Havuz-- > Aktivasyon

Şimdi şuna dönüşür: Aktivasyon-- > Havuzdan çıkar-- > relu-- > DeConv-- > giriş

Buradaki Havuzdan Çıkarma ve DeConv, orijinal Havuz ve dönş. Ters işlemlerdir. Ayrıntılar için lütfen orijinal kağıda bakın. DeConv işlemi için şunu da öneriyorum: https://arxiv.org/abs/1603.07285

Aslında, basitçe söylemek gerekirse, Conv temelde büyük bir görüntüyü (girişi) bir filtre aracılığıyla küçük bir görüntüye (etkinleştirme) dönüştürür ve DeConv, küçük görüntüden (etkinleştirme) filtrenin transpozisyonuna ve ardından büyük görüntüye (giriş) geri döner:

Bu nedenle, her katmanın aktivasyon değerlerinden en büyük aktivasyon değerini seçeriz, onu Deconvnet üzerinden geri göndeririz ve giriş görüntüsünü yeniden yapılandırmak için giriş alanına eşleriz. Burada, herkesin görmesi için makaledeki sonuçları doğrudan göstereceğim:

Soldaki gri desenler, DeConvnet aracılığıyla aktivasyon değerimizin ters çıktısıdır ve sağdaki alan, sol desene karşılık gelen orijinal modeldir.

İlk katmanda filtrelerin çeşitli kenarları ve renkleri tanımladığını, ikinci katmanın spiraller gibi çeşitli desenleri tanımladığını, üçüncü katmanın lastikleri, bir kişinin üst gövdesini, bir sıra harf vb. Tanımlamaya başladığını görebiliriz; Dördüncü katta köpek başları ve kuş bacakları tanındı; beşinci katta ise şehir, bisikletler ve çeşitli köpekler gibi tüm nesneleri doğrudan tanıyor!

Aslında, bunun "İki" de elde ettiğimize çok benzediğini bulduk, ancak burada elde edilen model çok özelken, "İki" de elde edilen her katmanın desenleri çok soyut. Bunun nedeni, burada tüm aktivasyon değerlerinin geriye doğru eşleştirildiğini söylemiyoruz, ancak haritalama için en belirgin aktivasyon değerini seçmek ve "iki" de, bir gürültü görüntüsünden modeller oluşturuyoruz. Aktivasyon değeri en büyüğüdür (bir eğitim süreci vardır) ve burada belirli bir resmin aktivasyon değeri, resmi yeniden oluşturmak için doğrudan kullanılır, bu yüzden çok spesifiktir.

Yukarıdakilerin hepsini özetlemek

Her CNN katmanı bir kara kutu değildir, her katmanın kendine özgü işlevi vardır ve iş bölümü açıktır. CNN, sığdan derine, belirli nesneleri çıkarana kadar çeşitli şekillerin kenarlarını, renklerini, dokularını ve desenlerini kademeli olarak ayıklayacaktır. Başka bir deyişle, CNN'ler eğitim sürecinde görevimizin ihtiyaç duyduğu çeşitli özellikleri otomatik olarak çıkarır:

Bu özellikler ne kadar sığsa, o kadar yaygın ve çok yönlüdür;

Ne kadar derin olursa, gerçek görev senaryomuza o kadar yakın olur.

Bu nedenle, aktarım öğrenimi için CNN'leri kullanabilir ve eğitebiliriz, yani kendi veri setimizin özelliklerini çıkarmak için CNN'ler tarafından eğitilmiş filtreleri (özellik çıkarıcıları) doğrudan kullanabiliriz ve sonra çok kolay olabilir. Sınıflandırma, tahmin vb. Amaçlarının farkına varın.

Referans malzemeleri:

1. Matthew D. Zeiler ve Rob Fergus: Evrişimli Ağları Görselleştirme ve Anlama.

2. Derin öğrenme için evrişim aritmetiği rehberi

3. Konvnetlerin öğrendiklerini görselleştirmek

Transfer adresi: https://zhuanlan.zhihu.com/p/42904109

Malları 618'de tekrar tarama zamanı! Apple iPhone7 / 7Plus cep telefonu kılıfları için önerilir
önceki
Bu sezon şimdiye kadar aklınızdaki en iyi altıncı adam kim?
Sonraki
Sabit disklerin de çok güzel olabileceği ortaya çıktı! Kingston Golden Rooster Zodiac Commemorative Edition SSD söküm değerlendirmesi
Makine öğrenmiyor: O zamandan beri, derin öğrenmede ileri ve geri yayılmayı anlıyorum
Güçlü bir araç, güzellik seçimi! Patriot Gaming 600 tam modül güç deneyimi
LOL canlı yayın çemberindeki büyük olaylar sık sık meydana gelir. Beş-beş gülme ve ölüm, Taobao Quan'ın sıcak arayışını duyurur
Makine öğrenmiyor: derin öğrenmede parametreler nasıl ayarlanır?
Bu fan sıradan değil! Cooler MasterFan Pro120 fan deneyimi
Fuman Capital, Çin-Xuannan Kulübü Fener Festivali Özel Gösterisinin Bahar Kutlaması
Makineler öğrenmez: GAN envanteri ve yıllar içinde karşılaşma ağlarının oluşturulması hakkında konuşur
Minimum iki binden fazla! Yılın ikinci yarısında tam ekran amiral gemisi cep telefonu envanteri!
Süper yetenekli, sabit diskler çok güzel olabilir! Kingston Golden Rooster Zodiac Edition SSD Deneyimi
İlk yarı-Augsburg 2-2 Bayern, Goretzka'nın 14 saniyede kendi kalesine golü var
Makineler öğrenmez: WordNet ve Wikipedia-Large uluslararası semantik ilişkiler ağının karması
To Top