Flatten() - TensorFlow ve Keras PlatoBlockchain Veri Zekası ile CNN'ler için Küresel Havuz Oluşturma Kullanmayın. Dikey Arama. Ai.

Flatten() Kullanmayın – TensorFlow ve Keras ile CNN'ler için Küresel Havuzlama

Çoğu uygulayıcı, ilk önce Evrişimli Sinir Ağı (CNN) mimarilerini öğrenirken, bunun üç temel bölümden oluştuğunu öğrenir:

  • Evrişimsel Katmanlar
  • Havuzlama Katmanları
  • Tamamen Bağlı Katmanlar

Çoğu kaynak var biraz kendi kitabım da dahil olmak üzere bu segmentasyondaki varyasyon. Özellikle çevrimiçi – tam bağlantılı katmanlar, bir düzleştirme tabakası ve (genellikle) çoklu yoğun katmanlar.

Bu eskiden normdu ve VGGNets gibi iyi bilinen mimariler bu yaklaşımı kullandı ve şu şekilde sonuçlanacaktı:

model = keras.Sequential([
    
    keras.layers.MaxPooling2D((2, 2), strides=(2, 2), padding='same'),
    keras.layers.Flatten(),
    keras.layers.Dropout(0.5),
    keras.layers.Dense(4096, activation='relu'), 
    keras.layers.Dropout(0.5),
    keras.layers.Dense(4096, activation='relu'),
    keras.layers.Dense(n_classes, activation='softmax')
])

Yine de, nedense – yarattığı bariz hesaplama darboğazı nedeniyle, VGGNet'in pratikte bu yaklaşımı kullanan son mimari olduğu çoğu zaman unutulur. ResNets, VGGNets'ten sadece bir yıl sonra (ve 7 yıl önce) yayınlanır yayınlanmaz, tüm ana akım mimariler model tanımlarını şu şekilde sonlandırdı:

model = keras.Sequential([
    
    keras.layers.GlobalAveragePooling2D(),
    keras.layers.Dense(n_classes, activation='softmax')
])

CNN'lerde düzleşme 7 yıldır etrafta dolaşıyor. 7 yıl! Ve yeterli sayıda insan bunun hem öğrenme deneyiminiz hem de kullandığınız hesaplama kaynakları üzerindeki zararlı etkisinden bahsetmiyor gibi görünüyor.

Küresel Ortalama Havuzlama, düzleştirme yerine birçok hesapta tercih edilir. Küçük bir CNN'nin prototipini yapıyorsanız – Global Pooling'i kullanın. Birine CNN'leri öğretiyorsanız – Global Pooling'i kullanın. Bir MVP yapıyorsanız – Global Pooling'i kullanın. Gerçekten ihtiyaç duyulan diğer kullanım durumları için düzleştirme katmanlarını kullanın.

Vaka Çalışması – Düzleştirme ve Küresel Havuz Oluşturma

Global Pooling, tüm özellik haritalarını tek bir haritada toplayarak, ilgili tüm bilgileri birden çok katman yerine tek bir yoğun sınıflandırma katmanı tarafından kolayca anlaşılabilen tek bir haritada toplar. Genellikle ortalama havuzlama olarak uygulanır (GlobalAveragePooling2D) veya maksimum havuzlama (GlobalMaxPooling2D) ve 1D ve 3D giriş için de çalışabilir.

gibi bir özellik haritasını düzleştirmek yerine (7, 7, 32) 1536 uzunluğunda bir vektöre dönüştürün ve bu uzun vektörden kalıpları ayırt etmek için bir veya daha fazla katmanı eğitin: onu bir (7, 7) vektör ve doğrudan oradan sınıflandırın. Bu kadar basit!

ResNets gibi ağlar için darboğaz katmanlarının yalnızca 1536'da değil, on binlerce özelliği içerdiğini unutmayın. Düzleştirirken, garip şekilli vektörlerden çok verimsiz bir şekilde öğrenmek için ağınıza işkence ediyorsunuz. Her piksel satırında dilimlenen ve ardından düz bir vektörde birleştirilen bir 2B görüntünün hayal edin. Dikey olarak 0 piksel ayrı olan iki piksel, feature_map_width pikselleri yatay olarak uzaklaştırın! Bu, uzamsal değişmezliği destekleyen bir sınıflandırma algoritması için çok önemli olmasa da - bu, diğer bilgisayarlı görme uygulamaları için kavramsal olarak bile iyi olmaz.

