【PyTorch框架】——框架安装使用流程搭建PyTorch神经网络气温预测

news2024/12/21 22:07:18

目录

一、引言

二、使用流程——最简单例子试手

三、分类任务——气温预测

  总结:


一、引言

Torch可以当作是能在GPU中计算的矩阵,就是ndarray的GPU版!TensorFlow和PyTorch可以说是当今最流行的框架!PyTorch用起来简单,好用!而TensoFlow用起来没那么自由!caffe比较老,不可处理文本数据,不推荐!

笔者用的时Pycharm的opencv环境!

CPU版本:初学者,训练速度较慢!(到PyTorch官网去生成terminal命令如下)

pip install torch torchvision torchaudio -i https://pypi.tuna.tsinghua.edu.cn/simple/
import torch
print((torch.__version__))#查看Pytorch版本1.10.2+cpu

GPU版本:项目!速度快!(也是到官网)

基本矩阵使用格式与numpy相似,只不过numpy得出的是ndarray的格式,而pytorch得到的矩阵式tensor的格式!

 x=torch.randn(6,6)
 y=x.view(36)
 z=x.view(-1,4)  #-1表示自动计算另一个维度
 print(x.size(),y.size(),z.size())

框架最厉害的点之一就是可以帮我们把返向传播全部计算好(机器学习里的一个求导计算过程)!只需要在最后一层指定返向传播函数就可自动完成每一层求导过程。

tensor常见的形式:scalar、vector、matrix和n-dimensional tensor.

scalar通常是一个数值;vector例如【-5.,2.,0.】通常指特征,例如词向量特征,某一维度的特征,是一组高维数据;多个特征组到一起形成一个矩阵matrix,通常都是高维的;通常处理图像时最低时3 tensor的,h,w,单个色彩通道这三维。

            


二、使用流程——最简单例子试手

