使用fastai SaveModelCallback保存的时序分类模型无法加载问题
问题原因
fastai的SaveModelCallback仅保存模型的权重参数(本质是OrderedDict类型的字典),而非完整的Learner对象。而load_learner是专门用来加载通过learner.export()保存的完整Learner实例(包含数据加载器dls、模型结构、训练配置等所有必要组件),直接加载权重文件自然会触发'OrderedDict' object has no attribute 'dls'的错误。
解决方案
方案1:加载SaveModelCallback保存的权重文件
如果要继续使用已保存的.pth权重,需先复刻训练时的Learner实例,再加载权重:
# 复刻训练时的环境与Learner结构 import os os.chdir(os.path.dirname(os.path.abspath(__file__))) os.environ["DEVICE"] = "cuda" from pickle import load import numpy as np from tsai.all import * dataset_idx = 0 # 重新加载数据集(保证数据结构与训练时一致) X_train = load(open(r"X_train_"+str(dataset_idx)+".pkl", 'rb')).transpose((0,2,1)) y_train = load(open(r"y_train_"+str(dataset_idx)+".pkl", 'rb')) X_test = load(open(r"X_test_"+str(dataset_idx)+".pkl", 'rb')).transpose((0,2,1)) y_test = load(open(r"y_test_"+str(dataset_idx)+".pkl", 'rb')) l = X_train.shape[0] X = np.concatenate([X_train, X_test],axis=0) y = np.concatenate([y_train, y_test],axis=0) # 构建与训练时完全一致的Learner learn = TSClassifier(X, y, splits = [list(range(l)), list(range(l, y.shape[0]))], arch=InceptionTimePlus, bs=256, arch_config=dict(fc_dropout=0.5), shuffle_train=True) # 加载权重文件 learn.load("ITP_"+str(dataset_idx)) # 后续推理逻辑 y_test = load(open(r"y_test2_"+str(dataset_idx)+".pkl", 'rb')) X_test = load(open(r"X_test_"+str(dataset_idx)+".pkl", 'rb')).transpose((0,2,1)) preds = learn.get_preds(dl=learn.dls.test_dl(X_test))
方案2:改用export()保存完整模型(更推荐)
如果无需单独保存权重,直接用export()保存完整Learner,再用load_learner()加载,流程更简洁:
修改训练阶段的保存代码
替换SaveModelCallback相关逻辑,改用export():
# 原有训练代码不变... learn.fit_one_cycle(3, 0.001) # 保存完整Learner实例 learn.export(f"ITP_{dataset_idx}.pkl")
测试阶段的加载代码
直接加载即可,无需复刻Learner:
from tsai.inference import load_learner dataset_idx = 0 learn = load_learner(f"ITP_{dataset_idx}.pkl") y_test = load(open(r"y_test2_"+str(dataset_idx)+".pkl", 'rb')) X_test = load(open(r"X_test_"+str(dataset_idx)+".pkl", 'rb')).transpose((0,2,1)) preds = learn.get_preds(dl=learn.dls.test_dl(X_test))
内容的提问来源于stack exchange,提问作者Granth
相关产品推荐
相关产品推荐

