返回顶部
首页 > 资讯 > 精选 >如何使用PyTorch搭建CNN实现风速预测
  • 691
分享到

如何使用PyTorch搭建CNN实现风速预测

2023-06-22 07:06:07 691人浏览 八月长安
摘要

这篇文章主要介绍了如何使用PyTorch搭建CNN实现风速预测,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。数据集数据集为Barcelona某段时间内的气象数据,其中包括温度

这篇文章主要介绍了如何使用PyTorch搭建CNN实现风速预测,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。

数据集

如何使用PyTorch搭建CNN实现风速预测

数据集为Barcelona某段时间内的气象数据,其中包括温度、湿度以及风速等。本文将利用CNN来对风速进行预测。

特征构造

对于风速的预测,除了考虑历史风速数据外,还应该充分考虑其余气象因素的影响。因此,我们根据前24个时刻的风速+下一时刻的其余气象数据来预测下一时刻的风速。

一维卷积

我们比较熟悉的是CNN处理图像数据时的二维卷积,此时的卷积是一种局部操作,通过一定大小的卷积核作用于局部图像区域获取图像的局部信息。图像中不同数据窗口的数据和卷积核做inner product(内积)的操作叫做卷积,其本质是提纯,即提取图像不同频段的特征。

上面这段话不是很好理解,我们举一个简单例子:

如何使用PyTorch搭建CNN实现风速预测

假设最左边的是一个输入图片的某一个通道,为5 × 5 5 \times55×5,中间为一个卷积核的一层,3 × 3 3 \times33×3,我们让卷积核的左上与输入的左上对齐,然后整个卷积核可以往右或者往下移动,假设每次移动一个小方格,那么卷积核实际上走过了一个3 × 3 3 \times33×3的面积,那么具体怎么卷积?比如一开始位于左上角,输入对应为(1, 1, 1;-1, 0, -3;2, 1, 1),而卷积层一直为(1, 0, 0;0, 0, 0;0, 0, -1),让二者做内积运算,即1 * 1+(-1 * 1)= 0,这个0便是结果矩阵的左上角。当卷积核扫过图中阴影部分时,相应的内积为-1,如上图所示。

因此,二维卷积是将一个特征图在width和height两个方向上进行滑动窗口操作,对应位置进行相乘求和。

相比之下,一维卷积通常用于时序预测,一维卷积则只是在width或者height方向上进行滑动窗口并相乘求和。 如下图所示:

如何使用PyTorch搭建CNN实现风速预测

原始时序数为:(1, 20, 15, 3, 18, 12. 4, 17),维度为8。卷积核的维度为5,卷积核为:(1, 3, 10, 3, 1)。那么将卷积核作用与上述原始数据后,数据的维度将变为:8-5+1=4。即卷积核中的五个数先和原始数据中前五个数据做卷积,然后移动,和第二个到第六个数据做卷积,以此类推。

数据处理

1.数据预处理

数据预处理阶段,主要将某些列上的文本数据转为数值型数据,同时对原始数据进行归一化处理。文本数据如下所示:

如何使用PyTorch搭建CNN实现风速预测

经过转换后,上述各个类别分别被赋予不同的数值,比如"sky is clear"为0,"few clouds"为1。

def load_data():    global Max, Min    df = pd.read_csv('Barcelona/Barcelona.csv')    df.drop_duplicates(subset=[df.columns[0]], inplace=True)    # weather_main    listType = df['weather_main'].unique()    df.fillna(method='ffill', inplace=True)    dic = dict.fromkeys(listType)    for i in range(len(listType)):        dic[listType[i]] = i    df['weather_main'] = df['weather_main'].map(dic)    # weather_description    listType = df['weather_description'].unique()    dic = dict.fromkeys(listType)    for i in range(len(listType)):        dic[listType[i]] = i    df['weather_description'] = df['weather_description'].map(dic)    # weather_icon    listType = df['weather_icon'].unique()    dic = dict.fromkeys(listType)    for i in range(len(listType)):        dic[listType[i]] = i    df['weather_icon'] = df['weather_icon'].map(dic)    # print(df)    columns = df.columns    Max = np.max(df['wind_speed'])  # 归一化    Min = np.min(df['wind_speed'])    for i in range(2, 17):        column = columns[i]        if column == 'wind_speed':            continue        df[column] = df[column].astype('float64')        if len(df[df[column] == 0]) == len(df):  # 全0            continue        mx = np.max(df[column])        mn = np.min(df[column])        df[column] = (df[column] - mn) / (mx - mn)    # print(df.isna().sum())    return df

