深度学习修炼(五)——基于pytorch神经网络模型进行气温预测

文章目录

  • 5 基于pytorch神经网络模型进行气温预测
    • 5.1 实现前的知识补充
      • 5.1.1 神经网络的表示
      • 5.1.2 隐藏层
      • 5.1.3 线性模型出错
      • 5.1.4 在网络中加入隐藏层
      • 5.1.5 激活函数
      • 5.1.6 小批量随机梯度下降
    • 5.2 实现的过程
      • 5.2.1 预处理
      • 5.2.2 搭建网络模型
    • 5.3 简化实现
    • 5.4 评估模型

5 基于pytorch神经网络模型进行气温预测

在前面的学习中,我们已经有了一个大概的思路,但是,线性模型毕竟十分简单,我们需要再搭建一个强化自己的知识点。

在这节课中,我们将会用到以下的数据集,请点击自主下载。

temps.zip - 气温预测数据集下载

感谢我吧!C站上面有那么多的付费资源,而我自掏腰包买了这个资源无偿分享。

5.1 实现前的知识补充

我们不同于前面的线性模型神经网络,我们在下面的小节中打算搭建的是一个多层感知机

5.1.1 神经网络的表示

多层感知机是啥?让我们来看看线性回归的神经网络先。

在之前的学习中,线性回归可以多参数,最终输出只有一个。但是在多层感知机中,它的模型架构确是这样:

image-20211227173204553

以上的图是一个神经网络的图片,让我们给这个图片的不同部分取些名字。

我们由输入特征x1,x2...xnx_1,x_2...x_nx1,x2...xn,它们被竖直地堆叠起来,这叫做神经网络的输入层。但是前面我们也说过,这一层只提供输入特征,计算不在这一层,所以一般输入层是不算入神经网络的层数的。然后这里还有另外一层我们称之为隐藏层;而在最后一层是输出层,他负责产生预测值。

5.1.2 隐藏层

在训练集中,当通过神经网络的时候,隐藏层计算的值我们是不知道的,也就是说我们看不见它们在训练集中具有的值。当然你要是真想知道里面的值是啥,你可以从输入层开始根据隐藏层对应的算法一步一步算进去。

5.1.3 线性模型出错

虽然我们前面一直在用线性回归模型,但是并不代表我们能一直用下去。因为线性意味着自变量和因变量呈单调趋势。也就是说:特征变大模型输出就变大,特征变小输出就变小。

5.1.4 在网络中加入隐藏层

我们可以通过在网络中加入一个或多个隐藏层来克服线性模型的限制, 使其能处理更普遍的函数关系类型。 要做到这一点,最简单的方法是将许多全连接层堆叠在一起。 每一层都输出到上面的层,直到生成最后的输出。 我们可以把前L−1层看作表示,把最后一层看作线性预测器。 这种架构通常称为多层感知机(multilayer perceptron),通常缩写为MLP。 下面,我们以图的方式描述了多层感知机。

image-20211227174900706

5.1.5 激活函数

这里我们暂时不细讲激活函数,但是你需要知道的点是,在使用神经网络时,为了方式其输出单调,我们需要在隐藏层和输出层中使用激活函数,从而将输出结果投射到某个区间上。

激活函数有多种,如ReLU(修正线性单元)及其变体、sigmoid函数、tanh函数等。如果输出是0、1值(二分类问题),则输入层选择sigmoid函数,然后其它的所有单元都选择ReLU函数。这是很多激活函数的默认选择,如果在隐藏层上不确定用哪个激活函数,那么通常会使用ReLU激活函数。

5.1.6 小批量随机梯度下降

在前面机器学习中,我们曾经提到优化损失函数的方法是用梯度下降(gradient descent)的方法,这种方法几乎可以用来优化所有深度学习模型,他通过不断地在损失函数递减的方向上更新参数来降低误差。

梯度下降最简单的用法是计算损失函数关于模型参数的导数。但实际上执行可能会非常慢,因为每一次更新参数,我们基本遍历每个样本。一次,我们通常会在每次更新的时候抽取一小批样本,这种方法的变体我们叫做小批量随机梯度下降。如下面所示:

