当前位置:   article > 正文

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

pytorch框架应用

目录

一、引言

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

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

  总结:


一、引言

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/
  1. import torch
  2. print((torch.__version__))#查看Pytorch版本1.10.2+cpu

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

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

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

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

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

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

            


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

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

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

①首先定义网络层:

  1. import torch
  2. import torch.nn as nn
  3. class LRM(nn.Module):
  4. def __init__(self,input_dim,output_dim):
  5. super(LRM,self).__init__()
  6. self.liner=nn.Linear(input_dim,output_dim)#全连接层,参数是输入输出的维度
  7. def forward(self, x):#前向传播函数
  8. out=self.liner(x)
  9. return out
  10. input_dim=1
  11. output_dim=1
  12. model=LRM(input_dim, output_dim) #调用线性回归函数,传入两个参数
  13. print(model)

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

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

③训练模型:

  1. for epoch in range(epochs):
  2. epoch + 1
  3. inputs=torch.from_numpy(x_train) #将x_train和y_train的ndarray格式转换为tensor格式,才可训练
  4. labels=torch.from_numpy(y_train)
  5. optimizer.zero_grad() #梯度每一次迭代要清零,不然会累加
  6. outputs=model(inputs) #前向传播
  7. loss = criterion(outputs, labels) #计算损失
  8. loss.backward() #返向传播
  9. optimizer.step() #更新权重权重参数(会自动根据学习率和损失值完成更新)\
  10. if epoch % 50 == 0: #为了观察内部变化,每隔50次打印下损失值
  11. print('epoch{},loss{}'.format(epoch,loss.item()))

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

④测试模型与预测结果:

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

 

 ⑤模型保存与读取

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

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

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

  1. import torch
  2. import pandas as pd
  3. import numpy as np
  4. import warnings
  5. warnings.filterwarnings("ignore")
  6. import matplotlib.pyplot as plt
  7. feasures = pd.read_csv("temps.csv")
  8. print(feasures.head())#打印几行查看下数据的样子

  

  1. import datetime #处理数据
  2. years=feasures['year'] #分别得到年月日
  3. months=feasures['month']
  4. days=feasures['day']
  5. #转换成datetime标准格式,以便后面的可视化
  6. dates=[str(int(year)) + '-' + str(int(month)) + '-' + str(int(day)) for year,month,day in zip(years,months,days)]
  7. dates=[datetime.datetime.strptime(date,'%Y-%m-%d') for date in dates]
  1. #准备画图,查看下数据分布情况
  2. plt.style.use('fivethirtyeight') #指定默认风格
  3. fig, ((ax1,ax2),(ax3,ax4)) = plt.subplots(nrows=2, ncols=2, figsize=(10,10)) #设置布局
  4. fig.autofmt_xdate(rotation=45)
  5. ax1.plot(dates,feasures['actual']) #标签值
  6. ax1.set_xlabel(''); ax1.set_ylabel('Temperature'); ax1.set_title('Max Temp')
  7. ax2.plot(dates,feasures['temp_1']) #昨天值
  8. ax2.set_xlabel(''); ax2.set_ylabel('Temperature'); ax2.set_title('Previous Max Temp')
  9. ax3.plot(dates,feasures['temp_2']) #前天值
  10. ax3.set_xlabel(''); ax3.set_ylabel('Temperature'); ax3.set_title('Two Days Prior Max Temp')
  11. ax4.plot(dates,feasures['friend']) #逗逼朋友胡乱预测的值
  12. ax4.set_xlabel(''); ax4.set_ylabel('Temperature'); ax4.set_title('Friend Estimate')
  13. plt.tight_layout(pad=2)
  14. feasures=pd.get_dummies(feasures)#独热编码,字符串的数据被转换成编码(这一步是因为CSV文件的问题)
  15. print(feasures.head(5))#查看数据的样子(前五行)
  16. plt.show()

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

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