2.数据集构造

利用当前时刻的气象数据和前24个小时的风速数据来预测当前时刻的风速:

def nn_seq():    """    :param flag:    :param data: 待处理的数据    :return: X和Y两个数据集,X=[当前时刻的year,month, hour, day, lowtemp, hightemp, 前一天当前时刻的负荷以及前23小时负荷]                              Y=[当前时刻负荷]    """    print('处理数据:')    data = load_data()    speed = data['wind_speed']    speed = speed.tolist()    speed = torch.FloatTensor(speed).view(-1)    data = data.values.tolist()    seq = []    for i in range(len(data) - 30):        train_seq = []        train_label = []        for j in range(i, i + 24):            train_seq.append(speed[j])        # 添加温度、湿度、气压等信息        for c in range(2, 7):            train_seq.append(data[i + 24][c])        for c in range(8, 17):            train_seq.append(data[i + 24][c])        train_label.append(speed[i + 24])        train_seq = torch.FloatTensor(train_seq).view(-1)        train_label = torch.FloatTensor(train_label).view(-1)        seq.append((train_seq, train_label))    # print(seq[:5])    Dtr = seq[0:int(len(seq) * 0.5)]    Den = seq[int(len(seq) * 0.50):int(len(seq) * 0.75)]    Dte = seq[int(len(seq) * 0.75):len(seq)]    return Dtr, Den, Dte

任意输出其中一条数据:

(tensor([1.0000e+00, 1.0000e+00, 2.0000e+00, 1.0000e+00, 1.0000e+00, 1.0000e+00,
        1.0000e+00, 1.0000e+00, 0.0000e+00, 1.0000e+00, 5.0000e+00, 0.0000e+00,
        2.0000e+00, 0.0000e+00, 0.0000e+00, 5.0000e+00, 0.0000e+00, 2.0000e+00,
        2.0000e+00, 5.0000e+00, 6.0000e+00, 5.0000e+00, 5.0000e+00, 5.0000e+00,
        5.3102e-01, 5.5466e-01, 4.6885e-01, 1.0066e-03, 5.8000e-01, 6.6667e-01,
        0.0000e+00, 0.0000e+00, 0.0000e+00, 0.0000e+00, 9.9338e-01, 0.0000e+00,
        0.0000e+00, 0.0000e+00]), tensor([5.]))

数据被划分为三部分:Dtr、Den以及Dte,Dtr用作训练集,Dte用作测试集。

CNN模型

1.模型搭建

CNN模型搭建如下:

class CNN(nn.Module):    def __init__(self):        super(CNN, self).__init__()        self.conv1d = nn.Conv1d(1, 64, kernel_size=2)        self.relu = nn.ReLU(inplace=True)        self.Linear1 = nn.Linear(64 * 37, 50)        self.Linear2 = nn.Linear(50, 1)         def forward(self, x):        x = self.conv1d(x)        x = self.relu(x)        x = x.view(-1)        x = self.Linear1(x)        x = self.relu(x)        x = self.Linear2(x)        return x

卷积层定义如下:

self.conv1d = nn.Conv1d(1, 64, kernel_size=2)

一维卷积的原始定义为:

nn.Conv1d(in_channels, out_channels, kernel_size, stride=1, padding=0, dilation=1, groups=1, bias=True)

这里channel的概念相当于自然语言处理中的embedding,这里输入通道数为1,表示每一个风速数据的向量维度大小为1,输出channel设置为64,卷积核大小为2。

原数数据的维度为38,即前24小时风速+14种气象数据。卷积核大小为2,根据前文公式,原始时序数据经过卷积后维度为:

38 - 2 + 1 = 37

一维卷积后是一个ReLU激活函数:

self.relu = nn.ReLU(inplace=True)

接下来是两个全连接层:

self.Linear1 = nn.Linear(64 * 37, 50)self.Linear2 = nn.Linear(50, 1)

最后输出维度为1,即我们需要预测的风速。

2.模型训练

