Keras'ta "Flatten" in rolü nedir?


109

FlattenFonksiyonun Keras'taki rolünü anlamaya çalışıyorum . Aşağıda basit iki katmanlı bir ağ olan kodum var. 2 boyutlu şekil verilerini (3, 2) alır ve 1 boyutlu şekil verilerini (1, 4) çıkarır:

model = Sequential()
model.add(Dense(16, input_shape=(3, 2)))
model.add(Activation('relu'))
model.add(Flatten())
model.add(Dense(4))
model.compile(loss='mean_squared_error', optimizer='SGD')

x = np.array([[[1, 2], [3, 4], [5, 6]]])

y = model.predict(x)

print y.shape

Bu y, şekle (1, 4) sahip yazdırır . Bununla birlikte, Flattençizgiyi kaldırırsam y, şekli (1, 3, 4) olan yazdırır .

Bunu anlamıyorum Sinir ağlarını anladığım kadarıyla, model.add(Dense(16, input_shape=(3, 2)))işlev 16 düğümlü, tamamen bağlantılı gizli bir katman oluşturmaktır. Bu düğümlerin her biri 3x2 giriş elemanlarının her birine bağlıdır. Bu nedenle, bu birinci katmanın çıkışındaki 16 düğüm zaten "düz" dür. Yani ilk katmanın çıktı şekli (1, 16) olmalıdır. Daha sonra, ikinci katman bunu bir girdi olarak alır ve şekil (1, 4) verilerini çıkarır.

Öyleyse, ilk katmanın çıktısı zaten "düz" ve şekilli (1, 16) ise, neden onu daha da düzleştirmem gerekiyor?

Yanıtlar:


123

Keras dokümantasyon girişini okursanız, Densebu aramayı göreceksiniz:

Dense(16, input_shape=(5,3))

Dense5 adımın her biri için bağımsız olarak uygulanacak 3 giriş ve 16 çıkışlı bir ağ ile sonuçlanır . Yani, D(x)3 boyutlu vektörü 16-d vektöre dönüştürürse, katmanınızdan çıktı olarak elde edeceğiniz şey bir vektör dizisi olacaktır: [D(x[0,:]), D(x[1,:]),..., D(x[4,:])]şekilli (5, 16). Belirttiğiniz davranışı elde etmek için, önce Flatten15-d vektöre girişinizi ve ardından uygulayabilirsiniz Dense:

model = Sequential()
model.add(Flatten(input_shape=(3, 2)))
model.add(Dense(16))
model.add(Activation('relu'))
model.add(Dense(4))
model.compile(loss='mean_squared_error', optimizer='SGD')

DÜZENLEME: Bazı insanların anlamaya çalıştığı gibi - burada açıklayıcı bir görüntünüz var:

görüntü açıklamasını buraya girin