(w,b)<−(w,b)−η∣B∣∑i∈B∂(w,b)l(i)(w,b)(w,b)<-(w,b)-\frac{η}{|B|} \sum _{i∈B}∂_{(w,b)}l^{(i)}(w,b)(w,b)<(w,b)BηiB(w,b)l(i)(w,b)

我们现在从所有的样本中抽取了BBB个样本,也就是小批量BBB。参数η我们叫做学习率。

5.2 实现的过程

5.2.1 预处理

在实现前,我们先导入所需的包。

import pandas as pd
import numpy as np
import torch
import matplotlib.pyplot as plt

我们把提前下载好的数据集加载进去,并且查看前五行以及特征,方便后续处理。

features = pd.read_csv('temps.csv')# 查看数据前五行
features.head()

out:

image-20220324121241215

数据说明

  • temp_2:前天的最高温度值
  • temp_1:昨天的最高温度值
  • average:在历史中,每年这一天的平均最高温度值
  • actual:标签值,当天的真实最高温度
  • friend:朋友预测的可能值

让我们查看数据有多少,即查看维度:

# 查看数据的维度
print('数据维度:',features.shape)

out:

数据维度: (348, 9)

我们注意到这里有很多关于时间的特征,我们将其处理为时间序列。如果你这里不是很懂,照做即可。

# 将时间转换为时间序列
import datetime# 分别得到年、月、日
years = features['year']
months = features['month']
days = features['day']# datetime格式
dates = [str(int(year))+'-'+str(int(month))+'-'+str(int(day)) for year,month,day in zip(years,months,days)]
dates = [datetime.datetime.strptime(date,'%Y-%m-%d') for date in dates]

打印结果看看!

dates[:5]

out:

[datetime.datetime(2016, 1, 1, 0, 0),
datetime.datetime(2016, 1, 2, 0, 0),
datetime.datetime(2016, 1, 3, 0, 0),
datetime.datetime(2016, 1, 4, 0, 0),
datetime.datetime(2016, 1, 5, 0, 0)]

除此之外,我们还注意到数据中的week特征为字符串,字符串可不能处理,我们必须将其转换为可处理的类型,根据前面所讲的知识点,我们将其转换为独热编码。

# 将week转为独热编码
features = pd.get_dummies(features)
features.head(5)

out:

image-20220324121639234

我们是要预测当天的气温,所以我们应该把actual看做标签项,提取出来。

# 分离y_train
labels = np.array(features['actual'])# 在特征中去掉y_train
features = features.drop('actual',axis = 1)# 名字单独保存一下,以备后患
feature_list = list(features.columns)# 转换成合适的格式
features = np.array(features)

查看一下训练集的大小:

features.shape

out:

(348, 14)

再次观察数据,有些特征的数据数值很大有些则很小,我们需要做标准化。从机器学习的学习得知,我们可以利用sklearn的库来进行标准化。

#有些数值大有些数值小,做标准化
from sklearn import preprocessing
input_features = preprocessing.StandardScaler().fit_transform(features)

5.2.2 搭建网络模型

首先我们需要将输出到网络模型中的数据转换为网络能接受的张量格式。

# 将array转为张量
x = torch.tensor(input_features,dtype = float)
y = torch.tensor(labels,dtype = float)

我们打算搭建具有一个隐藏层的多层感知机,为此,我们设定两个线性模型及参数,并且随机初始化它们。观察训练集的特征为14,所以输出层的w必须是(14,m),其中m我随意指定为128,意为将14个输入特征转化为隐藏层的128个隐藏特征。由矩阵相乘知识可以得出的是348×128的矩阵,所以我们的biases指定为(128×1)。隐藏层同理。

# 权重参数初始化
weights = torch.randn((14,128),dtype = float,requires_grad = True)
biases = torch.randn(128,dtype = float,requires_grad = True)
weights2 = torch.randn((128,1),dtype = float,requires_grad = True)
biases2 = torch.randn(1,dtype = float,requires_grad = True)

我们还要指定学习率和存放每次计算所得损失的列表。

learning_rate = 0.001
losses = []

做完上述工作,我们开始对网络模型进行梯度下降。

