Datawhale AI 夏令营学习笔记

深度学习在极端降水预测中的应用

一、概述

极端降水预测对于防灾减灾、农业生产、城市规划等具有重要意义。随着深度学习技术的发展,利用深度学习模型进行极端降水预测成为了可能。本文将介绍如何使用 PyTorch 创建数据集,并构建 CNN 和 LSTM 模型进行极端降水预测。

二、PyTorch 简介

PyTorch 是一个开源的深度学习框架,它提供了灵活且高效的张量计算和自动求导机制,适合研究人员和工程师使用。

1. 安装 PyTorch

在开始之前,需要先安装 PyTorch。可以使用以下命令进行安装:

pip install torch torchvision

三、数据集的创建

在进行模型训练之前,需要准备并创建数据集。假设我们有一组包含时间序列和降水量的气象数据。

1. 数据预处理

数据预处理包括数据清洗、缺失值填补和归一化处理。

import pandas as pd
from sklearn.preprocessing import MinMaxScaler

# 读取数据
data = pd.read_csv('weather_data.csv')

# 填补缺失值
data = data.fillna(method='ffill')

# 归一化处理
scaler = MinMaxScaler()
data_scaled = scaler.fit_transform(data)

2. 创建训练和测试数据集

将数据划分为训练集和测试集,并创建 PyTorch 数据加载器。

import torch
from torch.utils.data import DataLoader, TensorDataset

# 划分训练集和测试集
train_size = int(len(data) * 0.8)
train_data = data_scaled[:train_size]
test_data = data_scaled[train_size:]

# 创建数据集和数据加载器
def create_sequences(data, seq_length):
    xs, ys = [], []
    for i in range(len(data) - seq_length):
        x = data[i:i+seq_length]
        y = data[i+seq_length]
        xs.append(x)
        ys.append(y)
    return torch.tensor(xs, dtype=torch.float32), torch.tensor(ys, dtype=torch.float32)

seq_length = 10
X_train, y_train = create_sequences(train_data, seq_length)
X_test, y_test = create_sequences(test_data, seq_length)

train_dataset = TensorDataset(X_train, y_train)
test_dataset = TensorDataset(X_test, y_test)

train_loader = DataLoader(train_dataset, batch_size=32, shuffle=True)
test_loader = DataLoader(test_dataset, batch_size=32, shuffle=False)

四、CNN 模型

卷积神经网络(CNN)在处理空间数据(如图像)方面表现优异。对于降水预测,可以使用 CNN 提取时空特征。

1. 定义 CNN 模型

import torch.nn as nn

class CNNModel(nn.Module):
    def __init__(self):
        super(CNNModel, self).__init__()
        self.conv1 = nn.Conv1d(in_channels=1, out_channels=16, kernel_size=3)
        self.pool = nn.MaxPool1d(kernel_size=2)
        self.fc1 = nn.Linear(16 * (seq_length // 2 - 1), 1)

    def forward(self, x):
        x = self.pool(F.relu(self.conv1(x)))
        x = x.view(-1, 16 * (seq_length // 2 - 1))
        x = self.fc1(x)
        return x

model = CNNModel()

2. 训练 CNN 模型

import torch.optim as optim

criterion = nn.MSELoss()
optimizer = optim.Adam(model.parameters(), lr=0.001)

for epoch in range(50):
    for inputs, labels in train_loader:
        inputs = inputs.unsqueeze(1)  # 添加通道维度
        optimizer.zero_grad()
        outputs = model(inputs)
        loss = criterion(outputs, labels)
        loss.backward()
        optimizer.step()
    print(f'Epoch {epoch+1}, Loss: {loss.item()}')

五、LSTM 模型

长短期记忆网络(LSTM) 在处理时间序列数据方面表现优异。可以使用 LSTM 模型进行降水量的时间序列预测。

1. 定义 LSTM 模型

class LSTMModel(nn.Module):
    def __init__(self):
        super(LSTMModel, self).__init__()
        self.lstm = nn.LSTM(input_size=1, hidden_size=50, num_layers=2, batch_first=True)
        self.fc = nn.Linear(50, 1)

    def forward(self, x):
        h_0 = torch.zeros(2, x.size(0), 50).requires_grad_()
        c_0 = torch.zeros(2, x.size(0), 50).requires_grad_()
        ula, (h_out, _) = self.lstm(x, (h_0.detach(), c_0.detach()))
        out = self.fc(h_out[-1])
        return out

model = LSTMModel()

六、模型评估

在训练完成后,需要对模型进行评估,来验证其在测试集上的表现。

model.eval()
test_loss = 0
with torch.no_grad():
    for inputs, labels in test_loader:
        inputs = inputs.unsqueeze(1)  # 对于 CNN
        # inputs = inputs.unsqueeze(-1)  # 对于 LSTM
        outputs = model(inputs)
        loss = criterion(outputs, labels)
        test_loss += loss.item()

print(f'Test Loss: {test_loss / len(test_loader)}')
  • 9
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值