线性回归模型:(线性回归实际就是一个不加激活函数的全连接层

#构造一组输入数据x和其对应的标签y
x_values=[i for i in range(11)]
x_train=np.array(x_values,dtype = np.float32)
x_train=x_train.reshape((-1,1)) #转置为列向量,-1表示行数自动计算
y_values=[3*i+4 for i in x_values]  #线性关系y=3x+4
y_train=np.array(y_values,dtype = np.float32)
y_train=x_train.reshape((-1,1)) #转置为列向量,-1表示行数自动计算

①首先定义网络层:

import torch
import torch.nn as nn

class LRM(nn.Module):
    def __init__(self,input_dim,output_dim):
        super(LRM,self).__init__()
        self.liner=nn.Linear(input_dim,output_dim)#全连接层,参数是输入输出的维度
    def forward(self, x):#前向传播函数
        out=self.liner(x)
        return out

input_dim=1
output_dim=1
model=LRM(input_dim, output_dim)  #调用线性回归函数,传入两个参数
print(model)

 ②指定好参数和损失函数:

epochs=1000  #训练次数
learning_rate=0.01 #学习率
optimizer = torch.optim.SGD(model.parameters(), lr=learning_rate) #指定优化器,这里用SGD
criterion=nn.MSELoss()  #定义损失函数。分类任务用交叉熵;回归任务用MSELoss

③训练模型:

for epoch in range(epochs):
    epoch + 1
    inputs=torch.from_numpy(x_train)  #将x_train和y_train的ndarray格式转换为tensor格式,才可训练
    labels=torch.from_numpy(y_train)
    optimizer.zero_grad()    #梯度每一次迭代要清零,不然会累加
    outputs=model(inputs)    #前向传播
    loss = criterion(outputs, labels) #计算损失
    loss.backward() #返向传播
    optimizer.step() #更新权重权重参数(会自动根据学习率和损失值完成更新)\

    if epoch % 50 == 0:  #为了观察内部变化,每隔50次打印下损失值
        print('epoch{},loss{}'.format(epoch,loss.item()))

可以发现随着训练次数的增加,损失值一直减小到接近于0。

④测试模型与预测结果:

predicted=model(torch.from_numpy(x_train).requires_grad_()).data.numpy()
                #x_train转换为tensor传入model前向传播一次,最后再用data.numpy()转换为numpy的ndarray格式,便于打印显示
print(predicted)

 

 ⑤模型保存与读取

torch.save(model.state_dict(),'model.pkl')
model.load_state_dict(torch.load('model.pkl'))

三、分类任务——气温预测

①导入数据&数据前处理&查看数据分布&特征转换

import torch
import pandas as pd
import numpy as np
import warnings
warnings.filterwarnings("ignore")
import matplotlib.pyplot as plt

feasures = pd.read_csv("temps.csv")
print(feasures.head())#打印几行查看下数据的样子

  

import datetime         #处理数据
years=feasures['year']  #分别得到年月日
months=feasures['month']
days=feasures['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]
#准备画图,查看下数据分布情况
plt.style.use('fivethirtyeight') #指定默认风格
fig, ((ax1,ax2),(ax3,ax4)) = plt.subplots(nrows=2, ncols=2, figsize=(10,10)) #设置布局
fig.autofmt_xdate(rotation=45)
ax1.plot(dates,feasures['actual']) #标签值
ax1.set_xlabel(''); ax1.set_ylabel('Temperature'); ax1.set_title('Max Temp')
ax2.plot(dates,feasures['temp_1']) #昨天值
ax2.set_xlabel(''); ax2.set_ylabel('Temperature'); ax2.set_title('Previous Max Temp')
ax3.plot(dates,feasures['temp_2']) #前天值
ax3.set_xlabel(''); ax3.set_ylabel('Temperature'); ax3.set_title('Two Days Prior Max Temp')
ax4.plot(dates,feasures['friend']) #逗逼朋友胡乱预测的值
ax4.set_xlabel(''); ax4.set_ylabel('Temperature'); ax4.set_title('Friend Estimate')
plt.tight_layout(pad=2)
feasures=pd.get_dummies(feasures)#独热编码,字符串的数据被转换成编码(这一步是因为CSV文件的问题)
print(feasures.head(5))#查看数据的样子(前五行)
plt.show()

labels=np.array(feasures['actual'])
feasures=feasures.drop('actual',axis=1) #在特征中去掉标签
feasure_list=list(feasures.columns)   #名字单独保存到list中,防止丢失
feasures=np.array(feasures) #转换成合适格式
#print(feasures.shape)  #查看下数据的大小
from sklearn import preprocessing     #pip insatll -U scikit-learn -i https://pypi.tuna.tsinghua.edu.cn/simple/
input_features= preprocessing.StandardScaler().fit_transform(feasures)
#至此特征全部转换完成

②构建网络模型&并训练(两种方法)

方法一:

#构建网络模型——最麻烦的一种(基于底层运算)
x = torch.tensor(input_features,dtype=float) #将x和y转换为tensor格式
y = torch.tensor(labels,dtype=float)
weights = torch.randn((14,128),dtype=float, requires_grad=True) #权重参数初始化w1,b1,w2,b2。feature.shape是(348,14)
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 = []
for i in range(1000):  #串起网络从前到后的计算流程,迭代1000次
    hidden = x.mm(weights) + biases #计算隐层
    hidden = torch.relu(hidden)  #加入激活函数
    predictions = hidden.mm(weights2) + biases2 #预测结果
    loss = torch.mean((predictions - y) ** 2)  #通计算损失
    losses.append(loss.data.numpy())
    if i % 100 == 0:
        print('loss:',loss)  #每迭代100次打印一次损失值
    loss.backward() #返向传播计算,等到grad梯度值
    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_()

方法二:

#更简单的构建网络模型方法(基于nn等模块里的功能函数)
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)
        predictions = my_nn(xx) #预测
        loss = cost(predictions, 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))

③预测训练结果

