PyTorch实战1

news2024/12/24 21:13:39

传送门:蓝桥云课实验

目录

  • 1. 实验环境
  • 2. 实验目的
  • 3. 相关原理
  • 4. 实验步骤
    • 4.1 数据预处理
      • 4.1.1 对于类型变量的处理
      • 4.1.2 对于数值类型变量进行标准化
      • 4.1.3 数据集分割
    • 4.2 创建模型
      • 手写用Tensor运算的人工神经网络
    • 4.3 训练模型
      • 4.3.1 数据的分批次处理
    • 4.4 测试模型

1. 实验环境

Jupyter Notebook
Python 3.7
PyTorch 1.4.0

2. 实验目的

构建人工神经网络,并用它来预测未来某地区租赁单车的使用情况。

3. 相关原理

数据归一化、类型变量的转换。
搭建基本神经网络的方法。
数据分批次训练原则。
测试及简单分析神经网络的方法

4. 实验步骤

#数据的下载与解压:
!wget http://labfile.oss.aliyuncs.com/courses/1073/bike-sharing-dataset.zip
!unzip bike-sharing-dataset.zip

数据都在文件“hour.csv”中,该文件大小为 1.2M,完全可以直接读取到内存中
在这里插入图片描述
数据文件记录了每小时(hr)共享单车的使用数量(cnt),除了这两个数据项外,还包括当天的日期(dteday),季节(season),星期几(weekday),是否是假期(holiday),当天的温度、湿度、风速、用户是否注册等等,我们就是要使用这些数据训练神经网络模型。

4.1 数据预处理

import numpy as np
import pandas as pd #读取csv文件的库
import matplotlib.pyplot as plt
import torch
from torch.autograd import Variable
import torch.optim as optim

# 让输出的图形直接在Notebook中显示
%matplotlib inline

#首先,让我们再来看看数据长什么样子
#读取数据到内存中,rides为一个dataframe对象
data_path = 'bike-sharing-dataset/hour.csv'
rides = pd.read_csv(data_path)
rides.head()  #运用 pandas 模块的 head 方法,将数据的数据表头和部分数据项打印出来。

4.1.1 对于类型变量的处理

类型变量是指这个变量的不同值仅仅表达不同的类型,值的大小不同但没有高低之分。
有很多变量都属于类型变量,例如 season=1,2,3,4 代表四季。
我们不能将 season 变量直接输入到神经网络,这是因为 season 数值越高并不表示相应的信号强度越大。

解决方案是将类型变量用一个“一位热码“(one-hot)来编码,也就是:
𝑠𝑒𝑎𝑠𝑜𝑛=1→(1,0,0,0)
𝑠𝑒𝑎𝑠𝑜𝑛=2→(0,1,0,0)
𝑠𝑒𝑎𝑠𝑜𝑛=3→(0,0,1,0)
𝑠𝑒𝑎𝑠𝑜𝑛=4→(0,0,0,1)
因此,如果一个类型变量有 n 个不同取值,那么我 one-hot 所对应的向量长度就为 n。
例如:
在这里插入图片描述

#对于类型变量的特殊处理
# season=1,2,3,4, weathersi=1,2,3, mnth= 1,2,...,12, hr=0,1, ...,23, weekday=0,1,...,6
# 经过下面的处理后,将会多出若干特征,例如,对于season变量就会有 season_1, season_2, season_3, season_4
# 这四种不同的特征。
dummy_fields = ['season', 'weathersit', 'mnth', 'hr', 'weekday']
for each in dummy_fields:
    #利用pandas对象,我们可以很方便地将一个类型变量属性进行one-hot编码,变成多个属性
    dummies = pd.get_dummies(rides[each], prefix=each, drop_first=False)
    rides = pd.concat([rides, dummies], axis=1)

# 把原有的类型变量对应的特征去掉,将一些不相关的特征去掉
fields_to_drop = ['instant', 'dteday', 'season', 'weathersit', 
                  'weekday', 'atemp', 'mnth', 'workingday', 'hr']
data = rides.drop(fields_to_drop, axis=1)
data.head()

从显示出的数据中可以看到一年四季、12 个月份、24 个小时数、一周 7 天、天气情况都已经被转化成了 one-hot 变量。
在这里插入图片描述

4.1.2 对于数值类型变量进行标准化

