Я пытаюсь примирить свое понимание LSTM и указал здесь на этом посту Кристофера Олаха, реализованного в Keras. Я следую блогу, написанному Джейсоном Браунли для учебника Keras. Я в основном смущен,
- Перестройка рядов данных в
[samples, time steps, features]
и, - LSTM с сохранением состояния
Давайте сосредоточимся на вышеуказанных двух вопросах со ссылкой на следующий код:
# reshape into X=t and Y=t+1
look_back = 3
trainX, trainY = create_dataset(train, look_back)
testX, testY = create_dataset(test, look_back)
# reshape input to be [samples, time steps, features]
trainX = numpy.reshape(trainX, (trainX.shape[0], look_back, 1))
testX = numpy.reshape(testX, (testX.shape[0], look_back, 1))
########################
# The IMPORTANT BIT
##########################
# create and fit the LSTM network
batch_size = 1
model = Sequential()
model.add(LSTM(4, batch_input_shape=(batch_size, look_back, 1), stateful=True))
model.add(Dense(1))
model.compile(loss='mean_squared_error', optimizer='adam')
for i in range(100):
model.fit(trainX, trainY, nb_epoch=1, batch_size=batch_size, verbose=2, shuffle=False)
model.reset_states()
Примечание: create_dataset принимает последовательность длины N и возвращает массив N-look_back
каждый из которых является последовательностью длины look_back
.
Что такое временные шаги и возможности?
Как видно, TrainX представляет собой трехмерный массив с Time_steps, а Feature - последние два измерения соответственно (3 и 1 в этом конкретном коде). Что касается изображения ниже, значит ли это, что мы рассматриваем many to one
случай, когда число розовых коробок составляет 3? Или буквально означает, что длина цепи равна 3 (т.е. Рассматривается только 3 зеленых квадрата).
Является ли аргумент признаков актуальным, когда мы рассматриваем многомерные ряды? например, моделирование двух финансовых запасов одновременно?
Стойкие LSTM
Поддерживает ли LSTM с точки зрения состояния, что мы сохраняем значения памяти ячейки между сериями партий? Если это так, batch_size
- это один, и память сбрасывается между batch_size
обучения, так что смысл говорить, что он был сдержанным. Я предполагаю, что это связано с тем, что данные обучения не перетасовываются, но я не уверен, как это сделать.
Какие-нибудь мысли? Ссылка на изображение: http://karpathy.github.io/2015/05/21/rnn-effectiveness/
Изменить 1:
Немного смущенно о комментарии @van о том, что красные и зеленые коробки равны. Итак, просто чтобы подтвердить, соответствуют ли следующие вызовы API развернутым диаграммам? Особенно отметив вторую диаграмму (batch_size
был произвольно выбран.):
Изменить 2:
Для людей, которые прошли углубленный курс Udacity и все еще запутались в аргументе time_step, просмотрите следующее обсуждение: https://discussions.udacity.com/t/rnn-lstm-use-implementation/163169
Обновить:
Оказывается, model.add(TimeDistributed(Dense(vocab_len)))
был тем, что я искал. Вот пример: https://github.com/sachinruk/ShakespeareBot
Update2:
Я кратко изложил большинство из моего понимания LSTM здесь: https://www.youtube.com/watch?v=ywinX5wgdEU