You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

实例化TemporalFusionTransformer或优化超参数时触发元组属性错误

TemporalFusionTransformer实例化/超参数优化时AttributeError问题解决思路

错误信息

/usr/local/lib/python3.8/dist-packages/pytorch_forecasting/models/base_model.py in __init__(self, log_interval, log_val_interval, learning_rate, log_gradient_flow, loss, logging_metrics, reduce_on_plateau_patience, reduce_on_plateau_reduction, reduce_on_plateau_min_lr, weight_decay, optimizer_params, monotone_constaints, output_transformer, optimizer)
    260         init_args = get_init_args(frame)
    261         self.save_hyperparameters(
--> 262             {name: val for name, val in init_args.items() if name not in self.hparams and name not in ["self"]}
    263         )
    264 

AttributeError: 'tuple' object has no attribute 'items'

相关代码片段

超参数优化代码

study = optimize_hyperparameters(
    train_dataloader,
    val_dataloader,
    model_path="optuna_test",
    n_trials=200,
    max_epochs=50,
    gradient_clip_val_range=(0.01, 1.0),
    hidden_size_range=(8, 128),
    hidden_continuous_size_range=(8, 128),
    attention_head_size_range=(1, 4),
    learning_rate_range=(0.001, 0.1),
    dropout_range=(0.1, 0.3),
    trainer_kwargs=dict(limit_train_batches=30),
    reduce_on_plateau_patience=4,
    use_learning_rate_finder=False,  # use Optuna to find ideal learning rate or use in-built learning rate finder
)

模型实例化代码

tft = TemporalFusionTransformer.from_dataset(
    training,
    # not meaningful for finding the learning rate but otherwise very important
    #learning_rate=0.03,
    #hidden_size=16,  # most important hyperparameter apart from learning rate
    # number of attention heads. Set to up to 4 for large datasets
    #attention_head_size=1,
    #dropout=0.1,  # between 0.1 and 0.3 are good values
    #hidden_continuous_size=8,  # set to <= hidden_size
    #output_size=7,  # 7 quantiles by default
    #loss=metrics.quantile.QuantileLoss(),
    # reduce learning rate if no improvement in validation loss after x epochs
    #reduce_on_plateau_patience=4
)

TimeSeriesDataSet实例化代码

#Create a TimeSeriesDataSet
max_prediction_length = 7*4*6   #24 weeks
training_cutoff = data["time_indx"].max() - max_prediction_length

training = TimeSeriesDataSet(
    data[lambda x: x.time_indx <= training_cutoff],
    group_ids=["group_id"],
    target="Close",
    time_idx="time_indx",
    min_encoder_length=3,
    max_encoder_length=30,
    min_prediction_length=5,
    max_prediction_length=max_prediction_length,
    time_varying_known_reals=['Date', 'Open', 'High', 'Low', 'Volume'],
    time_varying_unknown_reals=["Close"]
)

问题定位与解决思路

核心问题分析

错误发生在模型初始化的save_hyperparameters步骤,说明get_init_args返回了元组而非预期的字典,根源是TimeSeriesDataSet的特征配置错误,导致后续模型参数传递格式异常。

具体修复步骤

  1. 修正TimeSeriesDataSet特征配置
    移除time_varying_known_reals中的'Date'字段:time_idx已经指定了时间索引time_indx,Date属于时间类型,不应作为数值型已知特征传入。修正后的代码:

    training = TimeSeriesDataSet(
        data[lambda x: x.time_indx <= training_cutoff],
        group_ids=["group_id"],
        target="Close",
        time_idx="time_indx",
        min_encoder_length=3,
        max_encoder_length=30,
        min_prediction_length=5,
        max_prediction_length=max_prediction_length,
        time_varying_known_reals=['Open', 'High', 'Low', 'Volume'],  # 移除Date
        time_varying_unknown_reals=["Close"]
    )
    
  2. 验证特征数据类型
    确保time_varying_known_reals和time_varying_unknown_reals中的所有字段都是数值类型(int/float),检查数据中是否存在字符串、缺失值等异常,提前完成数据清洗(比如填充缺失值、若需使用日期信息可转换为时间戳后再考虑加入,但禁止直接传入datetime类型)。

  3. 检查版本兼容性
    确认pytorch-forecasting与pytorch-lightning版本匹配:比如pytorch-forecasting 0.10.x对应pytorch-lightning 1.5.x,版本不匹配可能引发底层参数处理错误。可执行以下命令安装兼容版本:

    pip install pytorch-forecasting==0.10.3 pytorch-lightning==1.5.10
    
  4. 显式指定模型类型(可选)
    在optimize_hyperparameters中显式指定model=TemporalFusionTransformer,避免默认参数异常:

    from pytorch_forecasting.models.temporal_fusion_transformer import TemporalFusionTransformer
    
    study = optimize_hyperparameters(
        train_dataloader,
        val_dataloader,
        model=TemporalFusionTransformer,  # 显式指定模型
        model_path="optuna_test",
        n_trials=200,
        max_epochs=50,
        gradient_clip_val_range=(0.01, 1.0),
        hidden_size_range=(8, 128),
        hidden_continuous_size_range=(8, 128),
        attention_head_size_range=(1, 4),
        learning_rate_range=(0.001, 0.1),
        dropout_range=(0.1, 0.3),
        trainer_kwargs=dict(limit_train_batches=30),
        reduce_on_plateau_patience=4,
        use_learning_rate_finder=False,
    )
    

内容的提问来源于stack exchange,提问作者SpaceDoctor

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.31 00:21:26