Разница между `Dense` и` TimeDistributedDense` `Keras`

34

Я до сих пор путаю о разнице между Denseи TimeDistributedDenseиз Kerasхотя есть уже задавали некоторые подобные вопросы здесь и здесь . Люди много обсуждают, но нет общих согласованных выводов.

И даже здесь @fchollet заявил, что:

TimeDistributedDenseприменяет одну и ту же Dense(полностью подключенную) операцию к каждому временному шагу трехмерного тензора.

Мне все еще нужна подробная иллюстрация о том, в чем именно разница между ними.

fluency03
источник

Ответы:

41

Допустим, у вас есть данные временных рядов с строками и 700 столбцами, которые вы хотите передать слою в Keras. Прежде чем передать это в RNN, вам нужно преобразовать предыдущие данные в 3D-тензор. Таким образом, это становится N × 700 × 1 .N700SimpleRNN(200, return_sequence=True)N×700×1

развернутый рнн

Изображение взято с https://colah.github.io/posts/2015-08-Understanding-LSTMs

t=1 to 700h1h700h1h200N×700×200

TimeDistributedDenseDenseDenseh1h2hth1h7001×1×2001×1×200

Почему мы это делаем? Потому что вы не хотите сглаживать вывод RNN.

Почему бы не сгладить выход RNN? Потому что вы хотите, чтобы значения каждого временного шага были отдельными.

Зачем хранить значения каждого временного шага отдельно? Потому что:

  • вы только хотите взаимодействовать значения между его собственным временным шагом
  • Вы не хотите случайного взаимодействия между различными временными шагами и каналами.
rilut
источник
И затем, когда вы применяете TimeDistributedDense, вы применяете слой Dense на каждый временной шаг -> Это значит, что каждый временной шаг делит вес слоя Dense? С плотным слоем это не относится только к последнему временному шагу?
o0omycomputero0o
2
Почему TimeDistributedDense не используется в примере Keras на blog.keras.io/… ?
user1934212
Потому что TimeDistributedDense уже устарела. Поскольку Keras 2.0 Плотные может обрабатывать> 2-мерный тензор хорошо
rilut