LSTM: Как эффективно понять и использовать return_sequence = False? - PullRequest
0 голосов
/ 11 сентября 2018

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

B := Number of batches

T := Number of timesteps per batch

N := Number of features per timestep 

Моя конечная цель - вызвать model.predict для одной партии (которая, конечно, не использовалась для обучения).Таким образом, это будет выглядеть так:

prediction = model.predict(unknown)
unknown.shape = (T, N)
prediction.shape = (N,)

Я пробовал множество сетей.

Я не могу заставить это работать

model.add(LSTM(N, input_shape=(T, N), return_sequences=True))
model.add(Dropout(0.2))
model.add(LSTM(N, input_shape=(T, N), return_sequences=False)) 
model.add(Dense(N))

Однако, я МОГУ заставить это работать

model.add(LSTM(N, input_shape=(T, N), return_sequences=True))
model.add(Dropout(0.2))
model.add(LSTM(N, input_shape=(T, N), return_sequences=True)) # True here 
model.add(Dense(N))

Что не так с return_sequence = True, если выходные данные включаютэтот последний временной шаг, который f (t + 1), который я ищу?Я полагаю, что ничего, но это не решает фундаментальную проблему, которая заключается в том, что я не до конца понимаю, как построить эти сети.Как я уже сказал, я хочу, чтобы все было как можно более общим и глубоко понимать сети, прежде чем я начну погружаться в эксперименты.

Я буду проводить эксперименты с очень разными значениями для B, T и N, чтобы увидеть, какие из них работаютсамое лучшее.

Я пытался читать документы и еще много чего, но я довольно застрял и разочаровался, поэтому подумал, что повернусь к сообществу.

Ответы [ 2 ]

0 голосов
/ 13 сентября 2018

Надеюсь, что следующий код поможет, например, если число узлов в каждом слое равно 150

model.add(LSTM(150, return_sequences=True,input_shape=(T,N)))
model.add(LSTM(150))
model.add(Dense(1))

И удалить input_shape = (T, N) во втором lstm в вашем коде. Вы указали, что он ожидает2D-массив (T, N), но первый LSTM предоставляет 3d-массив, состоящий из (1, T, N)

0 голосов
/ 11 сентября 2018

Нет необходимости указывать аргумент input_shape во втором рекуррентном слое. Этот параметр явно требуется, когда рекуррентный уровень является первым уровнем в сети, но не иначе.

Если вы хотите указать форму входного пакета на каждом повторяющемся слое, не забудьте установить параметр stateful = True, чтобы преобразовать ваши LSTM в состояние (и использовать этот аргумент только на первом уровне вашей сети).

...