#预测训练结果
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})
#再创建表格来存日期和其对应的模型预测值
years = feasures[:,feasure_list.index('year')]
months = feasures[:,feasure_list.index('month')]
days = feasures[:,feasure_list.index('day')]
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={'dates': 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()

  总结:

由于是初学者可能很多地方没有总结完全或者有误,后续深入学习后会不断回来该删,也欢迎各位朋友指正!

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

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

相关文章

【开发者指南】如何在MyEclipse中使用HTML或JSP设计器?(下)

MyEclipse v2022.1.0正式版下载 三、设计编辑基础 “设计”窗口由所见即所得的网页设计画布和UI控制面板组成。在此窗口中&#xff0c;您可以插入、编辑、删除和移动 HTML 和 JSP UI 控件和文本。拖放操作可以轻松实现重新定位设计画布上的UI控件。扩展的复制/粘贴操作能够将…

Unity3D :PlayableGraph

推荐&#xff1a;将NSDT场景编辑器加入你的3D工具链 3D工具集&#xff1a; NSDT简石数字孪生 PlayableGraph PlayableGraph 定义一组绑定到 GameObject 或组件的可播放输出项。PlayableGraph 还定义一组可播放项及其依赖关系。图 1 提供了一个示例。 PlayableGraph 负责管理可…

卷积神经网络实例

文章目录 1. 数据输入2. 创建卷积模型并训练3. 超参数选择 卷积神经网络(CNN)主要由卷积层(Convolutional Layer)、池化层(Pooling Layer)、激活层(Activation Layer)和全连接层(Fully-connected Layer)组成。 卷积层(Convolutional Layer)&#xff1a;卷积层是CNN的核心组成部…

职场新人如何使用ChatGPT提高工作效率

刚刚从象牙塔中毕业&#xff0c;走向社会战场。作为职场新人的同学们刚刚进入公司和部门&#xff0c;难免会被安排做些本职工作之外的事务工作&#xff0c;被上级安排做些零零碎碎的小东西&#xff0c;俗称打杂。这些工作说难不难&#xff0c;想要做漂亮也并不简单&#xff0c;…

Linux实时监控网卡入流量和出流量(iftop、dstat、nethogs、nload)

背景 相同配置和相同业务的4台cvm&#xff0c;今天准备下线&#xff0c;检查还有没有业务流量的时候&#xff0c;发现有两台流量不符合预期&#xff0c;就很奇怪&#xff0c;想知道流量是从哪里来的。记录下当时定位思路 先来了解下基本的概念 一、Mbps、kbps、bps、bit、b…

光纤仿真相关参数——光纤损耗、数值孔径、归一化参数

对于光纤&#xff0c;不难想象它频带宽、损耗低、重量轻、抗干扰能力强、工作性能可靠、成本低等优点。 光纤的损耗可以用以下公式表示&#xff1a; 在光的传播过程中&#xff0c;会按照光线的功率损耗系数\alpha衰减&#xff0c;单位为 我们可以用经过一端距离l后输出的光功率…

electron 使用electron-packager打linux-x64包与linux-arm64包,解决打包缓慢问题

使用electron-packager打linux-x64包与linux-arm64包,解决下载zip打包缓慢问题 在使用electron-packager打包的过程中&#xff0c;需要在第一次下载electron版本对应的zip文件&#xff0c;下载很缓慢&#xff0c;而且还可能出现每次都在下载zip的情况 解决思路是提前下载好zip文…

【Linux】kill、raise、abort函数

目录 1、kill、raise、abort函数2、代码示例 橙色 1、kill、raise、abort函数 /* #include <sys/types.h>#include <signal.h>int kill(pid_t pid, int sig);- 功能&#xff1a;给任何的进程或者进程组pid, 发送任何的信号 sig- 参数&#xff1a;- pid &#xf…

【LED子系统】六、核心层详解(三)

个人主页&#xff1a;董哥聊技术 我是董哥&#xff0c;高级嵌入式软件开发工程师&#xff0c;从事嵌入式Linux驱动开发和系统开发&#xff0c;曾就职于世界500强公司&#xff01; 创作理念&#xff1a;专注分享高质量嵌入式文章&#xff0c;让大家读有所得&#xff01; 文章目录…

腾讯云轻量应用服务器性能测评(全网超详细)

腾讯云轻量应用服务器性能如何&#xff1f;CPU型号主频、内存、公网带宽和系统盘存储多维对比&#xff0c;轻量应用服务器会不会比云服务器CVM性能差&#xff1f;相对于CVM云服务器轻量服务器更适合轻量级的应用&#xff0c;轻量服务适合中小企或个人开发者用于搭建We网站b应用…

测试用例02

复习 基于需求设计测试用例 分析需求&#xff0c;验证需求&#xff0c;细化需求&#xff0c;从需求中提取一个个的测试点&#xff0c;根据每一个测试点&#xff0c;采用具体的设计测试用例的方法取设计测试用例&#xff1a; 有多细致的需求&#xff0c;就有多细致的测试用例&am…

BATJ架构师首推!分布式事务原理与实战,出神入化

前言 广度与深度兼备、理论与实战兼顾的《分布式事务原理与实战》从以下5个维度全面深入的讲解了分布式事务&#xff1a; 基础知识维度&#xff1a;首先全面介绍了事务和分布式事务的概念和基础知识&#xff0c;然后详细讲解了MySQL事务和Spring事务的实现原理。 解决方案维度…

新一代产业变革席卷全球,深眸科技融合AI+机器视觉实现智造升级

随着新一代产业变革席卷全球&#xff0c;人工智能成为变革的核心方向&#xff0c;借助人工智能崛起的东风&#xff0c;机器视觉也逐渐成为工业制造业的必选项。在工业4.0和中国制造2025的推动下&#xff0c;中国制造企业纷纷投入到智能化转型的过程中&#xff0c;但就目前来看&…

YOLO 算法系列

我们分享了YOLO系列的文章&#xff0c;包括前段时间刚刚发布的YOLOv7检测算法&#xff0c;虽然YOLOv7对象检测算法是YOLO最新的模型&#xff0c;且可以支持对象分割&#xff0c;人体姿态检测等&#xff0c;但是最新的YOLO系列检测模型也同步进行了更新&#xff0c;那就是刚刚开…

正版软件,官方授权。RadiAnt DICOM Viewer - 软件版 / CD/DVD版

灵活、简单、快速 RadiAnt 是一个医学图像的 PACS DICOM 浏览器 设计是为了给您独特体验&#xff0c;它界面直观&#xff0c;性能无与伦比&#xff0c;您的体验感一定爆棚&#xff01; RadiAnt DICOM Viewer是一款专为医学影像浏览看图而设计的软件。它具有单个窗口界面&…

全屋智能,始终在等一双“究极手”

《塞尔达传说&#xff1a;王国之泪》是今年迄今为止最火爆的游戏&#xff0c;也是全球科技爱好者在这个5月里共同关注的热门话题。 游戏中&#xff0c;有一个广大玩家津津乐道的新功能&#xff0c;是主角林克具备了一种名为“究极手”的能力。它可以把游戏里的各种各样的物品组…

卷起来!Dr. LLaMA:通过生成数据增强改进特定领域 QA 中的小型语言模型,重点关注医学问答任务...

大家好&#xff0c;最近突然发现了一篇在专门应用于医学领域的LLaMA&#xff0c;名为Dr.LLaMA&#xff08;太卷了太卷了&#xff09;&#xff0c;就此来分享下该语言模型的构建方法和最终的性能情况。 论文&#xff1a;Dr. LLaMA: Improving Small Language Models in Domain-S…

晶能转债,正元转02上市价格预测

晶能转债 基本信息 转债名称&#xff1a;晶能转债&#xff0c;评级&#xff1a;AA&#xff0c;发行规模&#xff1a;100.0亿元。 正股名称&#xff1a;晶科能源&#xff0c;今日收盘价&#xff1a;12.19元&#xff0c;转股价格&#xff1a;13.79元。 当前转股价值 转债面值 / …

word怎么转换pdf?提供几个思路

在现代互联网时代&#xff0c;我们经常需要将文档转换为PDF格式&#xff0c;以便于共享和打印。虽然Word文件是最常见的文档格式之一&#xff0c;但是许多人不知道如何将其转换为PDF格式。在本文中&#xff0c;我们将介绍如何使用不同的方法将Word文档转换为PDF格式。 使用第三…

Flutter实现PopupMenu(弹出设置菜单)

PopupMenuButton简介 PopupMenuButton是一个用于创建弹出菜单的小部件。它通常与IconButton或其他触发菜单显示的小部件一起使用。当用户点击触发按钮时&#xff0c;PopupMenuButton会在屏幕上方或下方弹出一个菜单&#xff0c;显示一组选项供用户选择。 PopupMenuButton常用…