Керас пакетного обучения онлайн прогнозирования не учатся - PullRequest
0 голосов
/ 07 мая 2018

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

Мое намерение состоит в том, чтобы предсказать доступность велосипедов в общедоступной системе обмена, которая имеет 31 станцию,Пока я только тренирую свою модель, чтобы предсказать доступность только одной станции.Я хотел бы делать онлайн прогнозы с пакетным обучением.Я хотел бы начать давать ему несколько велосипедов, например, 00:00 с N заданными временными шагами плюс день года и день недели.

Входные данные таковы:

  • День года, закодированный в виде целых чисел, 1-JAN равен 0, 2-JAN равен 1 ...
  • Время в 5 'интервалах, закодированное в виде целых чисел, аналогично предыдущему, 00:00 - 0, 00:05 - 1 ...
  • День недели, снова закодированный как int

Затем эти 3 столбца нормализуются, затем я добавляю столбцы, которые относятся к велосипедамони представляют собой одно горячее кодирование, если на станции имеется 20 байков, кодированный массив будет иметь длину 21. Затем данные преобразуются в контролируемую проблему более или менее в соответствии с этим руководством.

ТеперьЯ делю свой набор данных на обучающие (65%) и тестовые (35%) выборки.А затем определите нейронную сеть следующим образом:

model = Sequential()
model.add(LSTM(lstm_neurons, batch_input_shape=(1000, 5, 24), stateful=False))
model.add(Dense(max_cases, activation='softmax'))
model.compile(loss='categorical_crossentropy', optimizer='adam', metrics = ['accuracy', 'mse', 'mae'])

enter image description here

Подходит для модели

for i in range(epochs):
    model.fit(train_x, train_y, epochs=1, batch_size=new_batch_size, verbose=2, shuffle=False)
    model.reset_states()

    w = model.get_weights()

Stats

График точности выглядит хорошо, но потери приводят к странным вещам.

Когда тренировка заканчивается, я предсказываю значения, я изменяю состояние без состояния на состояние и изменяю размер пакета

model = Sequential()
model.add(LSTM(lstm_neurons, batch_input_shape=(1, 5, 24), stateful=True))
model.add(Dense(max_cases, activation='softmax'))
model.compile(loss='categorical_crossentropy', optimizer='adam', metrics = ['accuracy', 'mse', 'mae'])
model.set_weights(w)

New model after training

Теперь я прогнозирую, используя значения тестов, полученные ранее

for i in range(0, len(test_x)):

    auxx = test_x[i].reshape((batch_size, test_x[i].shape[0], test_x[i].shape[1])) # (...,n_in,4)

    yhat = model.predict(auxx, batch_size = batch_size)

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

Train plot zoomed

После этого я создаю свой набор данныхсделать онлайн-прогнозирование и прогноз

for i in range(0,290):

    # ...

    predicted_bikes =  model.predict(data_to_feed, batch_size = 1)

   # ...

В результате получится непрерывная линия.

enter image description here

As I 'как мы видели на предыдущем графике, предсказанное значение перемещается как реальный интервал позже к реальному значению, что заставляет меня думать, что нейронная сеть научилась повторять предыдущие значения.Вот почему здесь я получил прямую линию.

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