Подтвердить что ты не робот

Какова роль "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), зачем мне его еще больше выравнивать?

4b9b3361

Ответ 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

enter image description here Вот как Flatten работает, преобразовывая матрицу в один массив.