Какова роль Flatten в Керасе?

109

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

РЕДАКТИРОВАТЬ: Как некоторые люди изо всех сил пытались понять - здесь у вас есть поясняющее изображение:

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

Марцин Можейко
источник
Спасибо за ваше объяснение. Просто для пояснения: Dense(16, input_shape=(5,3)будет ли каждый выходной нейрон из набора из 16 (и для всех 5 наборов этих нейронов) соединяться со всеми (3 x 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 Moejko
52

введите описание изображения здесь Вот как работает Flatten, преобразуя матрицу в единый массив.

Махеш Кембхави
источник
4
Этому парню нужно сделать больше снимков. Мне это нравится. Это имеет смысл.
alofgran
10
Да, но зачем это нужно, я думаю, это актуальный вопрос.
Хелен
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 в Keras очень проста:

Операция сглаживания тензора изменяет форму тензора, чтобы он имел форму, равную количеству элементов, содержащихся в тензоре, без учета размера партии .

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


Примечание: я использовал этот model.summary()метод, чтобы предоставить информацию о форме вывода и параметрах.

Прости
источник
1
Очень информативная диаграмма.
Шрей Джоши
1
Спасибо за диаграмму. Это дает мне четкую картину.
Незнакомец,
0

Flatten явно укажет, как вы сериализуете многомерный тензор (типично входной). Это позволяет сопоставить (сглаженный) входной тензор и первый скрытый слой. Если первый скрытый слой "плотный", каждый элемент (сериализованного) входного тензора будет связан с каждым элементом скрытого массива. Если вы не используете Flatten, способ сопоставления входного тензора с первым скрытым слоем будет неоднозначным.

Роберто
источник
0

Я недавно столкнулся с этим, это, безусловно, помогло мне понять: https://www.cs.ryerson.ca/~aharley/vis/conv/

Итак, есть вход, Conv2D, MaxPooling2D и т. Д., Слои Flatten находятся в конце и показывают, как именно они сформированы и как они продолжают определять окончательные классификации (0-9).

AEngineer
источник