Flatten
Fonksiyonun 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?
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ı!