В настоящее время, в отличие от того, что было указано в документации, слой 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
.
Обновление. Вот наглядная иллюстрация примера выше: