仅使用predict()或predict_on_batch()

时间:2019-06-05 16:58:47

标签: python machine-learning keras time-series predict

在像这样的here这样的stackoverflow问题中,我读到了Keras的batch_size方法中的predict()参数,或者诸如this one这样的问题,关于{ {1}}和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 这样的形状。理由:一个批次包含两个分别为5个时间步长的序列(因此有两个样本)。当我提供形状(1, 5, 1)时,这意味着我必须使用序列进行预测,并且(2, 5, 1)还返回以下两个序列的预测(因为训练目标的形状也为{ {1}}。

到目前为止,我所能做的就是在predict()中输入一个将被预测的序列(在(2, 5, 1)中,输出为shape(1, 5, 1)),并且只返回第一个结果({{ 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 ] 没有引发任何错误。由于结果相同,因此显然没有必要提供整个批次(在我的示例中,批次仅包含两个样本,但是在实际任务中当然可以更高)。


因此,我有一个解决此问题的方法。但我有一种感觉,我想念一种没有解决办法的方法。 我的问题是


我如何才能从单个批次中预测单个样本,因此该前提也只能输​​出单个预测?


编辑:
我知道machinelearningmastery.com上的this教程。无论如何,这也只是提供了解决方法(我还考虑了将权重复制到新网络的解决方法)。

0 个答案:

没有答案