Архитектура LSTM в реализации Keras? - PullRequest
0 голосов
/ 29 декабря 2018

Я новичок в Keras и прохожу LSTM и подробности его реализации в Keras documentation.Все шло легко, но вдруг я прочитал эту публикацию SO и комментарий.Меня смутило то, что на самом деле является архитектурой LSTM:

Вот код:

model = Sequential()
model.add(LSTM(32, input_shape=(10, 64)))
model.add(Dense(2))

Согласно моему пониманию, 10 обозначает «нет».временных шагов, и каждый из них подается на свои соответствующие LSTM cell;64 обозначают нет.функций для каждого временного шага.

Но комментарий в вышеприведенном посте и фактический ответ сбили меня с толку о значении 32.

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

Рисованное схематичное объяснение было бы весьма полезно для визуализации архитектуры.

EDIT :

Что касается этого другого сообщения SO , то это означает, что 32 представляет длину выходного вектора, который создается каждым LSTM cells, если return_sequences=True.

Если это правда, то как мы можем связать каждый из 32-мерных выходных данных, создаваемых каждой из 10 ячеек LSTM, со следующим плотным слоем?

Кроме того, любезно сообщите, если первый ответ SO пост неоднозначно или нет?

1 Ответ

0 голосов
/ 29 декабря 2018

как нам подключить каждый из 32-мерных выходных данных, создаваемых каждой из 10 ячеек LSTM, к следующему плотному слою?

Это зависит от того, как вы хотите это сделать.Предположим, у вас есть:

model.add(LSTM(32, input_shape=(10, 64), return_sequences=True))

Тогда выход этого слоя имеет форму (10, 32).На этом этапе вы можете либо использовать слой Flatten, чтобы получить один вектор с 320 компонентами, либо использовать TimeDistributed для работы с каждым из 10 векторов независимо:

model.add(TimeDistributed(Dense(15))

Выходная форма этого слоя (10, 15), и одинаковые весовые коэффициенты применяются к выходу каждого модуля LSTM.

Легко понять, нет.ячеек LSTM, необходимых для ввода (указан в интервале времени)

Как выяснить нет.единиц LSTM, требуемых в выходных данных?

Вы получаете либо вывод последней ячейки LSTM (последний временной шаг), либо вывод каждой ячейки LSTM, в зависимости от значенияreturn_sequences.Что касается размерности выходного вектора, это просто выбор, который вы должны сделать, точно так же как размер плотного слоя или количество фильтров в слое сверток.

как каждый из 32-димный вектор из 10 ячеек LSTM подключается к слою TimeDistributed?

Следуя предыдущему примеру, у вас будет тензор (10, 32), то есть вектор размера 32 для каждой из 10 ячеек LSTM,TimeDistributed(Dense(15)) создает матрицу весов (15, 32) и вектор смещения размером 15 и делает:

for h_t in lstm_outputs:
    dense_outputs.append(
        activation(dense_weights.dot(h_t) + dense_bias)
    )

Следовательно, dense_outputs имеет размер (10, 15) и одинаковые весабыли применены к каждому выходу LSTM, независимо .

Обратите внимание, что все по-прежнему работает, когда вы не знаете, сколько временных шагов вам нужно, например, для машинного перевода.В этом случае вы используете None для временного шага;все, что я написал, все еще применяется, с той лишь разницей, что количество временных шагов больше не фиксируется.Keras будет повторять LSTM, TimeDistributed и т. Д. Столько раз, сколько необходимо (зависит от ввода).

...