как нам подключить каждый из 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 и т. Д. Столько раз, сколько необходимо (зависит от ввода).