Açıklaman için teşekkürler. Yine de açıklığa kavuşturmak Dense(16, input_shape=(5,3)gerekirse: 16'lık setteki her çıktı nöronu (ve bu nöronların 5 setinin tümü için) tüm (3 x 5 = 15) giriş nöronlarına bağlanacak mı? Veya ilk 16 kümesindeki her bir nöron yalnızca ilk 5 giriş nöron kümesindeki 3 nörona bağlanacak ve daha sonra ikinci 16 kümesindeki her nöron yalnızca 5 girişli ikinci kümedeki 3 nörona bağlanacak mı? nöronlar, vb .... Hangisi olduğu konusunda kafam karıştı!
Karnivaurus

1
3 nöron alan ve 3 nöronluk 5 setin her birine uygulanan 16 çıktısı olan bir Yoğun katmanınız var.
Marcin Możejko

1
Ah tamam. Yapmaya çalıştığım şey, girdi olarak 5 renkli pikselden oluşan bir liste almak ve bunların tamamen bağlı bir katmandan geçmesini istiyorum. Yani input_shape=(5,3)5 piksel olduğu ve her pikselin üç kanalı olduğu (R, G, B) anlamına gelir. Ama dediğinize göre, her kanal ayrı ayrı işlenecek, oysa ben üç kanalın da ilk katmandaki tüm nöronlar tarafından işlenmesini istiyorum. FlattenKatmanı hemen başlangıçta uygulamak istediğimi verir mi?
Karnivaurus

8
Olan ve olmayan küçük bir çizim Flattenanlamaya yardımcı olabilir.
Xvolks

2
Tamam Beyler - Size bir resim verdim. Artık olumsuz oylarınızı silebilirsiniz.
Marcin Możejko

52

görüntü açıklamasını buraya girin Flatten, Matrix'i tek diziye dönüştürerek çalışır.


4
Bu adamın daha fazla resim yapması gerekiyor. Bunu severim. Mantıklı.
alofgran

10
Evet, ama neden gerekli, bence asıl soru bu.
Helen

35

kısa okuma:

Bir tensörü düzleştirmek, biri hariç tüm boyutları kaldırmak anlamına gelir. Flatten katmanının yaptığı tam olarak budur.

uzun okuma:

Oluşturulan orijinal modeli (Flatten katmanı ile) dikkate alırsak, aşağıdaki model özetini alabiliriz:

Layer (type)                 Output Shape              Param #   
=================================================================
D16 (Dense)                  (None, 3, 16)             48        
_________________________________________________________________
A (Activation)               (None, 3, 16)             0         
_________________________________________________________________
F (Flatten)                  (None, 48)                0         
_________________________________________________________________
D4 (Dense)                   (None, 4)                 196       
=================================================================
Total params: 244
Trainable params: 244
Non-trainable params: 0

Bu özet için, sonraki görüntünün her katman için girdi ve çıktı boyutları hakkında biraz daha anlamlı olmasını umuyoruz.

Düzleştir katmanı için okuyabildiğiniz gibi çıktı şekli (None, 48). İşte ipucu. Okumalısın (1, 48)ya (2, 48)da ... ya da (16, 48)... ya da (32, 48)...

Aslında, Nonebu pozisyonda herhangi bir parti boyutu anlamına gelir. Girişlerin hatırlanması için, birinci boyut parti boyutu anlamına gelir ve ikinci boyut, giriş özelliklerinin sayısı anlamına gelir.

Keras'ta Flatten katmanının rolü çok basittir:

Bir tensör üzerindeki bir düzleştirme işlemi, tensörü , parti boyutu dahil olmayan tensörde bulunan elemanların sayısına eşit bir şekle sahip olacak şekilde yeniden şekillendirir .

görüntü açıklamasını buraya girin


Not: model.summary()Çıktı şeklini ve parametre ayrıntılarını sağlamak için yöntemi kullandım .


1
Çok anlayışlı bir diyagram.
Shrey Joshi

1
Diyagram için teşekkürler. Bana net bir resim veriyor.
Sultan Ahmed Sagor

0

Düzleştir, çok boyutlu bir tensörü nasıl serileştirdiğinizi (tipik olarak giriş olanı) açık hale getirin. Bu, (düzleştirilmiş) giriş tensörü ile ilk gizli katman arasında eşlemeye izin verir. İlk gizli katman "yoğun" ise, (serileştirilmiş) giriş tensörünün her bir öğesi, gizli dizinin her bir öğesine bağlanacaktır. Yassılaştır'ı kullanmazsanız, giriş tensörünün ilk gizli katmana eşlenme şekli belirsiz olacaktır.


0

Yakın zamanda bununla karşılaştım, kesinlikle anlamama yardımcı oldu: https://www.cs.ryerson.ca/~aharley/vis/conv/

Yani bir girdi, bir Conv2D, MaxPooling2D vb. Var, Flatten katmanları en sonunda ve tam olarak nasıl oluştuklarını ve son sınıflandırmaları (0-9) tanımlamak için nasıl devam ettiklerini gösteriyor.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.