# 指定梯度下降次数1000次
for i in range(1000):# 计算隐藏层-线性模型hidden = x.mm(weights) + biases# 加入激活函数-加入激活函数hidden = torch.relu(hidden)# 预测结果计算-输出值predictions = hidden.mm(weights2) + biases2# 计算损失-平方损失函数loss = torch.mean((predictions - y) ** 2)# 将每次的损失转为numpy格式并添加到损失列表中losses.append(loss.data.numpy())# 打印损失值if i % 100 == 0:print('loss:',loss)# 反向传播计算loss.backward()# 更新参数weights.data.add_(- learning_rate * weights.grad.data)biases.data.add_(- learning_rate * biases.grad.data)weights2.data.add_(- learning_rate * weights2.grad.data)biases2.data.add_(- learning_rate * biases2.grad.data)# 每次迭代后清空梯度weights.grad.data.zero_()biases.grad.data.zero_()weights2.grad.data.zero_()biases2.grad.data.zero_()

out:

loss: tensor(6845.0772, dtype=torch.float64, grad_fn=)
loss: tensor(155.3488, dtype=torch.float64, grad_fn=)
loss: tensor(147.4410, dtype=torch.float64, grad_fn=)
loss: tensor(145.0307, dtype=torch.float64, grad_fn=)
loss: tensor(143.6870, dtype=torch.float64, grad_fn=)
loss: tensor(142.8334, dtype=torch.float64, grad_fn=)
loss: tensor(142.2421, dtype=torch.float64, grad_fn=)
loss: tensor(141.7909, dtype=torch.float64, grad_fn=)
loss: tensor(141.4391, dtype=torch.float64, grad_fn=)
loss: tensor(141.1529, dtype=torch.float64, grad_fn=)

至此,训练模型完毕。以上就是一个简单的网络模型搭建过程。

5.3 简化实现

我们前面“基本上”是从零搭建了神经网络模型。而事实上,torch为我们提供了丰富的API帮我们实现神经网络,我们试着再一次实现。

# 指定规模
input_size = input_features.shape[1]
hidden_size = 128
output_size = 1
batch_size = 16# 搭建网络
my_nn = torch.nn.Sequential(torch.nn.Linear(input_size,hidden_size),torch.nn.Sigmoid(),torch.nn.Linear(hidden_size,output_size),
)# 定义损失函数
cost = torch.nn.MSELoss(reduction = 'mean')
optimizer = torch.optim.Adam(my_nn.parameters(),lr = 0.001)
# 训练网络
losses = []
for i in range(1000):batch_loss = []# 小批量随机梯度下降进行训练for start in range(0,len(input_features),batch_size):end = start+batch_size if start + batch_size < len(input_features) else len(input_features)xx = torch.tensor(input_features[start:end],dtype = torch.float,requires_grad = True)yy = torch.tensor(labels[start:end],dtype = torch.float,requires_grad = True)prediction = my_nn(xx)loss = cost(prediction,yy)optimizer.zero_grad()loss.backward(retain_graph=True)optimizer.step()batch_loss.append(loss.data.numpy())# 打印损失# 打印损失值if i % 100 == 0:losses.append(np.mean(batch_loss))print(i,np.mean(batch_loss))

out:

0 3984.4104
100 37.5414
200 35.608612
300 35.26231
400 35.09969
500 34.969772
600 34.853214
700 34.73715
800 34.61541
900 34.48683

5.4 评估模型

我们可以尝试用下面的代码去评估,代码较复杂,复制下去跑出看看效果即可。

x = torch.tensor(input_features,dtype = torch.float)
predict = my_nn(x).data.numpy()# 转换日期格式
dates = [str(int(year))+'-'+str(int(month))+'-'+str(int(day)) for year,month,day in zip(years,months,days)]
dates = [datetime.datetime.strptime(date,'%Y-%m-%d') for date in dates]# 创建一个表格来存日期和其对应的标签数值
true_data = pd.DataFrame(data = {'date':dates,'actual':labels})# 同理,在创建一个来存日期和其对应的模型预测值
mouths = features[:,feature_list.index('month')]
days = features[:,feature_list.index('day')]
years = features[:,feature_list.index('year')]test_dates = [str(int(year))+'-'+str(int(month))+'-'+str(int(day)) for year,month,day in zip(years,months,days)]
test_dates = [datetime.datetime.strptime(date,'%Y-%m-%d') for date in test_dates]predictions_data = pd.DataFrame(data = {'date':test_dates,'prediction':predict.reshape(-1)})# 真实值
plt.plot(true_data['date'],true_data['actual'],'b-',label = 'actual')# 预测值
plt.plot(predictions_data['date'],predictions_data['prediction'],'ro',label = 'prediction')
plt.xticks(rotation = '60')
plt.legend()# 图名
plt.xlabel('Date');plt.ylabel('Maximum Temperature (F)');plt.title('Actual and Predicted Values')plt.show()

