Я пытаюсь понять, что делает оболочка 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?
python
machine-learning
keras
neural-network
deep-learning
Буомсу Ким
источник
источник
Dense
слоем, сглаживающим ввод, а затем изменяющим его форму, таким образом, соединяя разные временные шаги и имея больше параметров, иTimeDistributed
сохраняя временные шаги разделенными (следовательно, имеющими меньше параметров). В вашем случаеDense
должно было быть 500 параметров,TimeDistributed
только 50Ответы:
В
keras
процессе построения последовательной модели обычно второе измерение (одно после измерения образца) связано сtime
измерением. Это означает, что если, например, ваши данные находятся5-dim
с(sample, time, width, length, channel)
вами, вы можете применить сверточный слой, используяTimeDistributed
(который применим к4-dim
with(sample, width, length, channel)
) по временному измерению (применяя один и тот же слой к каждому временному срезу), чтобы получить5-d
выходные данные.Дело в
Dense
том, что вkeras
версии 2.0Dense
по умолчанию применяется только к последнему измерению (например, если вы применяетеDense(10)
ввод с формой,(n, m, o, p)
вы получите вывод с формой(n, m, o, 10)
), поэтому в вашем случаеDense
иTimeDistributed(Dense)
эквивалентны.источник
Input
тензору, есть ли какое-нибудь отличие от этого по сравнению с простым выполнениемmap
модели, примененной к списку, содержащему каждый фрагментInput
?