我正在使用用于神经网络的Keras库处理时间序列预测问题。我正在尝试将训练集分为实际的训练集和验证集。我不想从我的测试集的末尾获取所有验证数据,而是每5个训练样本进行1个验证测试。
我设法创建了两个生成器
training_sequence = TimeseriesGenerator(train_x, train_y, length=w, sampling_rate=1, batch_size=batch_s)
validation_sequence = TimeseriesGenerator(train_x, train_y, length=w, sampling_rate=1, stride=5, batch_size=batch_s)
我会用它们进行训练,例如:
history = model.fit_generator(training_sequence, validation_sequence, epochs=200, callbacks=[early_stopping_monitor], verbose=1)
现在,我正在获得正确的验证序列,但是我无法弄清楚如何从训练序列中取出这些样本(这样就无法对已经训练过的数据进行验证)。
我试图用包装器处理训练生成器,如下所示:
def get_generator(data, targets, length, batch_size):
data_gen = TimeseriesGenerator(data, targets, length=length,
sampling_rate=1, batch_size=batch_size)
for i in range(len(data_gen)):
if i % 5 != 0:
x, y = data_gen[i]
yield x, y
但是当我运行代码时,出现此错误:
ValueError: `steps_per_epoch=None` is only valid for a generator based on the `keras.utils.Sequence` class. Please specify `steps_per_epoch` or use the `keras.utils.Sequence` class.
如果我添加
steps_per_epoch=len(train_x)/batch_s
我收到“ StopIteration”错误。
答案 0 :(得分:2)
发生“ StopIteration”错误,因为模型要求Generator发出数据,但是Generator已经用尽了所有数据。
想象一下,您的train_x中有320个元素,批量大小为32。 因此,steps_per_epoch =(320/32)= 10。
因此,每个纪元必须屈服10次。 但是由于if条件,我们在i = 5和i = 10时不会屈服。 因此,我们的收益只有8倍,但我们已经告诉模型,我们将通过steps_per_epoch收益10倍。
steps_per_epoch=len(train_x)/batch_s
no_missing_steps=steps_per_epoch/5
steps_per_epoch=steps_per_epoch-no_missing_steps
如果这不起作用,请尝试此操作。将while循环封装在while循环中。
def get_generator(data, targets, length, batch_size):
data_gen = TimeseriesGenerator(data, targets, length=length,
sampling_rate=1, batch_size=batch_size)
while true:
for i in range(len(data_gen)):
if i % 5 != 0:
x, y = data_gen[i]
yield x, y