Плотный слой Keras не сплющен - PullRequest
0 голосов
/ 30 августа 2018

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

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 Ответ

0 голосов
/ 30 августа 2018

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


Обновление. Вот наглядная иллюстрация примера выше:

Visual illustration of applying a Dense layer on an input with two or more dimensions in Keras

...