Ответ 1
Уровень LSTM и обертка TimeDistributed - это два разных способа получить отношения "многие ко многим", которые вы хотите.
- LSTM будет употреблять слова вашего предложения по одному, вы можете выбрать через "return_sequence", чтобы вывести что-то (состояние) на каждом шаге (после каждого обрабатываемого слова) или вывести только что-то после того, как последнее слово было съедено. Таким образом, с return_sequence = TRUE вывод будет последовательностью той же длины, с return_sequence = FALSE, выход будет всего одним вектором.
- TimeDistributed. Эта оболочка позволяет применить один слой (например, Dense, например) к каждому элементу вашей последовательности независимо. Этот слой будет иметь одинаковые веса для каждого элемента, то же самое будет применяться к каждому слову, и он, конечно же, вернет последовательность слов, обрабатываемых независимо.
Как вы можете видеть, разница между ними заключается в том, что LSTM "распространяет информацию через последовательность, она будет есть одно слово, обновлять свое состояние и возвращать его или нет. Затем оно будет продолжаться со следующим словом, все еще сохраняя информацию из предыдущих..., как и в TimeDistributed, слова будут обрабатываться одинаково сами по себе, как если бы они находились в силосах, и один и тот же слой относится к каждому из них.
Поэтому вам не нужно использовать LSTM и TimeDistributed в строке, вы можете делать все, что хотите, просто имейте в виду, что делают каждый из них.
Надеюсь, это яснее?
EDIT:
Время, распределенное в вашем случае, применяет плотный слой к каждому элементу, который был выведен LSTM.
Возьмем пример:
У вас есть последовательность слов n_words, которые встроены в размеры emb_size. Таким образом, ваш вход представляет собой 2D-тензор формы (n_words, emb_size)
Сначала вы применяете LSTM с выходным размером = lstm_output
и return_sequence = True
. Выход по-прежнему будет сквален, поэтому он будет двумерным тензором формы (n_words, lstm_output)
.
Итак, у вас есть векторы n_words длины lstm_output.
Теперь вы применяете плотный слой TimeDistributed, используя, например, 3 измерения, как параметр Dense. Итак, TimeDistributed (Плотный (3)).
Это применит Dense (3) n_words раз, к каждому вектору размера lstm_output в вашей последовательности независимо... все они станут векторами длины 3. Ваш результат по-прежнему будет последовательностью, так что 2D-тензор, теперь форма (n_words, 3)
,
Яснее?: -)