在像这样的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教程。无论如何,这也只是提供了解决方法(我还考虑了将权重复制到新网络的解决方法)。