由于每个数值型变量都是相互独立的,所以它们的数值绝对大小与问题本身没有关系。(更看重变化趋势而非数值大小)
为了消除数值大小的差异,我们对每一个数值型变量进行标准化处理,也就是让其数值都围绕着0左右波动。
比如,对于温度 temp 这个变量来说,它在整个数据库取值的平均值为 mean(temp),方差为 std(temp),所以,归一化的温度计算为:
在这里插入图片描述
这样做的好处就是可以将不同的取值范围的变量设置为让它们处于一个平等的地位。

# 调整所有的特征,标准化处理
quant_features = ['cnt', 'temp', 'hum', 'windspeed']
#quant_features = ['temp', 'hum', 'windspeed']

# 我们将每一个变量的均值和方差都存储到scaled_features变量中。
scaled_features = {}
for each in quant_features:
    mean, std = data[each].mean(), data[each].std()
    scaled_features[each] = [mean, std]
    data.loc[:, each] = (data[each] - mean)/std

4.1.3 数据集分割

首先,在变量集合上,我们分为了特征和目标两个集合。

其中,特征变量集合包括:年份(yr),是否节假日( holiday),温度(temp),湿度(hum),风速(windspeed),季节1~4(season),天气1~4(weathersit,不同天气种类),月份1~12(mnth),小时0~23(hr),星期0~6(weekday),它们是输入给神经网络的变量;

目标变量包括:用户数(cnt),临时用户数(casual),以及注册用户数(registered),其中我们仅仅将 cnt 作为我们的目标变量,另外两个暂时不做任何处理。

这样我们就将利用 56 个特征变量作为神经网络的输入,来预测 1 个变量作为神经网络的输出。
接下来,我们再将 17379 条纪录划分为两个集合,分别为前 16875 条记录作为训练集训练我们的神经网络;后 21 天的数据,也就是 21x24=504 条记录作为测试集来检验我们的模型的预测效果。这一部分数据是不参与神经网络训练的。

# 将所有的数据集分为测试集和训练集,我们以后21天数据一共21*24个数据点作为测试集,其它是训练集
test_data = data[-21*24:]
train_data = data[:-21*24]
print('训练数据:',len(train_data),'测试数据:',len(test_data))

# 将我们的数据列分为特征列和目标列

#目标列
target_fields = ['cnt', 'casual', 'registered']
features, targets = train_data.drop(target_fields, axis=1), train_data[target_fields]
test_features, test_targets = test_data.drop(target_fields, axis=1), test_data[target_fields]

# 将数据从pandas dataframe转换为numpy
X = features.values
Y = targets['cnt'].values
Y = Y.astype(float)

Y = np.reshape(Y, [len(Y),1])
losses = []

features.head()

在这里插入图片描述

4.2 创建模型

# 定义神经网络架构,features.shape[1]个输入层单元,10个隐含层,1个输出层
input_size = features.shape[1]
hidden_size = 10
output_size = 1
batch_size = 128
neu = torch.nn.Sequential(         #调用 torch.nn.Sequential 来构造的神经网络
    torch.nn.Linear(input_size, hidden_size),      #从输入到隐含层的线性映射
    torch.nn.Sigmoid(),
    torch.nn.Linear(hidden_size, output_size),     #从隐含到输出的线性映射
)
cost = torch.nn.MSELoss()      # PyTorch 自带的损失函数
#neu.parameters():neu包含的所有权重和偏置       lr=0.01:执行梯度下降算法的学习率
optimizer = torch.optim.SGD(neu.parameters(), lr = 0.01)    #PyTorch自带了优化器来自动实现优化算法

注:torch.nn.Sequential :作用是将一系列的运算模块按顺序搭建成一个多层的神经网络。
torch.nn.Sigmoid():隐含层的非线性 Sigmoid 函数
torch.nn.MSELoss :是 PyTorch 自带的一个封装好的计算均方误差的损失函数,它是一个函数指针,赋予了变量 cost
cost(x,y) :计算时调用这个函数,就可以计算预测向量 x 和目标向量 y 之间的均方误差。
torch.optim.SGD :调用了 PyTorch 自带的随机梯度下降算法(Stochastic Gradient Descent,SGD)作为优化器。

手写用Tensor运算的人工神经网络