def CNN_train():    Dtr, Den, Dte = nn_seq()    print(Dte[0])    epochs = 100    model = CNN().to(device)    loss_function = nn.MSELoss().to(device)    optimizer = torch.optim.Adam(model.parameters(), lr=0.001)    # 训练    print(len(Dtr))    Dtr = Dtr[0:5000]    for epoch in range(epochs):        cnt = 0        for seq, y_train in Dtr:            cnt = cnt + 1            seq, y_train = seq.to(device), y_train.to(device)            # print(seq.size())            # print(y_train.size())            # 每次更新参数前都梯度归零和初始化            optimizer.zero_grad()            # 注意这里要对样本进行reshape,            # 转换成conv1d的input size(batch size, channel, series length)            y_pred = model(seq.reshape(1, 1, -1))            loss = loss_function(y_pred, y_train)            loss.backward()            optimizer.step()            if cnt % 500 == 0:                print(f'epoch: {epoch:3} loss: {loss.item():10.8f}')        print(f'epoch: {epoch:3} loss: {loss.item():10.10f}')        state = {'model': model.state_dict(), 'optimizer': optimizer.state_dict()}        torch.save(state, 'Barcelona' + CNN_PATH)

一共训练100轮:

如何使用PyTorch搭建CNN实现风速预测

3.模型预测及表现

def CNN_predict(cnn, test_seq):    pred = []    for seq, labels in test_seq:        seq = seq.to(device)        with torch.no_grad():            pred.append(cnn(seq.reshape(1, 1, -1)).item())    pred = np.array([pred])    return pred

测试:

def test():    Dtr, Den, Dte = nn_seq()    cnn = CNN().to(device)    cnn.load_state_dict(torch.load('Barcelona' + CNN_PATH)['model'])    cnn.eval()    pred = CNN_predict(cnn, Dte)    print(mean_absolute_error(te_y, pred2.T), np.sqrt(mean_squared_error(te_y, pred2.T)))

CNN在Dte上的表现如下表所示:

MAERMSE
1.081.51

如何使用PyTorch搭建CNN实现风速预测

感谢你能够认真阅读完这篇文章,希望小编分享的“如何使用PyTorch搭建CNN实现风速预测”这篇文章对大家有帮助,同时也希望大家多多支持编程网,关注编程网精选频道,更多相关知识等着你来学习!

--结束END--

本文标题: 如何使用PyTorch搭建CNN实现风速预测

