В таких вопросах как 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.Во всяком случае, это также просто предоставляет обходные пути (я также считаю, копирование весов в новую сеть обходного пути).