Распределенный по времени слой и последовательности возврата и т. Д. Для LSTM в Керасе

Извините, я новичок в RNN. Я прочитал этот пост на слое TimeDistributed.

Я преобразовал свои данные в Keras requried [samples, time_steps, features]: [140*50*19], что означает, что у меня есть 140 точек данных, каждая из которых имеет 50 временных шагов и 19 функций. Мой результат имеет форму [140*50*1]. Меня больше волнует точность последней точки данных. Это проблема регрессии.

Мой текущий код:

x = Input((None, X_train.shape[-1]) , name='input')
lstm_kwargs = { 'dropout_W': 0.25, 'return_sequences': True, 'consume_less': 'gpu'} 
lstm1 = LSTM(64, name='lstm1', **lstm_kwargs)(x)
output = Dense(1, activation='relu', name='output')(lstm1)
model = Model(input=x, output=output)
sgd = SGD(lr=0.00006, momentum=0.8, decay=0, nesterov=False)
optimizer = sgd
model.compile(optimizer=optimizer, loss='mean_squared_error')

Мои вопросы:

  1. В моем случае многие ко многим, поэтому мне нужно использовать return_sequences=True? Как насчет того, чтобы мне нужно было только предсказание последнего временного шага, оно было бы многозначным. Итак, мне нужно, чтобы мой вывод был [140*1*1] и return_sequences=False?
  2. Есть ли способ повысить точность моих последних временных точек, если я использую "многие ко многим"? Меня это волнует больше, чем точность других точек.
  3. Я попытался использовать слой TimeDistributed как

    output = TimeDistributed(Dense(1, activation='relu'), name='output')(lstm1)
    

    производительность кажется хуже, чем без использования слоя TimeDistributed. Почему это так?

  4. Пробовал использовать optimizer=RMSprop(lr=0.001). Я думал, что RMSprop должен стабилизировать NN. Но мне никогда не удавалось получить хороший результат с RMSprop.
  5. Как выбрать хороший lr и импульс для SGD? Я тестировал разные комбинации вручную. Есть ли в keras метод перекрестной проверки?

person Echo    schedule 15.05.2017    source источник
comment
Почему вы пишете [140*50*19] вместо [140, 50, 19]? Форма действительно [133000]?   -  person sietschie    schedule 16.05.2017
comment
Спасибо, я имел в виду [140, 50, 19]   -  person Echo    schedule 16.05.2017


Ответы (1)


So:

  1. Да - return_sequences=False заставляет вашу сеть выводить только последний элемент предсказания последовательности.
  2. Вы можете определить нарезку вывода с помощью слоя Lambda. Здесь вы можете найти пример того, как сделать это. Разделив вывод, вы можете предоставить дополнительный вывод, в который будете вводить значения последнего временного шага.
  3. С вычислительной точки зрения эти два подхода эквивалентны. Возможно, проблема заключается в случайности, вносимой весовой выборкой.
  4. На самом деле - использование RMSProp в качестве первого выбора для RNN является практическим правилом, а не общим доказанным законом. Более того - настоятельно не рекомендуется изменять его параметры. Так что это может вызвать проблемы. Другое дело, что LSTM нужно много времени для стабилизации. Может, стоит оставить на большее количество эпох. И последнее - возможно, ваши данные могут способствовать другой функции активации.
  5. Вы можете использовать keras.sklearnWrapper.
person Marcin Możejko    schedule 16.05.2017
comment
Уважаемый, если вы установите return_sequences = True, то форма вывода будет [140,50,1]. В таком случае, сколько нейронов я могу учесть на выходе? Всего 1 нейрон, 50 нейронов или 1 нейрон на каждом временном шаге, что в сумме составляет 50? - person Wesin Alves; 26.07.2018