# 定义神经网络架构,features.shape[1]个输入层单元,10个隐含层,1个输出层
input_size = features.shape[1] #输入层单元个数
hidden_size = 10 #隐含层单元个数
output_size = 1 #输出层单元个数
batch_size = 128 #每隔batch的记录数
weights1 = Variable(torch.randn([input_size, hidden_size]), requires_grad = True) #第一到二层权重
biases1 = Variable(torch.randn([hidden_size]), requires_grad = True) #隐含层偏置
weights2 = Variable(torch.randn([hidden_size, output_size]), requires_grad = True) #隐含层到输出层权重
def neu(x):
    #计算隐含层输出
    #x为batch_size * input_size的矩阵,weights1为input_size*hidden_size矩阵,
    #biases为hidden_size向量,输出为batch_size * hidden_size矩阵    
    hidden = x.mm(weights1) + biases1.expand(x.size()[0], hidden_size)
    hidden = torch.sigmoid(hidden)

    #输入batch_size * hidden_size矩阵,mm上weights2, hidden_size*output_size矩阵,
    #输出batch_size*output_size矩阵
    output = hidden.mm(weights2)
    return output
def cost(x, y):
    # 计算损失函数
    error = torch.mean((x - y)**2)
    return error
def zero_grad():
    # 清空每个参数的梯度信息
    if weights1.grad is not None and biases1.grad is not None and weights2.grad is not None:
        weights1.grad.data.zero_()
        weights2.grad.data.zero_()
        biases1.grad.data.zero_()
def optimizer_step(learning_rate):
    # 梯度下降算法
    weights1.data.add_(- learning_rate * weights1.grad.data)
    weights2.data.add_(- learning_rate * weights2.grad.data)
    biases1.data.add_(- learning_rate * biases1.grad.data)

4.3 训练模型

4.3.1 数据的分批次处理

设置每批处理的数据大小 batch_size = 128

# 神经网络训练循环
losses = []
for i in range(1000):
    # 每128个样本点被划分为一个撮,在循环的时候一批一批地读取
    batch_loss = []
    # start和end分别是提取一个batch数据的起始和终止下标
    for start in range(0, len(X), batch_size):
        end = start + batch_size if start + batch_size < len(X) else len(X)
        xx = Variable(torch.FloatTensor(X[start:end]))
        yy = Variable(torch.FloatTensor(Y[start:end]))
        predict = neu(xx)
        loss = cost(predict, yy)
        optimizer.zero_grad()
        loss.backward()
        optimizer.step()
        batch_loss.append(loss.data.numpy())

    # 每隔100步输出一下损失值(loss)
    if i % 100==0:
        losses.append(np.mean(batch_loss))
        print(i, np.mean(batch_loss))
        
# 打印输出损失值
fig = plt.figure(figsize=(10, 7))
plt.plot(np.arange(len(losses))*100,losses, 'o-')
plt.xlabel('epoch')
plt.ylabel('MSE')
输出:
0 0.90184915
100 0.26658106
200 0.21872732
300 0.12553026
400 0.085256845
500 0.07389378
......

横坐标表示训练周期,纵坐标表示平均误差。可以看到,平均误差快速地随训练周期而下降
在这里插入图片描述

4.4 测试模型

# 用训练好的神经网络在测试集上进行预测
targets = test_targets['cnt'] #读取测试集的cnt数值
targets = targets.values.reshape([len(targets),1]) #将数据转换成合适的tensor形式
targets = targets.astype(float) #保证数据为实数

# 将属性和预测变量包裹在Variable型变量中
x = Variable(torch.FloatTensor(test_features.values))
y = Variable(torch.FloatTensor(targets))

# 用神经网络进行预测
predict = neu(x)
predict = predict.data.numpy()


# 将后21天的预测数据与真实数据画在一起并比较
# 横坐标轴是不同的日期,纵坐标轴是预测或者真实数据的值
fig, ax = plt.subplots(figsize = (10, 7))

mean, std = scaled_features['cnt']
ax.plot(predict * std + mean, label='Prediction', linestyle = '--')
ax.plot(targets * std + mean, label='Data', linestyle = '-')
ax.legend()
ax.set_xlabel('Date-time')
ax.set_ylabel('Counts')
# 对横坐标轴进行标注
dates = pd.to_datetime(rides.loc[test_data.index]['dteday'])
dates = dates.apply(lambda d: d.strftime('%b %d'))
ax.set_xticks(np.arange(len(dates))[12::24])
_ = ax.set_xticklabels(dates[12::24], rotation=45)

