Keras Masking для RNN с шагами изменения времени

Я пытаюсь установить RNN в Keras, используя последовательности, которые имеют различную длину времени. Мои данные находятся в массиве Numpy с форматом (sample, time, feature) = (20631, max_time, 24) где max_time определяется во время выполнения как количество шагов времени, доступных для выборки с наибольшим количеством штампов времени. Очевидно, я добавил начало каждого временного ряда с 0 , за исключением самого длинного.

Сначала я определил свою модель так …

 model = Sequential() model.add(Masking(mask_value=0., input_shape=(max_time, 24))) model.add(LSTM(100, input_dim=24)) model.add(Dense(2)) model.add(Activation(activate)) model.compile(loss=weibull_loglik_discrete, optimizer=RMSprop(lr=.01)) model.fit(train_x, train_y, nb_epoch=100, batch_size=1000, verbose=2, validation_data=(test_x, test_y)) 

Для полноты, вот код функции потерь:

 def weibull_loglik_discrete(y_true, ab_pred, name=None): y_ = y_true[:, 0] u_ = y_true[:, 1] a_ = ab_pred[:, 0] b_ = ab_pred[:, 1] hazard0 = k.pow((y_ + 1e-35) / a_, b_) hazard1 = k.pow((y_ + 1) / a_, b_) return -1 * k.mean(u_ * k.log(k.exp(hazard1 - hazard0) - 1.0) - hazard1) 

И вот код для пользовательской функции активации:

 def activate(ab): a = k.exp(ab[:, 0]) b = k.softplus(ab[:, 1]) a = k.reshape(a, (k.shape(a)[0], 1)) b = k.reshape(b, (k.shape(b)[0], 1)) return k.concatenate((a, b), axis=1) 

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

Все становится лучше, если я удаляю маскирующий слой, что заставляет меня думать, что что-то не так с слоем маскировки, но насколько я могу судить, я точно следил за документацией.

Есть что-то неправильное с маскирующим слоем? Я что-то пропустил?

2 Solutions collect form web for “Keras Masking для RNN с шагами изменения времени”

Я не мог проверить без фактических данных, но у меня был аналогичный опыт с RNN. В моем случае нормализация решила проблему. Добавьте к вашей модели слой нормализации.

Способ реализации маскировки должен быть правильным. Если у вас есть данные с формой (выборки, временные метки, функции) , и вы хотите маскировать временные метки, не содержащие данных, с нулевой маской того же размера, что и аргумент features, тогда вы добавляете Masking(mask_value=0., input_shape=(timesteps, features)) . См. Здесь: keras.io/layers/core/#masking

Ваша модель потенциально может быть слишком простой и / или ваше количество эпох может быть недостаточным для того, чтобы модель различала все ваши классы. Попробуйте эту модель:

 model = Sequential() model.add(Masking(mask_value=0., input_shape=(max_time, 24))) model.add(LSTM(256, input_dim=24)) model.add(Dense(1024)) model.add(Dense(2)) model.add(Activation(activate)) model.compile(loss=weibull_loglik_discrete, optimizer=RMSprop(lr=.01)) model.fit(train_x, train_y, nb_epoch=100, batch_size=1000, verbose=2, validation_data=(test_x, test_y)) 

Если это не сработает, попробуйте удвоить эпохи несколько раз (например, 200, 400) и посмотрите, улучшит ли это результаты.

  • Разница (ы) между scipy.stats.linregress, numpy.polynomial.polynomial.polyfit и statsmodels.api.OLS
  • Поддержание подкласса numpy внутри контейнера после применения ufunc
  • Как показать все изображение при использовании OpenCV warpPerspective
  • Отображение данных из двоичного файла в python
  • График графика графика из данных гистограммы в matplotlib
  • Как заменить значения в диапазоне в кадре данных pandas с другим значением в одном и том же фрейме данных на основе условия
  • Не удалось передать массив ввода из формы (1285) в форму (1285, 5334)
  • Раунд за один день до ближайшего шага
  • Python - лучший язык программирования в мире.