Запрос о форме ввода-вывода LSTM в Керасе - PullRequest
0 голосов
/ 15 февраля 2019

Я пытаюсь предсказать временные ряды с помощью LSTM и пишу свой код в Keras с помощью внутреннего интерфейса Tendorflow.У меня есть 30 входных функций (непрерывное значение) и 1 двоичный выход.Я хотел бы использовать 20 предыдущих временных шагов каждой входной функции, чтобы предсказать выходные данные следующего временного шага.Мой размер пакета 52. Однако у меня возникают трудности при попытке определить форму входного слоя.

Согласно примеру LSTM с накоплением в документе Keras, последним измерением трехмерного тензора будет 'data_dim',Это входное измерение или выходное измерение?Если это выходное измерение, то я не могу использовать более одной входной функции, так как в моем случае input_shape будет (batch_size = 52, time_step = 20, data_dim = 1).

С другой стороны,если data_dim является входной формой, то я попытался определить четырехслойный LSTM, а форма модели выглядит следующим образом.

Слой (тип) Выходная форма Параметр #

input_2 (InputLayer) (52, 20, 30) 0


lstm_3 (LSTM) (52, 20, 128) 81408


lstm_4 (LSTM) (52, 128) 131584


density_2 (Плотный) (52, 1) 129

Всего параметров: 213,121 Обучаемые параметры: 213,121 Необучаемые параметры: 0

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

input_layer=Input(batch_shape=(batch_size,input_timesteps,input_dims))
lstm1=LSTM(num_neurons,activation = 'relu',dropout=0.0,stateful=False,return_sequences=True)(input_layer)
lstm2=LSTM(num_neurons,activation = 'relu',dropout=0.0,stateful=False,return_sequences=False)(lstm1)
output_layer=Dense(1, activation='sigmoid')(lstm2)
model=Model(inputs=input_layer,outputs=output_layer)

Я не получаю очень хороший результат и, таким образом, пытаюсь понять, есть ли какие-либо проблемы с моим кодом.

1 Ответ

0 голосов
/ 03 марта 2019

Если вы хотите использовать «глубокое обучение», применяя больше слоев, вам следует постепенно уменьшать пространство объектов скрытого слоя до того момента, пока вы не достигнете слоя, который выполняет задачу классификации (выходной слой).Вы на самом деле используете большее пространство пространственных объектов в скрытом слое. Вы уверены, что ваши данные способны соответствовать этому?У вас достаточно данных, чтобы это позволить?В противном случае я бы предложил вам что-то подобное, чтобы экстраполировать наиболее важные измерения:

num_neurons1 = int(input_dims/2)
num_neurons2 = int(input_dims/4)
input_layer=Input(batch_shape=(batch_size, input_timesteps, input_dims))
lstm1=LSTM(num_neurons, activation = 'relu', dropout=0.0, stateful=False, return_sequences=True, kernel_initializer="he_normal")(input_layer)
lstm2=LSTM(num_neurons2, activation = 'relu', dropout=0.0, stateful=False, return_sequences=False, kernel_initializer="he_normal")(lstm1)
output_layer=Dense(1, activation='sigmoid')(lstm2)
model=Model(inputs=input_layer,outputs=output_layer)

Также вы используете relu в качестве функции активации.Это соответствует вашим данным?Было бы лучше, если бы у вас были только положительные данные после пересчета и нормализации.В случае, если это подходит, вы также можете соответствующим образом инициализировать ядро.Чтобы лучше понять проблему, вы также можете опубликовать параметры оптимизатора и поведение во время тренировок в эпоху.

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