Я пытаюсь понять роль 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), зачем мне его еще больше сглаживать?
Dense(16, input_shape=(5,3)
будет ли каждый выходной нейрон из набора из 16 (и для всех 5 наборов этих нейронов) соединяться со всеми (3 x 5 = 15) входными нейронами? Или каждый нейрон в первом наборе из 16 будет связан только с 3 нейронами в первом наборе из 5 входных нейронов, а затем каждый нейрон во втором наборе из 16 будет подключен только к 3 нейронам во втором наборе из 5 входов. нейроны и т.д .... Я не понимаю, что это такое!