Какова роль "Flatten" в Керасе?
Я пытаюсь понять роль функции 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), зачем мне его еще больше выравнивать?
Ответы
Ответ 1
если вы прочтете документацию 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-й вектор, а затем применить 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:
Как некоторые люди пытались понять - здесь у вас есть объясняющий образ:
![введите описание изображения здесь]()
Ответ 2
краткое чтение:
Выравнивание тензора означает удаление всех измерений, кроме одного. Это именно то, что делает слой 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 очень проста:
Операция выравнивания на тензоре изменяет форму тензора, чтобы он имел форму, равную количеству элементов, содержащихся в тензоре , не включая размер партии.
![enter image description here]()
Примечание: я использовал метод model.summary()
для предоставления формы вывода и деталей параметров.
Ответ 3
Вот как Flatten работает, преобразовывая матрицу в один массив.