在这里插入图片描述
最后就是预测结果分析实验就结束了
通过数据的可视化,两条曲线基本吻合,但在12.25前后实际与预测偏差较大。
考虑现实12.25是圣诞节,并且之后1.1是元旦节,人们的出行习惯会有很大不同,又因为训练样本只有两年长度,圣诞节前后的样本只有1次,所以没有办法对这个特殊假期的模式进行更准确的预测。

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

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

相关文章

逆向-还原代码之eth (Arm 64)

// 源程序 #include <stdio.h> #define HIETH_SYSREG_BASE (0x101e0000) #define REG_RESET 0x01C // 外设控制寄存器(IP软复位控制) #define RESET_SHIFT 12 static void hieth_set_regbit(unsigned long addr, int bit, int shift) { unsigned long …

Practise test day16

一.单选 1.在关系型是数据库中&#xff0c;有两个不同的事务同时操作数据库中同一表的同一行&#xff0c;不会引起冲突的是&#xff1a;&#xff08;F&#xff09; A. 其中一个DELETE操作&#xff0c;一个是SELECT操作 B. 其中两个都是UPDATE C. 其中一个是SELECT&#xff…

ruoyi通过oauth对接pig实现sso流程讲解

1、时序图 2、流程解析 本流程是以使用Ruoyi对接Pig授权中心为例&#xff0c;进行讲解&#xff0c;其他网站的的oauth的原理都和这个一样&#xff0c;所以只要把这个流程搞懂了即可&#xff0c;接下来就按照真实的流程进行逐步解析。 2.1 第1步 用户还未登录&#xff0c;访问r…

浏览器Performance性能监控使用详解

文章目录1.Performance2.测试性能操作流程3.Performance检测结果详解区域1&#xff1a;controls【控制栏】区域2&#xff1a;overview【网页性能总览图】区域3&#xff1a;火焰图【各项指标的堆叠追踪可视化】区域4&#xff1a;统计汇总【以图表的形式汇总数据】4 其他监控性能…

BGP在数据中心的应用6——BGP在服务器上的应用

注&#xff1a; 本文根据《BGP in the Datacenter》整理&#xff0c;有兴趣和英文阅读能力的朋友可以直接看原文&#xff1a;https://www.oreilly.com/library/view/bgp-in-the/9781491983416/上一部分笔记请参考&#xff1a;https://blog.csdn.net/tushanpeipei/article/deta…

视频如何在线生成二维码?视频转二维码的2种方法

现在很多小伙伴都喜欢将视频转二维码&#xff0c;通过这种方式来分享传递内容&#xff0c;那么如何将视频生成二维码更加的简单快捷呢&#xff1f;大家可以用一下小编分享的这款在线二维码生成工具来制作二维码&#xff0c;通过浏览器在线生成二维码&#xff0c;更加的简单快捷…

设计模式——迭代器模式

迭代器模式一、基本思想二、结构图三、代码一、基本思想 提供一个对象来顺序访问聚合对象中的一系列数据&#xff0c;而不暴露聚合对象的内部表示。迭代器模式是一种对象行为型模式&#xff0c;其主要优点如下&#xff1a; 访问一个聚合对象的内容而无须暴露它的内部表示。遍…

【Kotlin】函数 ④ ( 匿名函数参数 | 匿名函数 it 关键字 )

文章目录一、匿名函数参数二、匿名函数 it 关键字一、匿名函数参数 匿名函数 可以不带参数 , 也可以带多个参数 ; 不带参数的匿名函数 : // 声明 函数类型 变量, 并为其赋值 匿名函数val helloFun: ()->String {"Hello World"}带参数的匿名函数 : 匿名函数 的 参…

安装一个Excel插件,轻松网罗50+主流数据库

电子表格软件&#xff08;Smartbi Spreadsheet&#xff09;是思迈特软件推出的企业报表产品&#xff0c;产品以“真Excel”为特色&#xff0c;只需要安装一个小小插件&#xff0c;就能解决Excel最头疼的数据连接和性能问题。电子表格软件的数据源范围涵盖了本地数据库、关系型数…

