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

83

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

Я понимаю, что 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)

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

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

Буомсу Ким
источник
1
Там на данный момент ссем не будет разницы, здесь обсуждение этого. Я думаю, что первоначальная цель заключалась в том, чтобы провести различие между Denseслоем, сглаживающим ввод, а затем изменяющим его форму, таким образом, соединяя разные временные шаги и имея больше параметров, и TimeDistributedсохраняя временные шаги разделенными (следовательно, имеющими меньше параметров). В вашем случае Denseдолжно было быть 500 параметров, TimeDistributedтолько 50
gionni
@gionni Нет, у него одинаковое количество параметров (оба 6). Значит разницы практически нет атм?
Buomsoo Kim
Да, именно такое количество параметров они имели бы, если бы была разница. На данный момент нет
gionni

Ответы:

85

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

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

Марцин Можейко
источник
3
Вот пример использования TimeDistributed, обертывающего саму модель. Когда это применяется к Inputтензору, есть ли какое-нибудь отличие от этого по сравнению с простым выполнением mapмодели, примененной к списку, содержащему каждый фрагмент Input?
CMCDragonkai