Python 如何编写自定义TimeseriesGenerator来处理包含timeseries数据的一批输入文件?

Python 如何编写自定义TimeseriesGenerator来处理包含timeseries数据的一批输入文件?,python,tensorflow,keras,time-series,Python,Tensorflow,Keras,Time Series,我正试图用Python编写一个自定义TimeseriesGenerator来批处理一些包含timeseries数据的文件。这些文件的组织方式如下: 资料/ 训练/ 列车数据 列车数据\u 01 列车数据34 验证/ val_数据_00 val_数据_08 试验/ 测试数据 测试数据 每个文件都包含从惯性测量单元获得的timeseries数据,以及在该实例中执行的活动类型的标签。因此,各个文件中的数据用表示以下内容的列进行组织: 附件X,附件Y,附件Z,陀螺仪X,陀螺仪

我正试图用Python编写一个自定义TimeseriesGenerator来批处理一些包含timeseries数据的文件。这些文件的组织方式如下:

资料/

  • 训练/
    • 列车数据
    • 列车数据\u 01
    • 列车数据34
  • 验证/
    • val_数据_00
    • val_数据_08
  • 试验/
    • 测试数据
    • 测试数据
每个文件都包含从惯性测量单元获得的timeseries数据,以及在该实例中执行的活动类型的标签。因此,各个文件中的数据用表示以下内容的列进行组织:
附件X,附件Y,附件Z,陀螺仪X,陀螺仪Y,陀螺仪Z,标签

现在,我想开发一个模型来预测给定输入时间序列的活动类型(即标签)。因此,我希望使用滑动窗口方法,使用用户定义的
window\u LENGTH
window\u STEP

理想情况下,我需要一个路径提供的函数,例如
train\u data\u dir=“./data/train”
,然后生成可与
fit\u generator
一起使用的成批输入数据来训练模型

现在,我循环遍历目录中的文件:

#从单个文件加载数据
以open(os.path.join(train\u data\u dir,fname),“rb”作为填充:
十、 y=cp.荷载(填充)
#定义窗口长度、步长和批次大小
win_len=512
win_步长=128
批量大小=64
#实例化TimeseriesGenerator对象
timeseries\u gen=MyTimeseriesGenerator(X,y,length=win\u len,stride=win\u step,batch\u size=batch\u size,shuffle=False,mode=“last”)
这里,
TimeseriesGenerator
对象定义为:

类MyTimeseriesGenerator(tf.keras.utils.Sequence):
def uuu init uuuu(self,data,label,length,stride=1,batch_size=128,shuffle=False,mode=“last”):
"""
自定义Timeseries生成器的类构造函数。
每个'Sequence'都必须实现''.'获取项'.'和'.'列'.'方法,
见:https://www.tensorflow.org/api_docs/python/tf/keras/utils/Sequence
方法“\uuu getitem\uuuu”应返回完整的批处理。
"""
#self.data=np.asarray([data[n:n+length,:]表示范围内的n(0,len(data)-length+1,stride)])
#self.labels=np.asarray([标签[n+length-1]表示范围内的n(0,len(标签)-长度+1,跨距)])
self.labels=标签
self.length=长度
self.stride=步幅
self.batch\u size=批次大小
self.shuffle=洗牌
self.mode=mode
self.data,self.labels=self.get_数据(数据,标签)
定义(自我):
"""
序列中的批数。
"""
返回len(self.data)//self.batch\u size
def get_数据(自身、数据、标签):
"""
获取数据和标签。
"""
#将数据读入具有维度的numpy数组(n_窗口、窗口长度、n_通道)
X=np.asarray([data[n:n+self.length,:]表示范围内的n(0,len(data)-self.length+1,self.stride)])
#将标签读入具有尺寸的numpy数组(n_窗口,n_输出)
如果self.mode==“last”:
y=np.asarray([标签[n+self.length-1]表示范围(0,len(标签)-self.length+1,self.stride)])
返回X,y
定义uu获取项目uu(自身,索引):
"""
在“索引”位置获取批处理。
"""
#下一批
批次x=自身数据[索引*自身批次大小:(索引+1)*自身批次大小]
批次y=self.labels[索引*自身批次大小:(索引+1)*自身批次大小]
返回批次x,批次y
这对这个文件很有效,但是我如何调整代码来为相应文件夹中的所有文件生成成批的培训/验证/测试?我想我需要一个叫做发电机的东西,如:

timeseries\u gen=MyTimeseriesGenerator(path=“train\u data\u dir”,length=win\u len,…)
理想情况下,我还希望能够选择对生成的训练样本进行无序排列(通过
shuffle
关键字和
on\u epoch\u end()
方法)

注:提出了一个类似的问题,但没有跟进


编辑:或者在所有培训文件上生成一个大型numpy数组,并将此数组提供给timeseries generator,这是一种有效的解决方法吗?

找到解决方案了吗?找到解决方案了吗?