out:

image-20220324181119663

看得出来,我们的模型拟合能力效果还是不错的。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/398598.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Android 应用程序集成FaceBook 登录及二次封装

1、首先在Facebook 开发者平台注册一个账号 https://developers.facebook.com/ 开发者后台 https://developers.facebook.com/apps 2、创建账号并且获得 APP ID 图一 图二 图三 图四 图五 3、获取app签名的Key Hashes 值&#xff08;两种方式&#xff09; 3.1方法1&#xff1…

IKAnalyzer进行中文分词和去停用词

最近学习主题模型pLSA、LDA&#xff0c;就想拿来试试中文。首先就是找文本进行切词、去停用词等预处理&#xff0c;这里我找了开源工具IKAnalyzer2012&#xff0c;下载地址&#xff1a;(&#xff1a;(注意&#xff1a;这里尽量下载最新版本&#xff0c;我这里用的IKAnalyzer201…

C++从0到1的入门级教学(六)——函数

文章目录6 函数6.1 概述6.2 函数的定义6.3 函数的调用6.4 值传递6.5 函数的常见形式6.6 函数的声明6.7 函数的分文件编写6 函数 6.1 概述 作用&#xff1a;将一段经常使用的代码封装起来&#xff0c;减少重复代码。 一个较大的程序&#xff0c;一般分为若干个程序块&#xf…

PC实用手册

为什么80%的码农都做不了架构师&#xff1f;>>> ##Win10除了Edge/IE&#xff0c;其他浏览器打开和载入速度都很慢 解决办法&#xff1a;以管理员身份运行cmd&#xff0c;输入netsh winsock reset重置winsock&#xff0c;然后重启电脑即可 转载于:https://my.oschin…

MySQL之表的约束

一 介绍 约束条件与数据类型的宽度一样&#xff0c;都是可选参数 作用&#xff1a;用于保证数据的完整性和一致性主要分为&#xff1a; PRIMARY KEY (PK) 标识该字段为该表的主键&#xff0c;可以唯一的标识记录 FOREIGN KEY (FK) 标识该字段为该表的外键 NOT NULL 标…

eclipse静态部署tomcat

转载于:https://www.cnblogs.com/sprinng/p/4223798.html

jvm fastdebug

背景 RednaxelaFX 写道agapple 写道还有一个问题&#xff0c;就是在验证一些逃逸优化时&#xff0c;有些jvm参数用不了&#xff0c;比如-XX:printInlining&#xff0c;-XX:printAssembly&#xff0c;jdk用的是1.6.11和jdk1.6.18-XX:PrintInlining在product build的Sun JDK上可以…

hmailserver批量添加用户

2019独角兽企业重金招聘Python工程师标准>>> 将内容复制到txt文件中后缀改为vbs 将用户名密码替换为自己的 脚本内容如下: Option Explicit On Error resume nextDim obBaseApp Dim objFSO Dim objTextFile Dim strNewAlias,iDim scrreport Dim failed Dim added fa…

数据库杂谈(九)——事务管理

文章目录9 事务管理9.1 恢复机制9.2 事务和日志9.2.1 事务9.2.2 运行记录的结构9.2.2.1 活动事务表9.2.2.2 提交事务表9.2.2.3 日志9.2.3 提交规则和先记后写规则9.2.3.1 提交规则9.2.3.2 先记后写规则9.3 更新策略以及故障后的恢复9 事务管理 9.1 恢复机制 数据对一个单位是…

CSS邮件相关

转载于:https://blog.51cto.com/8465917/1758775

沙箱模式以及其使用到的IIFE