如何学习虚幻引擎的Blueprint?

&#xff08;虚幻学习路线-方法概括版&#xff09; 【写在前面】&#xff1a;本篇内容颇多&#xff0c;并不是一大堆全学&#xff0c;把这篇当成一个字典&#xff0c;选择性学习&#xff0c;缺哪学哪~ 一、Blueprint &#xff08;一&#xff09;什么是虚幻引擎的Blueprint&…

C++STL之list容器

一&#xff1a;list特性list为带哨兵位双向循环链表&#xff0c;支持任意位置的插入和删除。与&#xff08;array&#xff0c;vector&#xff0c;deque&#xff09;相比&#xff0c;list的移除元素效率更高。最大缺陷是不支持[]重载&#xff0c;不支持随机访问&#xff0c;只能…

基于 EventBridge API Destination 构建 SaaS 集成实践方案

作者&#xff1a;赵海 引言 事件总线 EventBridge 是阿里云提供的一款无服务器事件总线服务&#xff0c;支持阿里云服务、自定义应用、SaaS 应用以标准化、中心化的方式接入&#xff0c;并能够以标准化的 CloudEvents 1.0 协议在这些应用之间路由事件&#xff0c;帮助您轻松构…

Mockjs入门基础概念与使用

文章目录Mockjs入门使用1、概述2、安装引入3、语法规范3.1 数据模板定义规范&#xff08;DTD)3.1.1 DTD介绍3.1.2 规范实例演示字符串String数字Number布尔Boolean对象Object数组Array函数Function正则表达式RegExp3.2 数据占位符定义规范DPD4、关于Mock.mock()方法4.1 参数介绍…

RabbitMQ 常见面试题

RabbitMQ 常见面试题 1.为什么要用消息队列? (消息队列的应用场景?) 2.各种消息队列产品的比较? 3.消息队列的优点和缺点? 4.如何保证消息队列的高可用? 5.如何保证消息不丢失? 6.如何保证消息不被重复消费?(如何保证消息消费的幂等性&#xff09; 7.如何保证消息消费的…

PMP证书好考吗?

PMP 还是很好考的&#xff0c;各大机构 3A 的人也很多&#xff0c;我的备考经验分享给大家参考下&#xff0c;大家可以取长补短&#xff0c;找到适合自己的备考方法&#xff1a;一、复习计划的制定根据之前在培训班共同奋斗的小伙伴学习时间统计&#xff0c;平均每天的学习时间…

我的第一门编程语言

元旦节在家重温了一遍《三体》&#xff0c;看到下面一段描写&#xff1a;监听部的计算机系统也远比发射部庞大复杂&#xff0c;叶文洁第一次走进主机房时&#xff0c;看到一排阴极射线管显示屏&#xff0c;她惊奇地发现&#xff0c;屏幕上竟滚动着一排排程序代码&#xff0c;可…

KITTI评价指标学习

在pointpillars完成训练后,可以看到对于目标检测的评估,据了解,这是kitti的标准目标检测格式,所以了解了一下. 在generate label finished后,可以看到类别Car对应的AP(Average precision)有3个0.70,分别对应的是Kitti object detection中,被分为Easy, Moderate,和Hard三种级别物…

算法训练 —— 哈希

目录 1. LeetCode242. 有效字母的异位词 2. LeetCode349. 两个数组的交集 3. LeetCode350. 两个数组的交集II 4. LeetCode202. 快乐数 5. LeetCode1. 两数之和 1. LeetCode242. 有效字母的异位词 有效字母的异位词 本题的含义就是判断两个字符串是否相同&#xff1b; 我们…

文档管理降低运营成本的 5 大方法

文档管理降低运营成本的 5 大方法 正在寻找降低成本和最大化生产力的方法的首席财务官和首席信息官已经知道&#xff0c;良好的文档管理可以在几个月内收回成本。数字文档管理&#xff08;有时称为“企业内容管理”或 ECM&#xff09;通过自动化工作流程和消除耗时的手动任务来…

第三十四讲:神州路由器远程管理

1、路由器的带外管理 Username: admin Password: Router>ena Router#conf Router_config#username dcn password 123456 Router_config#enable password 0 789 Router_config#aaa authentication enable default enable Router_config# aaa authentication login de…