如何在TensorFlow时间序列窗口中从特征数据移除标签数据
修改TensorFlow WindowGenerator的split_window函数分离特征与标签
针对你需要从特征数据中移除标签列的需求,直接修改WindowGenerator类中的split_window方法即可,核心是对特征张量的列维度进行切片,把最后一列单独作为标签,其余列作为输入特征。
修改后的split_window函数
def split_window(self, features): # 输入特征:取所有样本、输入窗口时间步、除最后一列外的所有特征列 inputs = features[:, :-self.label_width, :-1] # 预测标签:取所有样本、标签窗口时间步、仅最后一列作为标签 labels = features[:, -self.label_width:, -1:] # 维持TensorFlow对张量形状的约束,避免后续训练报错 inputs.set_shape([None, self.input_width, None]) labels.set_shape([None, self.label_width, None]) return inputs, labels
代码说明
- 特征切片逻辑:
[:, :-self.label_width, :-1]
三个维度分别对应:样本批量、输入窗口的时间步(剔除标签对应的时间步)、所有特征列(排除最后一列标签列) - 标签切片逻辑:
[:, -self.label_width:, -1:]
三个维度分别对应:样本批量、标签窗口的时间步(比如单步预测就是最后1个时间步)、仅保留最后一列作为标签 - 形状约束:保留
set_shape调用是为了让TensorFlow明确张量的维度信息,避免模型编译或训练时出现形状不匹配的问题
测试验证
假设你的输入特征张量形状为(32, 11, 4)(32个样本、10个输入时间步+1个标签时间步、4个数据列),修改后:
- 输入特征
inputs的形状为(32, 10, 3),对应前3列特征数据 - 标签
labels的形状为(32, 1, 1),对应第4列标签数据
内容的提问来源于stack exchange,提问作者Abdelrahman Hamdy
相关产品推荐
相关产品推荐