Birkaç yoğun katman içeren düzleştirici bir katman kullanan küçük bir tanıtıcı ağ tanımlayalım:

model = keras.Sequential([
    keras.layers.Input(shape=(224, 224, 3)),
    keras.layers.Conv2D(32, (3, 3), activation='relu'),
    keras.layers.Conv2D(32, (3, 3), activation='relu'),
    keras.layers.MaxPooling2D((2, 2), (2, 2)),
    keras.layers.BatchNormalization(),
    keras.layers.Conv2D(64, (3, 3), activation='relu'),
    keras.layers.Conv2D(64, (3, 3), activation='relu'),
    keras.layers.MaxPooling2D((2, 2), (2, 2)),
    keras.layers.BatchNormalization(),
    keras.layers.Flatten(),
    keras.layers.Dropout(0.3),
    keras.layers.Dense(64, activation='relu'),
    keras.layers.Dense(32, activation='relu'),
    keras.layers.Dense(10, activation='softmax')
])
model.summary()

Özet neye benziyor?

...                                                              
 dense_6 (Dense)             (None, 10)                330       
                                                                 
=================================================================
Total params: 11,574,090
Trainable params: 11,573,898
Non-trainable params: 192
_________________________________________________________________

Bir oyuncak ağı için 11.5 milyon parametre – ve parametrelerin daha büyük girdilerle patlamasını izleyin. 11.5 milyon parametre. Şimdiye kadar tasarlanmış en iyi performans gösteren ağlardan biri olan EfficientNets, ~6M parametrelerde çalışır ve gerçek performans ve verilerden öğrenme kapasitesi açısından bu basit modelle karşılaştırılamaz.

Ağı derinleştirerek bu sayıyı önemli ölçüde azaltabiliriz, bu da özellik haritalarını düzleştirilmeden önce azaltmak için daha fazla maksimum havuzlama (ve potansiyel olarak kademeli evrişim) sunacaktır. Ancak, hesapları daha az pahalı hale getirmek için ağı daha karmaşık hale getireceğimizi düşünün, hepsi planları bozan tek bir katman uğruna.

Katmanlarla daha derine inmek, veri noktaları arasında daha anlamlı, doğrusal olmayan ilişkiler çıkarmak olmalı, düzleştirme katmanına hitap etmek için girdi boyutunu küçültmemelidir.

İşte küresel havuzlamaya sahip bir ağ:

model = keras.Sequential([
    keras.layers.Input(shape=(224, 224, 3)),
    keras.layers.Conv2D(32, (3, 3), activation='relu'),
    keras.layers.Conv2D(32, (3, 3), activation='relu'),
    keras.layers.MaxPooling2D((2, 2), (2, 2)),
    keras.layers.BatchNormalization(),
    keras.layers.Conv2D(64, (3, 3), activation='relu'),
    keras.layers.Conv2D(64, (3, 3), activation='relu'),
    keras.layers.MaxPooling2D((2, 2), (2, 2)),
    keras.layers.BatchNormalization(),
    keras.layers.GlobalAveragePooling2D(),
    keras.layers.Dropout(0.3),
    keras.layers.Dense(10, activation='softmax')
])

model.summary()

Özet?

 dense_8 (Dense)             (None, 10)                650       
                                                                 
=================================================================
Total params: 66,602
Trainable params: 66,410
Non-trainable params: 192
_________________________________________________________________

Çok daha iyi! Bu modelle daha derine inersek parametre sayısı artacak ve yeni katmanlarla daha karmaşık veri kalıplarını yakalayabileceğiz. Yine de safça yapılırsa, VGGNets'i bağlayan aynı sorunlar ortaya çıkacaktır.

Daha İleriye Gitmek – Elde Tutulan Uçtan Uca Proje

