Керас Плотный слой ввода не сплющен

Это мой тестовый код:

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,

Другие вопросы по тегам