Какова роль слоя TimeDistributed в Keras?

Я пытаюсь понять, что делает оболочка TimeDistributed в Keras.

Я получаю, что TimeDistributed "применяет слой к каждому временному фрагменту ввода."

Но я сделал некоторый эксперимент и получил результаты, которые я не могу понять.

Короче говоря, в связи со слоем LSTM, TimeDistributed и просто Dense-слой имеют одинаковые результаты.

model = Sequential()
model.add(LSTM(5, input_shape = (10, 20), return_sequences = True))
model.add(TimeDistributed(Dense(1)))
print(model.output_shape)

model = Sequential()
model.add(LSTM(5, input_shape = (10, 20), return_sequences = True))
model.add((Dense(1)))
print(model.output_shape)

Для обеих моделей я получил выходную форму (None, 10, 1).

Может ли кто-нибудь объяснить разницу между слоем TimeDistributed и Dense после слоя RNN?

Ответ 1

В keras - при построении последовательной модели - обычно второе измерение (одно после измерения образца) - связано с измерением time. Это означает, что если, например, ваши данные 5-dim с помощью (sample, time, width, length, channel), вы можете применить сверточный слой, используя TimeDistributed (который применим к 4-dim с (sample, width, length, channel)) по размеру времени (применяя один и тот же слой к каждый раз срез), чтобы получить вывод 5-d.

Случай с Dense заключается в том, что в keras от версии 2.0 Dense по умолчанию применяется только к последнему измерению (например, если вы применяете Dense(10) для ввода с формой (n, m, o, p), вы получите вывод с shape (n, m, o, 10)), поэтому в вашем случае Dense и TimeDistributed(Dense) эквивалентны.