Яка роль "Flatten" у Кераса?


108

Я намагаюся зрозуміти роль 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), чому мені потрібно ще більше його вирівнювати?

Відповіді:


123

Якщо ви прочитаєте запис документації Keras для Dense, ви побачите, що цей дзвінок:

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

це призведе до створення Denseмережі з 3 входами та 16 виходами, які застосовуватимуться незалежно для кожного з 5 кроків. Отже, якщо D(x)перетворює 3-мірний вектор на 16-d-вектор, то ви отримаєте як вихід зі свого шару послідовність векторів: [D(x[0,:]), D(x[1,:]),..., D(x[4,:])]з формою (5, 16). Щоб мати вказану вами поведінку, ви можете спочатку Flattenввести 15-d вектор, а потім застосувати 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')

EDIT: Як деякі люди намагалися зрозуміти - тут у вас є пояснювальний образ:

введіть тут опис зображення


Дякуємо за ваше пояснення. Хоча лише уточнити: з Dense(16, input_shape=(5,3), чи буде кожен вихідний нейрон із набору 16 (і для всіх 5 наборів цих нейронів) буде зв'язаний з усіма (3 х 5 = 15) вхідними нейронами? Або кожен нейрон у першому наборі 16 буде з'єднаний лише з 3 нейронами в першому наборі 5 вхідних нейронів, і тоді кожен нейрон у другому наборі 16 підключений лише до 3 нейронів у другому наборі з 5 входів нейрони і т. д. .... Мене бентежить, що це таке!
Karnivaurus

1
У вас є один щільний шар, який отримує 3 нейрона і вихід 16, який застосовується до кожного з 5 наборів з 3 нейронів.
Marcin Możejko

1
Ну гаразд. Що я намагаюся зробити, це взяти список з 5 кольорових пікселів в якості вхідних даних, і я хочу, щоб вони проходили через повністю пов'язаний шар. Значить input_shape=(5,3), існує 5 пікселів, і кожен піксель має три канали (R, G, B). Але відповідно до того, що ви говорите, кожен канал оброблявся б індивідуально, тоді як я хочу, щоб усі три канали були оброблені всіма нейронами на першому шарі. Тож чи нанесення Flattenшару одразу на початку дасть мені те, що я хочу?
Karnivaurus

8
Маленький малюнок з і без Flattenможе допомогти зрозуміти.
Xvolks

2
Гаразд, хлопці - я представив вам образ. Тепер ви можете видалити свої протоколи.
Marcin Możejko


35

коротке прочитання:

Вирівнювання тензора означає прибрати всі розміри, крім одного. Саме це і робить шар Flatten.

довго читав:

Якщо взяти до уваги оригінальну модель (із шаром Flatten), створену, ми можемо отримати такий підсумок моделі:

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

Наступне зображення, сподіваємось, надасть трохи більше сенсу щодо розмірів вводу та виводу для кожного шару.

Вихідна форма шару Flatten, як ви можете прочитати, така (None, 48). Ось підказка. Ви повинні прочитати його (1, 48)або (2, 48)або ... або (16, 48)... або (32, 48), ...

Фактично, Noneна цій позиції мається на увазі будь-який розмір партії. Щоб згадати входи, перший вимір означає розмір партії, а другий - кількість функцій введення.

Роль шару Flatten в Керасі надзвичайно проста:

Операція згладжування на тензорі перетворює тензор у форму, яка дорівнює кількості елементів, що містяться в тензорі, не включаючи розмірність партії .

введіть тут опис зображення


Примітка. Я використовував model.summary()метод для надання форми виводу та деталей параметрів.


1
Дуже прониклива схема.
Шрей Джоші

1
Дякую за схему. Це дає мені чітку картину.
Султан Ахмед Сагор

0

Вирівнюйте чітко, як ви серіалізуєте багатовимірний тензор (типово вхідний). Це дозволяє відобразити відображення між (сплющеним) вхідним тензором та першим прихованим шаром. Якщо перший прихований шар "щільний", кожен елемент (серіалізованого) вхідного тензора буде з'єднаний з кожним елементом прихованого масиву. Якщо ви не використовуєте Flatten, спосіб тензора вхідного сигналу на перший прихований шар був би неоднозначним.


0

Я нещодавно натрапив на це, це, безумовно, допомогло мені зрозуміти: https://www.cs.ryerson.ca/~aharley/vis/conv/

Отже, є вхід, Conv2D, MaxPooling2D тощо, шари Flatten знаходяться в кінці і показують, як саме вони формуються і як вони продовжують визначати остаточні класифікації (0-9).

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.