基于 CNN+LSTM 的全国年度降水预测实践

基于 CNN+LSTM 的全国年度降水预测实践

在气象预测中,长期降水预测一直是核心问题。除了传统 ConvLSTM,本项目尝试使用 CNN+LSTM 方法,对全国年度降水栅格进行预测(2025--2027 年),并严格保证预测在研究区内。


1. 项目背景

  • 输入数据:2000--2024 年全国降水年度栅格(每张 TIFF 一年)
  • 预测目标:2025--2027 年未来三年降水
  • 研究要求 :
    1. 预测严格限制在研究区
    2. 第一年的预测值合理,不受 nodata 或边缘干扰

CNN+LSTM 架构能同时处理栅格的空间信息(CNN 提取空间特征)和时间依赖(LSTM 处理年度序列),适合年度降水预测。


2. 数据处理

  1. 读取 TIFF 栅格

    • 每个像素表示全年降水
    • nodata 或无效像素用 0 或邻近平均填充
    • 生成研究区 mask
  2. 归一化

    • 仅对研究区有效像素计算均值和标准差
    • 保证模型输入不受无效区域影响
  3. 空间特征提取

    • 使用 CNN 对每张年度栅格提取低维特征向量
    • 特征向量作为 LSTM 输入序列
  4. 训练/验证划分

    • 训练集:2000--2020
    • 验证集:2021--2024
    • 输出预测 2025--2027

3. 模型架构

(1) CNN Encoder

  • 输入:年度栅格 [H, W]
  • 输出:低维空间特征 [C]
  • 结构:
    • 3 层卷积 + ReLU + BatchNorm
    • 全局平均池化输出向量

(2) LSTM 时间建模

  • 输入序列长度:INPUT_STEPS 年
  • 每步输入:CNN 提取的特征向量
  • 输出:未来 OUTPUT_STEPS 年特征向量

(3) Decoder

  • 将 LSTM 输出向量通过反卷积或全连接还原为栅格 [H, W]
  • 预测结果仅在研究区 mask 内有效,区域外填 nodata

(4) 损失函数

python 复制代码
MaskedHybridLoss = 0.7*MSE + 0.3*MAE  # 对降水极值加权
  • 可选加入 SSIM / 梯度损失增强空间结构

4. 训练策略

  • 优化器:AdamW + CosineAnnealingLR

  • 训练轮次:50--100 epoch

  • 批量大小:根据显存调整

  • 验证集监控:训练损失 vs 验证损失

  • GPU 管理:

    • 训练结束 torch.cuda.empty_cache()
    • Windows 下 DataLoader 设置 num_workers=0

5. 预测流程

  1. 对最后 INPUT_STEPS 年数据提取 CNN 特征
  2. LSTM 预测未来 OUTPUT_STEPS 年特征
  3. Decoder 还原栅格
  4. patch 重建或整图预测
  5. 应用研究区 mask,输出 TIFF

6. 结果与经验

  1. 第一年预测值偏小:

    • 原因:最后一年输入 nodata 多或均值偏低
    • 解决:使用有效区域均值填充 nodata
  2. 预测模糊:

    • 原因:MSE 平滑 + patch 高斯融合

    • 解决:

      • 增大模型容量
      • 调整 patch 尺寸
      • 加入 SSIM / 边缘损失
  3. 研究区控制:

    • 重建和输出均严格在研究区 mask 内
    • 确保 GIS 可直接使用

7. 技术栈

  • Python 3.11
  • PyTorch 2.5
  • Rasterio 1.4
  • Numpy、Scipy、TQDM
  • GPU 可选

8. 代码示意

python 复制代码
# CNN+LSTM 预测流程示意
features = []
for t in range(INPUT_STEPS):
    x = current_input[t] * valid_area_mask
    feat = cnn_encoder(x.unsqueeze(0).unsqueeze(0))
    features.append(feat)

features = torch.stack(features, dim=0)  # [T, C]
lstm_out = lstm(features.unsqueeze(1))  # [OUTPUT_STEPS, C]
preds = decoder(lstm_out)  # [OUTPUT_STEPS, H, W]
preds[:, ~valid_area_mask] = nodata_value
save_tiff(preds, output_folder)

9. 改进方向

  1. 多变量输入:温度、湿度、风场辅助特征
  2. 多分辨率 CNN 提升局地细节捕获
  3. Transformer 或 GAN 架构提高预测清晰度
  4. 数据增强:旋转、翻转、邻域插值

10. 总结

  • CNN+LSTM 可以有效建模年度栅格降水的空间和时间模式
  • 使用研究区 mask 确保预测区域正确
  • nodata 填充和 patch 重建优化保证第一年预测值合理
  • 可结合 SSIM / 边缘损失提升预测空间细节

关键词:CNN、LSTM、降水预测、年度栅格、研究区 mask、深度学习

相关推荐
BK贝壳18 小时前
亿级用户签到位图选型复盘:用 bool-hybrid-array 扛冷启动打卡,也把它和 Roaring/Redis 的边界测清楚了
数据结构·python·性能优化·numpy
2601_9669496520 小时前
如何根据研究的起止时间截取分钟级行情?Python 实战与 QuantDash 数据处理指南
开发语言·python·pandas·量化交易·1024程序员节·股票数据·quantdash
在世修行1 天前
智学文枢:页面切换与跨页数据预填
python·桌面应用·signal·1024程序员节·pyside·跨页跳转·状态预填
2601_962885721 天前
如何用 Python 把 K 线重采样成任意周期?
开发语言·python
打工仔折腾 AI1 天前
在 Ubuntu ARM64 部署 Q1 V3.0 MuJoCo 模型:加载、单步推理与执行器响应解析
linux·运维·人工智能·python·深度学习·ubuntu·性能优化
信誓旦旦的程序猿1 天前
【Python量化实战宝典 #21】北向资金跟随手册:聪明钱择时信号(Python 可跑)
python·1024程序员节·股票数据api·股票数据api接口·股票api数据接口·股票量化数据api·股票量化数据接口
严谨的麻辣烫1 天前
静态 ISP 代理请求超时怎么排查?Python 与 curl 实战
python·http·requests·1024程序员节·网络排障
KeepRobots1 天前
11-01 温哥华不回拨:用 60 行 Python 查你的工单系统会不会差一小时(KeepRobots 工程笔记)
python
xiao77mwq1 天前
你以为 OCR 慢?实测 81.3 s 里全是故障代价:如何把「定格态」消掉,让耗时从 6.5 s 到 13 倍差距显出原形
python
深圳市益普科技有限公司1 天前
半导体良率管理YMS:良率与设备参数的相关性,先拉哪几组数据
人工智能·python·算法