深度学习修炼(五)——基于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上可以…

设计模式杂谈(一)——设计模式概述

文章目录1 设计模式概述1.1 软件设计模式的产生背景1.2 软件设计模式的概念1.3 设计模式的必要性1.4 设计模式分类1 设计模式概述 1.1 软件设计模式的产生背景 设计模式最初并不是在软件设计中&#xff0c;而是被用于建筑领域的设计中。 1977年美国著名建筑大师、加利福尼亚…

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…

云说的到底对不对,京东到底行不行?

摘要&#xff1a;马云吐槽京东被引爆以来&#xff0c;似乎就没人去关注马云说的对不对&#xff0c;有没有价值&#xff0c;大家更多的是在关注马云攻击了京东&#xff0c;京东回击了马云&#xff0c;马云被偷录了&#xff0c;再和人说话要去澡堂了…但&#xff0c;马云说的到底…

JS-随机生成的密码

randPassword(size) >{ //数组 let seed new Array(A,B,C,D,E,F,G,H,I,J,K,L,M,N,P,Q,R,S,T,U,V,W,X,Y,Z, a,b,c,d,e,f,g,h,i,j,k,m,n,p,Q,r,s,t,u,v,w,x,y,z, 2,3,4,5,6,7,8,9 ) //数组长度 seedlength seed.length; let creatPassword[]; for (i0;i<size;i) { j Mat…

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

文章目录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

MySql 错误 Err [Imp] 1153 - Got a packet bigger than 'max_allowed_packet' bytes

今天在用Navicat导入SQL文件时报错&#xff1a;MySql 错误 Err [Imp] 1153 - Got a packet bigger than max_allowed_packet bytes 查了一下&#xff0c;原来是MySQL默认读取执行的SQL文件最大为16M&#xff0c;我这个SQL文件260M&#xff0c;所以执行不过去 解决方法&#xff…

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

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

C++从0到1的入门级教学(十)——类和对象

文章目录10 类和对象10.1 封装10.1.1 封装的意义10.1.2 struct和class的区别10.1.3 成员属性设置为私有10.2 对象的初始化和清理10.2.1 构造函数和析构函数10.2.2 构造函数的分类及调用10.2.3 关于拷贝构造函数调用时机10.2.4 构造函数调用规则10.2.5 深拷贝和浅拷贝10.2.6 初始…

js二级导航

js写二级导航要点 1.ul li 2.js获取元素 3.setInterval(function(),time); 代码如下 1 <style type"text/css">2 ul,li,body{margin:0;padding: 0;}3 #nav{width: 500px;margin: 10px auto;}4 ul li{list-style: none;}5 .clear{clear: both;}6 #n…

关于STM32的两个小问题的总结

一、最近做了一个关于自动转速测试仪的项目&#xff0c;其中用到了STM32的RTC时钟的功能&#xff0c;然后开始写代码&#xff0c;并且成功的跑了起来&#xff0c;于是将自己的板子放到桌面上让它跑了一个晚上看下误差&#xff0c;结果发现经过一晚上&#xff0c;误差并不是很大…

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

文章目录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 分类任务 在这…

修改NavigationBar的分根线颜色

[self.navigationController.navigationBar setShadowImage:[Static ColorToImage:[Static colorWithHexString:[UIColor red]]]]; Static 里的几个静态方法 (UIImage *)ColorToImage:(UIColor *)color{CGRect rectCGRectMake(0.0f, 0.0f, 1.0f, 1.0f);UIGraphicsBeginImageCo…