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