Python 向TimeseriesGenerator添加时间延迟?

Python 向TimeseriesGenerator添加时间延迟?,python,keras,Python,Keras,我正在使用kerasTimeseriesGenerator函数创建样本和目标,但希望在输出中添加时间延迟(即,将目标移动一些时间步)。我在文档中看到,对于添加延迟没有本机支持。如何手动添加?以下是我目前的代码: import numpy as np from keras.preprocessing.sequence import TimeseriesGenerator X = np.arange(100000).reshape(10000, 10) y = np.arange(50000).r

我正在使用keras
TimeseriesGenerator
函数创建样本和目标,但希望在输出中添加时间延迟(即,将目标移动一些时间步)。我在文档中看到,对于添加延迟没有本机支持。如何手动添加?以下是我目前的代码:

import numpy as np
from keras.preprocessing.sequence import TimeseriesGenerator

X = np.arange(100000).reshape(10000, 10)
y = np.arange(50000).reshape(10000, 5)

timesteps = 50
step = 1
delay = 20
batch_size = 20

gener = TimeseriesGenerator(X, y, timesteps, sampling_rate=1,
                            stride=step, start_index=0, end_index=None, shuffle=False, reverse=False, batch_size=batch_size)
y的第一批输出是
[[250.251.252.253.254.],[…]
,但我希望输出延迟20个时间步。因此,第一批的y实际上应该从
[[350.351.352.353.354.355],…]

您可以覆盖TimeseriesGenerator类以实现此功能,例如,使用numpy.roll

class TSGen(keras.preprocessing.sequence.TimeseriesGenerator):

def __init__(self, delay, **kwargs):
    self.targets = kwargs['targets']
    self.delay = delay
    kwargs['targets'] = np.roll(kwargs['targets'], np.negative(delay))
    super().__init__(**kwargs)

def __len__(self):
    return int(np.ceil((len(self.targets) - self.delay - self.length) / self.batch_size))
delay参数指定跳过多少步

a1=np.array([[1,2,3,4,5,6,7,8,9]]).reshape(-1,1)
a2=np.array([[10,20,30,40,50,60,70,80,90]]).reshape(-1,1)
b = np.concatenate((a1,a2), axis=1)
在b上使用标准TimeseriesGenerator将产生

[[1 2 3]] => [40]
[[2 3 4]] => [50]
[[3 4 5]] => [60]
[[4 5 6]] => [70]
[[5 6 7]] => [80]
[[6 7 8]] => [90]
使用新类,例如,像这样

ts_gen = TSGen(2, data=b[:,0],targets=b[:,1],length=3,batch_size=1,stride=1,sampling_rate=1)
将产生以下结果:

[[1 2 3]] => [60]
[[2 3 4]] => [70]
[[3 4 5]] => [80]
[[4 5 6]] => [90]