方法一:

  1. #构建网络模型——最麻烦的一种(基于底层运算)
  2. x = torch.tensor(input_features,dtype=float) #将x和y转换为tensor格式
  3. y = torch.tensor(labels,dtype=float)
  4. weights = torch.randn((14,128),dtype=float, requires_grad=True) #权重参数初始化w1,b1,w2,b2。feature.shape是(348,14)
  5. biases = torch.randn(128,dtype=float, requires_grad=True)
  6. weights2 = torch.randn((128,1),dtype=float, requires_grad=True)
  7. biases2 = torch.randn(1,dtype=float, requires_grad=True)
  8. learning_rate = 0.001 #学习率
  9. losses = []
  10. for i in range(1000): #串起网络从前到后的计算流程,迭代1000次
  11. hidden = x.mm(weights) + biases #计算隐层
  12. hidden = torch.relu(hidden) #加入激活函数
  13. predictions = hidden.mm(weights2) + biases2 #预测结果
  14. loss = torch.mean((predictions - y) ** 2) #通计算损失
  15. losses.append(loss.data.numpy())
  16. if i % 100 == 0:
  17. print('loss:',loss) #每迭代100次打印一次损失值
  18. loss.backward() #返向传播计算,等到grad梯度值
  19. weights.data.add_(- learning_rate * weights.grad.data) #更新参数
  20. biases.data.add_(- learning_rate * biases.grad.data)
  21. weights2.data.add_(- learning_rate * weights2.grad.data)
  22. biases2.data.add_(- learning_rate * biases2.grad.data)
  23. weights.grad.data.zero_() #每次迭代完记得将梯度清零
  24. biases.grad.data.zero_()
  25. weights2.grad.data.zero_()
  26. biases2.grad.data.zero_()

方法二:

  1. #更简单的构建网络模型方法(基于nn等模块里的功能函数)
  2. input_size = input_features.shape[1]
  3. hidden_size = 128
  4. output_size = 1
  5. batch_size = 16
  6. my_nn = torch.nn.Sequential(
  7. torch.nn.Linear(input_size, hidden_size),
  8. torch.nn.Sigmoid(),
  9. torch.nn.Linear(hidden_size, output_size),
  10. )
  11. cost = torch.nn.MSELoss(reduction='mean')
  12. optimizer = torch.optim.Adam(my_nn.parameters(), lr=0.001) #优化器,学习率会根据情况逐渐变化
  13. #训练模型
  14. losses = []
  15. for i in range(1000):
  16. batch_loss = []
  17. for start in range (0, len(input_features), batch_size):
  18. end = start + batch_size if start + batch_size < len(input_features) else len(input_features)
  19. xx = torch.tensor(input_features[start: end],dtype=torch.float, requires_grad=True)
  20. yy = torch.tensor(labels[start: end],dtype=torch.float, requires_grad=True)
  21. predictions = my_nn(xx) #预测
  22. loss = cost(predictions, yy) #损失
  23. optimizer.zero_grad() #梯度清零
  24. loss.backward(retain_graph=True) #返向传播
  25. optimizer.step()
  26. batch_loss.append(loss.data.numpy())
  27. if i % 100 == 0:#打印损失
  28. losses.append(np.mean(batch_loss))
  29. print(i,np.mean(batch_loss))

③预测训练结果

  1. #预测训练结果
  2. x = torch.tensor(input_features, dtype=torch.float)
  3. predict = my_nn(x).data.numpy()
  4. #转换日期格式
  5. dates = [str(int(year)) + '-' + str(int(month)) + '-' + str(int(day)) for year,month,day in zip(years,months,days)]
  6. dates = [datetime.datetime.strptime(date,'%Y-%m-%d') for date in dates]
  7. #创建表格来存日期和其对应的标签数值
  8. true_data = pd.DataFrame(data={'date': dates, 'actual': labels})
  9. #再创建表格来存日期和其对应的模型预测值
  10. years = feasures[:,feasure_list.index('year')]
  11. months = feasures[:,feasure_list.index('month')]
  12. days = feasures[:,feasure_list.index('day')]
  13. test_dates =[str(int(year)) + '-' + str(int(month)) + '-' + str(int(day)) for year,month,day in zip(years,months,days)]
  14. test_dates = [datetime.datetime.strptime(date,'%Y-%m-%d') for date in test_dates]
  15. predictions_data = pd.DataFrame(data={'dates': test_dates, 'prediction': predict.reshape(-1)})
  16. #画图显示
  17. plt.plot(true_data['date'], true_data['actual'], 'b-', label = 'actual')#真实值
  18. plt.plot(predictions_data['date'], predictions_data['prediction'], 'ro', label = 'prediction')#预测值
  19. plt.xticks(rotation='60')
  20. plt.legend()

  总结:

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

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/羊村懒王/article/detail/385698
推荐阅读
相关标签
  

闽ICP备14008679号