这是一个面向气象场建模的工程模板,目标是让你学习一个较完整的深度学习项目范式:
PyTorch Lightning负责训练框架wandb负责实验记录setup.py负责项目打包src目录布局负责工程边界U-Net负责二维空间场建模ERA5 .nc日频文件负责数据输入
这个模板默认将问题定义为:
- 输入:过去
history_days天的 ERA5 多变量二维场 - 输出:未来
lead_days天后的目标变量二维场
一个典型例子是:
- 输入变量:
["t2m", "u10", "v10", "msl"] - 目标变量:
["t2m"] history_days=5lead_days=1
即用过去 5 天的多个变量,预测下一天的 2 米气温场。
application/
├─ configs/
│ └─ train_unet.yaml
├─ scripts/
│ └─ train.py
├─ src/
│ └─ lightning_unet/
│ ├─ data/
│ │ ├─ datamodule.py
│ │ └─ era5.py
│ ├─ models/
│ │ └─ unet.py
│ ├─ modules/
│ │ └─ forecast.py
│ ├─ utils/
│ │ └─ config.py
│ └─ __init__.py
├─ requirements.txt
├─ setup.py
└─ .gitignore
当前模板假设:
data_dir下每个.nc文件对应一天。- 文件名按字典序排序后,就是时间顺序。
- 每个文件里都包含同样的变量,比如
t2m/u10/v10/msl。 - 每个文件里的空间网格一致。
- 变量至少带有
lat/lon或latitude/longitude这样的二维空间维。 - 如果文件中仍有
time维,模板会默认取第一个时间片。
例如:
data/era5_daily/
├─ era5_20200101.nc
├─ era5_20200102.nc
├─ era5_20200103.nc
└─ ...
关键配置位于 configs/train_unet.yaml:
data.data_dir: ERA5 日频.nc文件目录data.input_variables: 输入变量名列表data.target_variables: 预测目标变量名列表data.history_days: 输入历史窗口长度data.lead_days: 预测提前期data.train_split: 训练集比例data.val_split: 验证集比例data.normalization: 每个变量的均值和标准差
cd application
python -m venv .venv
.venv\Scripts\activate
pip install -r requirements.txt
pip install -e .
python scripts/train.py --config configs/train_unet.yaml本模板默认启用 wandb。如果只想本地记录:
set WANDB_MODE=offline
python scripts/train.py --config configs/train_unet.yamlmodels/unet.py只负责网络结构modules/forecast.py负责训练、验证、loss 和 metricdata/era5.py负责 ERA5.nc文件读取与样本切片data/datamodule.py负责 DataLoader 和数据集切分scripts/train.py负责组装配置、logger、trainer 和 callback
这个模板是教学型模板,因此做了几个刻意简化:
- 默认使用
U-Net预测二维格点场。 - 默认把时间历史维展开到 channel 维。
- 默认按文件顺序构造滑动窗口样本。
- 默认使用配置中提供的均值和标准差做归一化。
- 默认用
MSE + MAE作为主要训练和评估指标。
- 增加
test集与独立推理脚本。 - 增加更多 meteorology metric,比如 anomaly correlation、RMSE、bias。
- 把单步预测扩展成多步预测。
- 加入 mask 机制处理陆海或缺测区域。
- 把 YAML 配置升级成
Hydra或OmegaConf。