Керас Плотный слой ввода не сплющен
Это мой тестовый код:
from keras import layers
input1 = layers.Input((2,3))
output = layers.Dense(4)(input1)
print(output)
Выход:
<tf.Tensor 'dense_2/add:0' shape=(?, 2, 4) dtype=float32>
Но что случилось?
В документации сказано:
Примечание: если входное значение для слоя имеет ранг больше 2, то оно выравнивается перед начальным точечным произведением с ядром.
В то время как выход изменяется?
1 ответ
В настоящее время, вопреки тому, что было указано в документации, Dense
Слой наносится на последнюю ось входного тензора:
Вопреки документации, мы фактически не сглаживаем это. Он наносится на последнюю ось независимо.
Другими словами, если Dense
слой с m
единиц применяется на входной тензор формы (n_dim1, n_dim2, ..., n_dimk)
это будет иметь выходную форму (n_dim1, n_dim2, ..., m)
,
Как примечание стороны: это делает TimeDistributed(Dense(...))
а также Dense(...)
эквивалентны друг другу.
Еще одно примечание: имейте в виду, что это имеет эффект общих весов. Например, рассмотрим эту игрушечную сеть:
model = Sequential()
model.add(Dense(10, input_shape=(20, 5)))
model.summary()
Краткое изложение модели:
_________________________________________________________________
Layer (type) Output Shape Param #
=================================================================
dense_1 (Dense) (None, 20, 10) 60
=================================================================
Total params: 60
Trainable params: 60
Non-trainable params: 0
_________________________________________________________________
Как вы можете видеть Dense
слой имеет только 60 параметров. Как? Каждый блок в Dense
Слой связан с 5 элементами каждой строки на входе с одинаковыми весами, поэтому 10 * 5 + 10 (bias params per unit) = 60
,