Я намагаюся зрозуміти роль Flatten
функції у Кераса. Нижче мій код, який представляє собою просту двошарову мережу. Він бере двовимірні дані форми (3, 2) і виводить одновимірні дані форми (1, 4):
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
Це виводить, що y
має форму (1, 4). Однак якщо я видаляю Flatten
рядок, то він видає, що y
має форму (1, 3, 4).
Я цього не розумію. З мого розуміння нейронних мереж, model.add(Dense(16, input_shape=(3, 2)))
функцією є створення прихованого повністю пов'язаного шару, що має 16 вузлів. Кожен з цих вузлів з'єднаний з кожним із вхідних елементів 3x2. Тому 16 вузлів на виході цього першого шару вже «плоскі». Отже, форма виходу першого шару повинна бути (1, 16). Потім другий шар приймає це як вхідний і виводить дані форми (1, 4).
Отже, якщо вихід першого шару вже "плоский" і має форму (1, 16), чому мені потрібно ще більше його вирівнювати?
Dense(16, input_shape=(5,3)
, чи буде кожен вихідний нейрон із набору 16 (і для всіх 5 наборів цих нейронів) буде зв'язаний з усіма (3 х 5 = 15) вхідними нейронами? Або кожен нейрон у першому наборі 16 буде з'єднаний лише з 3 нейронами в першому наборі 5 вхідних нейронів, і тоді кожен нейрон у другому наборі 16 підключений лише до 3 нейронів у другому наборі з 5 входів нейрони і т. д. .... Мене бентежить, що це таке!