Действительно ли LSTM Keras учитывает состояние ячейки и предыдущий вывод? - PullRequest
2 голосов
/ 10 июня 2019

За последний день я узнал о LSTM, а затем решил посмотреть учебник, в котором для его создания используется Keras. Я посмотрел несколько уроков, и все они имели производную от

model = Sequential()
model.add(LSTM(10, input_shape=(1,1)))
model.add(Dense(1, activation='linear'))
model.compile(loss='mse', optimizer='adam')
X,y = get_train()
model.fit(X, y, epochs=300, shuffle=False, verbose=0)

тогда они предсказали, используя

 model.predict(X, verbose=0)

мой вопрос: разве вы не должны давать предыдущее предсказание вместе с входными данными и состоянием ячейки, чтобы предсказать следующий результат, используя LSTM? Кроме того, что представляет 10 в model.add(LSTM(10, input_shape(1,1))?

Ответы [ 3 ]

1 голос
/ 11 июня 2019

Вы должны дать предыдущий прогноз состоянию LSTM. Если вы вызываете предикат, LSTM будет инициализироваться каждый раз, он не будет помнить состояние из предыдущих прогнозов.

Обычно (например, если вы генерируете текст с помощью lstm), у вас есть цикл, где вы делаете что-то вроде этого:

# pick a random seed
start = numpy.random.randint(0, len(dataX)-1)
pattern = dataX[start]
print "Seed:"
print "\"", ''.join([int_to_char[value] for value in pattern]), "\""
# generate characters
for i in range(1000):
    x = numpy.reshape(pattern, (1, len(pattern), 1))
    x = x / float(n_vocab)
    prediction = model.predict(x, verbose=0)
    index = numpy.argmax(prediction)
    result = int_to_char[index]
    seq_in = [int_to_char[value] for value in pattern]
    sys.stdout.write(result)
    pattern.append(index)
    pattern = pattern[1:len(pattern)]
print "\nDone."

(пример скопирован с machinelearningmastery.com )

Важными являются следующие строки:

pattern.append(index)
pattern = pattern[1:len(pattern)]

Здесь они добавляют следующий символ в шаблон, а затем отбрасывают первый символ, чтобы иметь длину ввода, соответствующую ожидаемому значению от lstm. Затем приведите его к массиву numpy (x = np.reshape (...)) и сделайте прогноз на основе модели с созданным выводом. Поэтому, чтобы ответить на ваш первый вопрос, вам нужно снова ввести вывод.

По второму вопросу число 10 соответствует числу клеток lstm, которое вы имеете в слое. Если вы не используете return_sequence = True, это соответствует выходному размеру этого слоя.

0 голосов
/ 11 июня 2019

Давайте разберем его на части и наглядно представим

LSTM(10, input_shape=(3,1))): определяет LSTM, длина последовательности которого равна 3, т.е. LSTM будет развернут в течение 3 временных шагов.На каждом временном шаге LSTM будет принимать входные данные размера 1. Выход (а также размер скрытого состояния и всех других шлюзов LSTM) равен 10 (вектор или размер 10)

![enter image description here

Вам не нужно выполнять развёртывание вручную (переход в текущее скрытое состояние в следующее состояние), об этом заботится слой keras / tenorflow LSTM.Все, что вам нужно сделать, это передать данные в формате (batch_size X time_steps X input_size).

Dense(1, activation='linear'): это плотный слой с линейной активацией, который принимает в качестве входных данных выход предыдущего слоя (т. Е. Выходной сигнал LSTM, который будет вектором размера 10 последнего развертывания).Он вернет вектор размером 1.

enter image description here

То же самое можно проверить с помощью model.summary()

0 голосов
/ 10 июня 2019

Ваш 1-й вопрос:

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

нет, вам не нужно этого делать.Насколько я понимаю, он хранится в ячейке LSTM, поэтому LSTM использует столько ОЗУ

, если у вас есть данные с формой, похожей на эту:

(100,1000)

, если вы подключите этов функцию подгонки, каждая эпоха будет работать на 100 списках.LSTM запомнит 1000 графиков данных перед обновлением, когда перейдет к следующему списку.

2nd:

Кроме того, что представляет 10 в model.add (LSTM (10, input_shape (1,1))?

это форма 1-го слоя после ввода, поэтому ваша модель в настоящее время имеет форму:

1,1 10 1

надеюсь, это поможет:)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...