如何使用Keras TimeseriesGenerator对每n个训练样本取一个验证样本?

时间:2018-07-16 14:25:05

标签: python tensorflow keras

我正在使用用于神经网络的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”错误。

1 个答案:

答案 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