本文链接: https://lsjlt.com/news/303294.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • 如何使用PyTorch搭建CNN实现风速预测
    这篇文章主要介绍了如何使用PyTorch搭建CNN实现风速预测,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。数据集数据集为Barcelona某段时间内的气象数据,其中包括温度...
    99+
    2023-06-22
  • PyTorch搭建CNN实现风速预测
    目录数据集特征构造一维卷积数据处理1.数据预处理2.数据集构造CNN模型1.模型搭建2.模型训练3.模型预测及表现数据集 数据集为Barcelona某段时间内的气象数据,其中包括温...
    99+
    2024-04-02
  • PyTorch搭建ANN实现时间序列风速预测
    目录数据集特征构造数据处理1.数据预处理2.数据集构造ANN模型1.模型训练2.模型预测及表现数据集 数据集为Barcelona某段时间内的气象数据,其中包括温度、湿度以及风速等。...
    99+
    2024-04-02
  • PyTorch怎么搭建ANN实现时间序列风速预测
    这篇文章主要介绍了PyTorch怎么搭建ANN实现时间序列风速预测的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇PyTorch怎么搭建ANN实现时间序列风速预测文章都会有所收获,下面我们一起来看看吧。数据集数据...
    99+
    2023-06-30
  • PyTorch搭建LSTM实现时间序列负荷预测
    目录I. 前言II. 数据处理III. LSTM模型IV. 训练V. 测试VI. 源码及数据I. 前言 在上一篇文章深入理解PyTorch中LSTM的输入和输出(从input输入到L...
    99+
    2024-04-02
  • PyTorch搭建LSTM实现多变量时序负荷预测
    目录I. 前言II. 数据处理III. LSTM模型IV. 训练V. 测试VI. 源码及数据I. 前言 在前面的一篇文章PyTorch搭建LSTM实现时间序列预测(负荷预测)中,我们...
    99+
    2024-04-02
  • PyTorch搭建双向LSTM实现时间序列负荷预测
    目录I. 前言II. 原理InputsOutputsbatch_first输出提取III. 训练和预测IV. 源码及数据I. 前言 前面几篇文章中介绍的都是单向LSTM,这篇文章讲一...
    99+
    2024-04-02
  • Pytorch 如何实现LSTM时间序列预测
    开发环境说明: Python 35 Pytorch 0.2 CPU/GPU均可 1、LSTM简介 人类在进行学习时,往往不总是零开始,学习物理你会有数学基础、学习英语你会有中文基础等...
    99+
    2024-04-02
  • PyTorch搭建LSTM实现多变量多步长时序负荷预测
    目录I. 前言II. 数据处理III. LSTM模型IV. 训练和预测V. 源码及数据I. 前言 在前面的两篇文章PyTorch搭建LSTM实现时间序列预测(负荷预测)和PyTorc...
    99+
    2024-04-02
  • 怎么使用PyTorch的hub模块搭建神经网络进行气温预测
    本文小编为大家详细介绍“怎么使用PyTorch的hub模块搭建神经网络进行气温预测”,内容详细,步骤清晰,细节处理妥当,希望这篇“怎么使用PyTorch的hub模块搭建神经网络进行气温预测”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入...
    99+
    2023-07-05
  • 如何使用Kubeadm快速搭建Kubernetes
    这篇文章主要讲解了“如何使用Kubeadm快速搭建Kubernetes”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“如何使用Kubeadm快速搭建Kubernetes”吧!##版本说明 ##...
    99+
    2023-06-19
  • 如何快速搭建并使用ThinkPHP5
    这篇文章主要介绍“如何快速搭建并使用ThinkPHP5”,在日常操作中,相信很多人在如何快速搭建并使用ThinkPHP5问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”如何快速搭建并使用ThinkPHP5”的疑...
    99+
    2023-06-25
  • 怎么使用PyTorch和LSTM实现单变量时间序列预测
    这篇“怎么使用PyTorch和LSTM实现单变量时间序列预测”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“怎么使用PyTor...
    99+
    2023-07-05
  • 技术分享 | 如何使用 dbdeployer 快速搭建 MySQL 测试环境
    作者:余振兴 一、工具介绍 dbdeployer 是一款十分强大的数据库测试环境部署工具,可实现一键部署不同架构、不同版本的数据库环境。 如:MySQL 主从复制、GTID 模式复制、MySQL 组复制(单主模式、多主模式等) 完整的...
    99+
    2022-01-26
    技术分享 | 如何使用 dbdeployer 快速搭建 MySQL 测试环境
  • 如何使用dede快速搭建网站
    使用dede快速搭建网站的方法:安装xampp虚拟环境。打开xampp,运行Apache和MySQL。下载dedeCMS,进行解压。解压后将uploads中所有文件复制到XAMPP/htdocs文件中。打开浏览器,访问“localhost”...
    99+
    2024-04-02
  • 如何使用node快速搭建后台
    这篇文章主要介绍了如何使用node快速搭建后台,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。首先安装node,express,express-generator (4.x版本...
    99+
    2023-06-22
  • 如何快速使用mysqlreplicate搭建MySQL主从
    简介 mysql-utilities工具集是一个集中了多种工具的合集,可以理解为是DBA的工具箱,本文介绍利用其中的mysqlreplicate工具来快速搭建MySQL主从环境。 HE1:192.168.1...
    99+
    2024-04-02
  • Python中如何使用PyTorch实现WGAN
    这篇文章给大家分享的是有关Python中如何使用PyTorch实现WGAN的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。1.GAN简述在GAN中,有两个模型,一个是生成模型,用于生成样本,一个是判别模型,用于判断...
    99+
    2023-06-25
  • 如何使用Pytorch实现two-head模型
    这篇文章将为大家详细讲解有关如何使用Pytorch实现two-head模型,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。如何使用Pytorch实现two-head(多输出)模型1. two-head模型定...
    99+
    2023-06-15
  • 如何使用Bash脚本快速搭建Docker容器?
    Docker 是一种开源的虚拟化技术,它可以帮助我们快速创建、部署和运行应用程序。而 Bash 脚本是一种命令行脚本语言,它可以帮助我们自动化执行一些任务。在本文中,我们将介绍如何使用 Bash 脚本快速搭建 Docker 容器。 安装...
    99+
    2023-08-14
    并发 bash 容器
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作