Meraklı doğanız daha ileri gitmek istemenizi sağlıyor mu? bizim kontrol etmenizi öneririz Rehberli Proje: “Evrişimli Sinir Ağları – Temel Mimarilerin Ötesinde”.

En iyi uygulamalar, endüstri tarafından kabul edilen standartlar ve dahil edilen hile sayfası ile Git'i öğrenmek için uygulamalı, pratik kılavuzumuza göz atın. Googling Git komutlarını durdurun ve aslında öğrenmek o!

Sizi biraz zaman yolculuğuna çıkaracağım – 1998'den 2022'ye giderek, yıllar boyunca geliştirilen tanımlayıcı mimarileri, onları benzersiz kılan şeyleri, dezavantajlarının neler olduğunu vurgulayacak ve dikkate değer olanları sıfırdan uygulayacağım. Bunlar söz konusu olduğunda elinize biraz kir bulaşmasından daha iyi bir şey yoktur.

Motorun 4 silindirli mi yoksa 8 silindirli mi olduğunu ve motor içindeki supapların yerleşimini bilmeden araba kullanabilirsiniz. Ancak – bir motor (bilgisayar görüş modeli) tasarlamak ve takdir etmek istiyorsanız, biraz daha derine inmek isteyeceksiniz. Mimari tasarlamak için zaman harcamak istemiyor ve bunun yerine ürünler oluşturmak istiyor olsanız bile, ki bu en çok yapmak istediğiniz şeydir - bu derste önemli bilgiler bulacaksınız. VGGNet gibi güncel olmayan mimarileri kullanmanın ürününüze ve performansınıza neden zarar vereceğini ve modern bir şey inşa ediyorsanız neden bunları atlamanız gerektiğini öğreneceksiniz ve pratik sorunları çözmek için hangi mimarilere gidebileceğinizi ve neleri yapabileceğinizi öğreneceksiniz. artıları ve eksileri her biri içindir.

Bu dersteki kaynakları kullanarak bilgisayarla görüyü alanınıza uygulamak istiyorsanız - en yeni modelleri bulabilecek, bunların nasıl çalıştığını ve hangi kriterlere göre karşılaştırabileceğinizi anlayabilecek ve hangisini seçeceğinize karar verebileceksiniz. kullanmak.

Sen değil mi mimariler ve uygulamaları için Google'a ihtiyacınız var - bunlar genellikle makalelerde çok net bir şekilde açıklanıyor ve Keras gibi çerçeveler bu uygulamaları her zamankinden daha kolay hale getiriyor. Bu Rehberli Projenin temel çıkarımı, size mimarileri ve belgeleri nasıl bulacağınızı, okuyacağınızı, uygulayacağınızı ve anlayacağınızı öğretmektir. Dünyadaki hiçbir kaynak en yeni gelişmelere ayak uyduramayacak. En yeni makaleleri buraya ekledim – ancak birkaç ay içinde yenileri çıkacak ve bu kaçınılmaz. Güvenilir uygulamaları nerede bulacağınızı bilmek, bunları kağıtlarla karşılaştırmak ve ince ayar yapmak, oluşturmak isteyebileceğiniz birçok bilgisayarla görü ürünü için gereken rekabet avantajını size sağlayabilir.

Sonuç

Bu kısa kılavuzda, CNN mimari tasarımında düzleştirmeye alternatif bir göz attık. Kısa da olsa kılavuz, prototipler veya MVP'ler tasarlarken yaygın bir sorunu ele alıyor ve düzleştirmeye daha iyi bir alternatif kullanmanızı tavsiye ediyor.

Deneyimli herhangi bir Bilgisayarla Görme Mühendisi bu ilkeyi bilir ve uygular ve uygulama kesin olarak kabul edilir. Ne yazık ki, alana yeni giren yeni uygulayıcılara düzgün bir şekilde aktarılmıyor gibi görünüyor ve kurtulması biraz zaman alan yapışkan alışkanlıklar yaratabilir.

Computer Vision'a giriyorsanız - kendinize bir iyilik yapın ve öğrenme yolculuğunuzda sınıflandırma başlamadan önce düzleştirme katmanları kullanmayın.

Zaman Damgası:

Den fazla Yığın kötüye kullanımı