Appearance
PatchTST 调试形参
Abstract
这篇只做一件事:
保存当前用于学习 PatchTST 代码运行流程的最小 PyCharm 参数。
1. PyCharm 配置
Script path
text
D:\1sudyta\1ai-self\aistyle\TFB\scripts\run_benchmark.pyWorking directory
text
D:\1sudyta\1ai-self\aistyle\TFBEnvironment variables
text
KMP_DUPLICATE_LIB_OK=TRUE2. Parameters
直接复制下面这一整行到 PyCharm 的 Parameters:
text
--config-path rolling_forecast_config.json --data-name-list cif_2016_dataset_1.csv --model-name time_series_library.PatchTST --adapter transformer_adapter --model-hyper-params "{\"batch_size\":4,\"d_model\":32,\"d_ff\":128,\"e_layers\":1,\"factor\":3,\"horizon\":6,\"n_heads\":2,\"norm\":true,\"seq_len\":24,\"patch_len\":6,\"stride\":3,\"dropout\":0.0,\"lr\":0.0001,\"num_epochs\":1,\"num_workers\":0}" --strategy-args "{\"horizon\":6,\"tv_ratio\":0.8,\"train_ratio_in_tv\":0.75,\"stride\":6,\"num_rollings\":2}" --num-workers 1 --timeout 600 --save-path debug\cif1_PatchTST_rolling_min2.1 VSCode 调试配置
VSCode 不把参数写成一整行,而是写进 .vscode/launch.json 的 args 数组。
先在 VSCode 里执行:
text
Ctrl+Shift+P
-> Python: Select Interpreter
-> 选择 D:\Anaconda\envs\tfb\python.exe然后在仓库根目录创建或修改:
text
D:\1sudyta\1ai-self\aistyle\TFB\.vscode\launch.json加入下面配置:
json
{
"version": "0.2.0",
"configurations": [
{
"name": "TFB PatchTST rolling debug",
"type": "python",
"request": "launch",
"program": "${workspaceFolder}\\scripts\\run_benchmark.py",
"cwd": "${workspaceFolder}",
"console": "integratedTerminal",
"env": {
"KMP_DUPLICATE_LIB_OK": "TRUE"
},
"args": [
"--config-path", "rolling_forecast_config.json",
"--data-name-list", "cif_2016_dataset_1.csv",
"--model-name", "time_series_library.PatchTST",
"--adapter", "transformer_adapter",
"--model-hyper-params", "{\"batch_size\":4,\"d_model\":32,\"d_ff\":128,\"e_layers\":1,\"factor\":3,\"horizon\":6,\"n_heads\":2,\"norm\":true,\"seq_len\":24,\"patch_len\":6,\"stride\":3,\"dropout\":0.0,\"lr\":0.0001,\"num_epochs\":1,\"num_workers\":0}",
"--strategy-args", "{\"horizon\":6,\"tv_ratio\":0.8,\"train_ratio_in_tv\":0.75,\"stride\":6,\"num_rollings\":2}",
"--num-workers", "1",
"--timeout", "600",
"--save-path", "debug\\cif1_PatchTST_rolling_min"
]
}
]
}关键区别:
text
PyCharm Parameters:
一整行字符串,JSON 需要用 \" 转义。
VSCode args:
一个参数一个数组元素,JSON 参数整体作为一个字符串元素。3. 当前参数含义
数据与任务
--data-name-list cif_2016_dataset_1.csv- 使用一个很小的数据集,便于看清 PatchTST 的代码流。
--config-path rolling_forecast_config.json- 使用 rolling forecast 评测协议。
--strategy-argshorizon = 6- 每次预测未来 6 步。
tv_ratio = 0.8- 前 80% 作为 train/valid 区域。
train_ratio_in_tv = 0.75- train/valid 区域内部再切训练段。
stride = 6- rolling forecast 每次往后滚 6 步。
num_rollings = 2- 只滚 2 次,减少调试负担。
模型
--model-name time_series_library.PatchTST- 当前调试模型是 PatchTST。
--adapter transformer_adapter- 仍然走 TFB 的 transformer 统一 adapter。
seq_len = 24- 输入历史窗口长度。
horizon = 6- 会被 adapter/配置层转成
pred_len = 6。
- 会被 adapter/配置层转成
patch_len = 6- 每个 patch 覆盖 6 个时间步。
stride = 3- PatchTST 内部切 patch 的步长。
d_model = 32- patch embedding 后的隐藏维度。
n_heads = 2- attention head 数量。
e_layers = 1- encoder 层数。
d_ff = 128- encoder feed-forward 隐藏维度。
Warning
这里有两个
stride:
model-hyper-params里的stride = 3
- PatchTST 内部切 patch 的步长。
strategy-args里的stride = 6
- rolling forecast 每次测试窗口往后移动的步长。
它们不是同一个东西。
4. 当前小例子的关键 shape
这个数据集通常是单变量,所以 C = 1。
当前 batch 里大概率会看到:
text
x_enc: (4, 24, 1)
permute 后: (4, 1, 24)
patch 后: (4, 8, 32)
encoder 后: (4, 8, 32)
reshape 后: (4, 1, 8, 32)
permute 后: (4, 1, 32, 8)
head 后: (4, 1, 6)
permute 后: (4, 6, 1)其中 patch 数:
text
patch_num = int((seq_len - patch_len) / stride + 2)
= int((24 - 6) / 3 + 2)
= 85. 断点顺序
第一轮只看代码流,先不要看论文。
ts_benchmark/baselines/time_series_library/adapters_for_transformers.pyTransformerAdapter._process(...)
ts_benchmark/baselines/time_series_library/models/PatchTST.pyforward(...)
ts_benchmark/baselines/time_series_library/models/PatchTST.pyforecast(...)
ts_benchmark/baselines/time_series_library/layers/Embed.pyPatchEmbedding.forward(...)
ts_benchmark/baselines/time_series_library/layers/Transformer_EncDec.pyEncoder.forward(...)
ts_benchmark/baselines/time_series_library/models/PatchTST.pyFlattenHead.forward(...)
6. 当前学习主线
text
run_benchmark
-> pipeline
-> eval_model
-> RollingForecast._eval_batch
-> forecast_fit
-> _process
-> PatchTST.forward
-> PatchTST.forecast
-> PatchEmbedding
-> Encoder
-> FlattenHead
-> output这一轮的第一性:
先看清 PatchTST 怎样把一段时间序列切成 patch,再让每个变量独立经过 Transformer encoder,最后用 FlattenHead 预测未来窗口。