基于 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、深度学习

相关推荐
2401_8685347816 小时前
MATLAB:车牌识别
python·django
卷无止境16 小时前
用 FastAPI 撑起大文件的上传下载:从流式处理到断点续传的完整实践
后端·python·fastapi
张龙68717 小时前
别再裸调大模型了:用 60 行 Python 给 LLM 调用加上「重试 + 超时 + 降级」
python
菜冻鱼17 小时前
Python-sklearn-评估指标
开发语言·人工智能·python·机器学习·numpy·pandas·sklearn
guyiICtestsocket17 小时前
国内支持定制的手机LPDDR芯片测试座工厂多种结构
人工智能·python·智能手机
for_ever_love__17 小时前
python基础语法学习: 变量, 输入输出, 运算符
网络·python·学习
努力搬砖的咸鱼17 小时前
AI Agent测试全景图:它到底改变了什么
人工智能·python·ai·集成测试·pytest·agent·ai编程
张小殊.18 小时前
LoongForge TAOT 训练方案,解决MoE EP不均衡问题
人工智能·python·深度学习·机器学习·ai
玫幽倩18 小时前
2026黄河流域公安院校-电子物证单项赛(程序逆向分析+服务器取证)
运维·服务器·python·电子取证·逆向·程序分析·服务器取证