Прогнозировать только одну выборку временных рядов в пакете с помощью функции Forex () или Forex_on_batch (). - PullRequest
1 голос
/ 05 июня 2019

В таких вопросах как stackoverflow здесь Я читал о batch_size -параметре в predict() -методе Keras или в таких вопросах, как этот о разницеpredict() и predict_on_batch().

Во всяком случае, мой вопрос в них не получил ответа.Я понимаю концепцию batch_size и что я могу предсказать одну партию с помощью predict_on_batch().Но чего я хочу добиться, так это прогнозировать одну выборку из партии с несколькими выборками. Прогноз в этом случае - прогнозирование временных рядов.

Пример

Предположим, у меня есть партия shape(2,5,1) для образцов и целей.Эти партии поступают на такую ​​модель:

sequence_size      = 5
number_of_features = 1
input              = (sequence_size, number_of_features)
batch_size         = 2

model = Sequential()
model.add(GRU(100, return_sequences=True, activation='relu', input_shape=input, batch_size=2, name="GRU"))
model.add(GRU(1, return_sequences=True, activation='relu', input_shape=input, batch_size=batch_size, name="GRU2"))
model.compile(optimizer='adam', loss='mse')

model.summary()

#Summary-output:
_________________________________________________________________
Layer (type)                 Output Shape              Param #   
=================================================================
GRU (GRU)                    (2, 5, 100)               30600     
_________________________________________________________________
GRU2 (GRU)                   (2, 5, 1)                 306       
=================================================================
Total params: 30,906
Trainable params: 30,906
Non-trainable params: 0

Когда я подгоняю эту модель и прогнозирую что-то в форме отдельной партии (2, 5, 1), predict() работает.

def generator(data, batch_size, sequence_size, num_features):
    """Simple generator"""
    while True:
        for i in range(len(data) - (sequence_size * batch_size + sequence_size) + 1):
            start = i
            end   = i + (sequence_size * batch_size)

            yield data[start : end].reshape(batch_size, sequence_size, num_features), \
                    data[end - ((sequence_size * batch_size) - sequence_size) : end + sequence_size].reshape(batch_size, sequence_size, num_features)

#Task: Predict the continuation of a linear range
data = np.arange(100)
hist = model.fit_generator(
                generator=generator(data, batch_size, sequence_size, num_features, False),
                steps_per_epoch=total_batches,
                epochs=200,
                shuffle=False
            )


to_predict = np.asarray([[np.asarray([x]) for x in range(105-sequence_size*batch_size,105,1)]]).reshape(batch_size, sequence_size, num_features)
correct_result    = np.asarray([100,101,102,103,104])
print( model.predict(to_predict).flatten()[0:sequence_size] )

#Prediction output something close to what I want (correct_result)
[ 99.92908 100.95854 102.32129 103.28584 104.20213 ]

Ради лучшего понимания;выход генератора для каждой партии выглядит следующим образом:

(array([[ [0],[1],[2],[3],[4] ], [ [5],[6],[7],[8],[9] ]]),   #Sample of shape (2, 5, 1), meaning two sequences of length 5 with one feature
 array([[[5],[6],[7],[8],[9]], [[10],[11],[12],[13],[14]]]))  #Target of shape (2, 5, 1), meaning two sequences of length 5 with one feature

Но я хочу предсказать форму, подобную (1, 5, 1).Резонанс: одна партия содержит две последовательности (следовательно, две выборки) соответственно 5 временных шагов.Когда я предоставляю форму (2, 5, 1), это означает, что я должен использовать последовательности для прогноза, а predict() также возвращает прогноз для следующих двух последовательностей (поскольку цель обучения также была в форме (2, 5, 1)).

Пока я могу ввести последовательность, которая должна быть предсказана (в shape(1, 5, 1) с выводом (1, 5, 1)) в predict_on_batch() и вернуть только первый результат (predict_on_batch() также возвращаетформа (2, 5, 1), но оба образца дают одинаковые предсказанные значения).

to_predict = np.asarray([[np.asarray([x]) for x in range(95,100,1)]])
correct    = np.asarray([100,101,102,103,104])
print( model.predict_on_batch(to_predict)[0].flatten() )

#Output:
[ 99.92908 100.95854 102.32129 103.28584 104.20213 ]

Как видно, выходные данные такие же, как и у predict(), но я ввел только одинобразец из партии в shape(1, 5, 1).Кроме того, predict_on_batch() не выдал никакой ошибки.Поскольку результаты одинаковы, очевидно, нет причин предоставлять целую партию (в моем примере партия содержит только два образца, но, конечно, это может быть выше в реальных задачах).


Таким образом, я получил обходной путь для моего вопроса.Но у меня такое ощущение, что мне не хватает метода, который позволяет это без обходных путей. Итак, мой вопрос: :


Как я могу предсказать одну выборку из одного пакета, при этом этот прогноз также выдает только один прогноз?


Редактировать:
Я знаю о этом руководстве на machinelearningmastery.com.Во всяком случае, это также просто предоставляет обходные пути (я также считаю, копирование весов в новую сеть обходного пути).

...