//沙箱//与外界隔绝的一个环境&#xff0c;外界无法修改该环境内任何信息&#xff0c;沙箱内的东西单独属于一个世界//360沙箱模式//将软件和操作系统进行隔离&#xff0c;以达到安全的目的//苹果手的app使用的就是沙箱模式去运行//隔离app的空间&#xff0c;每个app独立运行//…

深度学习修炼(六)——神经网络分类问题

文章目录6 分类任务6.1 前置知识6.1.1 分类6.1.2 分类的网络6.2 动手6.2.1 读取数据6.2.2 functional模块6.2.3 继续搭建分类神经网络6.2.4 继续简化6.2.5 训练模型6.3 暂退法6.3.1 重新看待过拟合问题6.3.2 在稳健性中加入扰动6.3.3 暂退法实际的实现6.4 后话6 分类任务 在这…

深度学习修炼(七)——卷积神经网络

文章目录7 卷积神经网络7.1 卷积网络和传统网络的区别7.2 卷积7.2.1 卷积过程画大饼7.2.2 图像的不变性7.2.3 互相关运算*(补充)7.2.4 图像颜色通道*(补充)7.2.5 步幅7.2.6 多次卷积7.2.7 边缘填充7.2.8 特征图的大小7.2.9 卷积参数共享7.3 池化7.4 整体网络架构7.5 后话7 卷积…

网络爬虫(一)——爬虫及其实现

文章目录1.1 爬虫概述1.1.3 网络爬虫和浏览器的区别1.1.2 网络爬虫的定义1.2 requests请求库1.2.1 requests基本概念1.2.2 疫情数据爬取1.2.3 get请求1.2.4 headers请求头1.2.5 Cookies验证1.3 Beautiful Soup解析库1.3.1 安装1.3.2 对象的创建1.3.3 find方法1.3.4 后话1.4 正则…

Windows五种IO模型性能分析和Linux五种IO模型性能分析

Windows五种IO模型性能分析和Linux五种IO模型性能分析 http://blog.csdn.net/jay900323/article/details/18141217 http://blog.csdn.net/jay900323/article/details/18140847 重叠I/O模型的另外几个优点在于&#xff0c;微软针对重叠I/O模型提供了一些特有的扩展函数。当使用重…

C++从0到1的入门级教学(十一)——友元

文章目录11 友元11.1 全局函数做友元11.2 友元类11.3 成员函数做友元11 友元 让我们引入一个例子来讲述友元是什么。 生活中你的家有客厅&#xff0c;有卧室&#xff0c;客厅所有来的客人都可以进去&#xff0c;但是你的卧室是私有的。对于认识的人来说你可以允许它进去&…

KeyMob:为国内应用开发者管理的广告聚合平台

为什么80%的码农都做不了架构师&#xff1f;>>> 应用开发者在应用中嵌入广告SDK的来源主要包括两种&#xff1a;使用移动广告平台与移动广告聚合平台。国内有多少家提供移动广告管理的平台&#xff1f;据统计&#xff0c;这两个版本&#xff0c;已经有四五十家。虽…

模拟航班查询及预定系统 编写示例

一、建立C#窗体 所需控件&#xff1a; Label标签 Button 按钮 TextBox 文本框 ComboBox 组合框 DATaGridView 数据显示 DateTimePicker 日期表 NumericUpDown 数字选择 二、建立后台数据库 大概需要四张表 1&#xff0c;航空公司表 2&#xff0c;城市信息表 3&#xff0c;航班…

数据结构杂谈(七)——串

文章目录7 串7.1 基本知识7.1.1 串的定义:rose:定义:rose:各种概念:rose:字符串和线性表的区别7.1.2 串的抽象类型数据定义7.1.3 串的比较:rose:原理7.2 串的存储结构:rose:7.2.1串的顺序存储:rose:7.2.2 串的链式存储7.3 基本操作:rose:7.3.1 返回子串操作:rose:7.3.2 比较操作…

Linux实现的IEEE 802.q VLAN

本文转载自&#xff1a; http://blog.chinaunix.net/uid-20786208-id-4291059.html Technorati 标签: Linux VLAN--------------------------我是快乐的分割线-------------------------------------------------- 第一部分&#xff1a;VLAN的核心概念 说起IEEE 802.1q&#xf…