-
Notifications
You must be signed in to change notification settings - Fork 120
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
一些问题和优化建议 #139
Comments
非常感谢您的建议,这对我们帮助很大! |
"tensorboard中增加一些指标",您指的是什么呢,可否给出一些具体的需求? |
比如模型的计算图,框架图,权重,偏差随时间变化的直方图。 |
个人觉得basicts论文中对ETT系列数据集的标准化处理有一点问题,因为ETT数据集的各列数据不像PEMS数据集是同一单位,导致各列的值差异有时候差异较大,采用各个通道标准化可能比整体标准化更合适,若需要在计算指标时反归一化,可参考优化建议第一条 |
好的,感谢您的建议。我正在开发新版的BasicTS,基本已经完成,会在未来几天内发布。 |
作者您好,BasicTS能支持自动调参不? |
您好,下一版本没有囊括自动调参功能,我对自动调参这块不是很熟悉,从我自己的经验来看这几个数据集似乎对超参数没那么敏感? |
请问一下,运行train找不到FileNotFoundError: [Errno 2] No such file or directory: 'datasets/ETTh1/scaler_in_96_out_336_rescale_True.pkl',修改哪个文件夹 |
修改了baselines里面对应的模型数据集好了 |
您好,在目前的版本下,您还需要手动生成不同输入输出长度的数据集。您可以通过下面的指令生成: python scripts/data_preparation/${DATASET_NAME}/generate_training_data.py --history_seq_len ${INPUT_LEN} --future_seq_len ${OUTPUT_LEN} 例如: python scripts/data_preparation/ETTh1/generate_training_data.py --history_seq_len 96 --future_seq_len 336 马上会更新一个版本,可以在训练的时候即时指定,敬请期待~ |
伟大,无需多言! |
作者您好,下个版本是否有支持单变量预测的接口? |
您所说的单变量指的是什么?是指只有一条时间序列的数据集吗? |
不好意思,好像只需要重新定义runner即可。单变量预测指的是带OT变量的数据集,例如ETT |
作者您好,我想请教一下BasicTS论文中长时序预测结果的历史长度和预测长度,我看代码里给的不同模型的历史长度似乎存在不一样,预测长度应该都是336,所以我想确定一下 |
是的,事实上不同的论文对于历史长度的规定是不一样的,而不同方法的最优历史长度也不一样。 |
I noticed that easytorch is no longer maintained. Are you considering switching the backend in the new version? |
Currently, EasyTorch is still able to meet the needs of BasicTS, so there won't be any changes in the short term. However, in the longer term, I hope that the backend of BasicTS will no longer need to rely on other packages, although this will be time-consuming. Do you have any other needs that the current EasyTorch backend cannot satisfy?" |
大家好,BasicTS代码已更新,欢迎大家查看并使用! Hello, everyone! The BasicTS code has been updated. Feel free to check it out and use it! |
作者您好,关于PEMS序列数据集的图结构是否有方向性?我看代码里面默认是无向图,是否可以提供一个有向图,无向图的可选项?还是说数据集本身就是无向图? |
您好,PEMS0X的数据集处理脚本是数据集自带的。你可以通过在github上搜索: |
作者您好,数据可视化的代码是否可以更新一下? |
好的,忘记更新了,明天更新啊 |
complete_config文件中CFG.DATASET.PARAM中的overlap参数未给出。 |
您好,感谢您的建议,overlap参数目前已经设置默认为False并自动调整,且给出警告。
|
已更新 |
作者您好,您刚更新的子集预测是否有一个问题? |
感谢您的报告!现在应该已经可以了,您可以试一下 |
@all-contributors please add @TensorPulse for bug |
I've put up a pull request to add @TensorPulse! 🎉 |
作者您好,关于子集预测问题,假设模型输入为BTN1C,输出为BTN2C,BasicTS好像并不支持 |
麻烦您提供一下更详细的描述,比如您想要实现的具体功能和现有版本之间的差异。 |
以PEMS08为例,假设我的模型输入为[64, 12, 170, 1],输出为[64, 12, 1, 1],现有版本首先simple_tsf_runner这里会报错 |
您好,目前实现子集预测主要是通过SimpleTimeSeriesForecastingRunner.select_target_time_series实现的,它要求模型的输入输出的N都是相同的,否则通过 |
如果您希望模型的输出数据的N和输入数据不同,那么可以通过定制一个Datasets类实现(并取消 |
这个功能可以通过self.if_out_target_nodes参数,它默认为False, 在SimpleTimeSeriesForecastingRunner.forward下通过
其中,self.scaler.inverse_transform增加一个索引参数target_time_series |
self.scaler.inverse_transform的具体实现方式如下: |
感谢您的提议,但我还是没搞明白这么做的必要性是什么。麻烦您用markdown语法给出完整的代码,目前这个格式完全乱了。 |
这样做的目的是为了适应单变量预测模型,以ETTh1数据集为例,当预测变量为OT,其他为辅助变量时,有些单变量的模型输出为[B,T,1,1],这样做可以适应这种模型的移植。
BaseTimeSeriesForecastingRunner.postprocessing,在初始化中增加self.if_out_target_nodes = False
|
现在已经支持了,只需要设置CFG.MODEL.TARGET_TIME_SERIES=[6] (以ETT为例)应该就能实现。目前的实现方式是哪里不满足您的使用场景吗? |
是的,使用场景要求模型的输出特征为1 |
您好,我仔细思考了一下,非常感谢您的提议,但您的需求不太适合通过直接修改现有架构实现(同一功能的两种实现会引起误会)。 但您可以通过非侵入式的方式快速实现您的需求:
|
确实,这种特殊的适应场景会引起误解。感谢作者您提供完整的非侵入式的思路 |
感觉您应该也可以通过在模型输出位置,添加一个复制操作来兼容现有的框架。 比如,假设您的模型输出 虽然反归一化的时候依旧会在非TARGET_TIME_SERIES上进行计算,但在计算指标(以及loss)的时候只取出了目标时间序列,对最终结果不会造成影响,只是做了一些多余的计算。 |
作者您好,请问这里为什么没有判断通道数C的大小 |
因为输入的C和输出的C一般是不一样的,输出的C一般是1,输入的C除了1之外还有一些temporal feature。 |
作者您好,我在现有的basicts框架下利用nni自动调参工具对STID做了一个简易的实现,希望能对您有所帮助。
#这里我命名.json文件为search_space.json
2:在base_epoch_runner.py中的self.to_running_device = to_device和self.model_name = cfg['MODEL.NAME']中间加入如下代码
在base_tsf_runner.py中的test函数中的metrics_results = self.compute_evaluation_metrics(returns_all)和if save_results:中间加入如下代码
还是test函数的最后加入如下代码
3在终端中输入nnictl create --config .....\train_nni.yml,其中--config后面是train_nni.yml文件所在的路径即可运行,打开localhost:8080网站即可看到可视化的结果界面 |
您好,我也有类似的问题,我有9条时间序列,其中3个是待预测的时间序列,6个是辅助序列。我的理解是设置CFG.MODEL.TARGET_TIME_SERIES=[0,1,2]后,模型从输入到输出就只用这3个待预测的时间序列了,不知道我理解的正确不,如果我希望完成9个时间序列输入,3个目标序列输出,最好的办法是这样吗。 |
我阅读了 complete_config_cn.py这个文件,看到了关于这个参数的解释。 能否这么理解,如此设置之后,模型还会输出全部9个变量的预测结果,但是后处理 计算loss时只取三个目标变量。 这么做 会不会使模型额外做了其他6个变量的预测,存在冗余计算? |
您的理解是正确的,至于是否存在冗余取决于模型的实现方式。这种做法主要是为了在现有的数据集上快速的实现M-S的预测设置,并兼容常见的长序列预测模型。 如果您使用的是自己的数据和模型的话,建议实现一个自己的dataset函数。该datasets可以预先产生好输入序列(包含目标序列和辅助序列) |
好的,我明白了,看来我需要自己实现一个dataset函数。 感谢您的解答,感谢这个开源库! |
请问后续会加入一些基于Diffusion的模型吗,因为感觉diffusion的训练推理方式和现在这些模型略有不同 |
我们不太熟悉基于Diffusion时序模型,它相比于普通模型的优势是什么呢,有什么经典之作推荐吗?
|
优势的话我还真不知道,因为最近注意到不少工作是基于diffusion做的所以就想了解了解来着 |
您好,作者,感谢提供如此完整的学习框架!本人在使用和移植基线的过程中遇到一些问题和不便的地方,在此提出来以便您参考优化。
声明:以下问题和建议仅代表个人看法,仅供参考
问题:利用pycham直接运行data_preparation显示找不到数据集文件,运行train时也一样,做如下修改就可以运行:
OUTPUT_DIR = "../../../experiments/datasets/" + DATASET_NAME
DATA_FILE_PATH = "../../../datasets/raw_data/{0}/{0}.npz".format(DATASET_NAME)
GRAPH_FILE_PATH = "../../../datasets/raw_data/{0}/adj_{0}".format(DATASET_NAME)
DISTANCE_FILE_PATH = "../../../datasets/raw_data/{0}/distance_{0}".format(DATASET_NAME)
优化建议:
1.数据集的归一化和反归一化:CFG.RESCALE:如果为True,表示既反归一化数据又将整个数据的标准化,如果为False,表示既不反归一化数据又将数据的每个通道标准化。可以拆解为两个变量,一个变量控制数据的标准化,一个变量控制数据和归一化和反归一化。
2. 模型训练结果表示不清:用模型名+epochs的方式所表达的直接信息不全,可做如下修改:
CFG.TRAIN.CKPT_SAVE_DIR = os.path.join(
"checkpoints",
CFG.MODEL.NAME,
"_".join([CFG.DATASET_NAME, str(CFG.TRAIN.NUM_EPOCHS)])
)
3.项目的可视化接口不足:可在tensorboard中增加一些指标或增加预测数据保存的接口
4.项目cfg文件中有许多隐藏接口,可以添加一个Simple_CFG将所有接口表达出来,例如:
CFG.MODEL.SETUP_GRAPH = False
CFG.TRAIN.FINETUNE_FROM
CFG.RESCALE = True
5.在基线STGODE中,需要引入A_sp_hat, A_se_hat两个张量,发现即使将整个模型放入gpu中,这两个张量仍然存在于cpu中,直到后续.to(x.device)。这在模型的移植中不太便利,需要找到张量最终使用的地方。建议使用
from easytorch.device import get_device_type
if get_device_type() == 'gpu':
device = 'cuda'
else:
device = 'cpu'
self.device = device
或者from easytorch.device import to_device
6.在test过程中没有进度条显示,可修改:
tqdm process bar
data_iter = tqdm(self.test_data_loader)
test loop
for iter_index, data in enumerate(data_iter):
The text was updated successfully, but these errors were encountered: