实例化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的特征配置错误,导致后续模型参数传递格式异常。
具体修复步骤
修正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"] )验证特征数据类型
确保time_varying_known_reals和time_varying_unknown_reals中的所有字段都是数值类型(int/float),检查数据中是否存在字符串、缺失值等异常,提前完成数据清洗(比如填充缺失值、若需使用日期信息可转换为时间戳后再考虑加入,但禁止直接传入datetime类型)。检查版本兼容性
确认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显式指定模型类型(可选)
在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
相关产品推荐
相关产品推荐

