阅读 124

Pytorch神经网络构建&直观显示

前言

这里主要分两部分,一个是如何直观的显示出我们预测的效果,或者是误差,另一个是如何进行网络的搭建,以及再次理解神经网络。

神经网络

先前我们举过一个例子,就是从线性回归来推导神经网络的工作流程。我们使用损失函数,来进行反向传播,也就是使用损失函数来进行梯度下降,我们假设 y = x2 +2 此时,我们输入的是x ,y 但是我们要猜测的是 2 和 2 也就是 y = ax + b 的 a,b 。之后对于非线性的拟合,我们还有激活函数,那么这个激活函数是什么?就是给我们的线性拟合做非线性变换。(学好神经网络,机器学习,智能优化算法你会发现大部分的数学建模题目都能用这些玩意来做,比如那个2021数学建模的A题我没看懂,C题其实不难但是懒得分析,B直接套,先来个拟合,然后我直接用傅里叶拟合,神经网络推算关系(这个做法可以有,但是过拟合是绝对的,因为数据太少,所以要有大量的误差,灵敏度分析来填坑(然鹅我忘了这个流程)),最后一个优化直接跑优化算法,然后也是有问题也要评估分析,最后一个根据你的分析带上实验步骤,其实就是分析实验不足,也就是你的模型不足,还需要那些数据来修正。虽然做法很暴力,但是比语文建模好多了,而且分析到位的话是能够拿国奖的)。

神经网络在运行的过程中其实分三大部分,第一部分是初始化,这个就是我说的先随便猜测几个参数,第二个部分是通过损失函数,进行反向传递(也就是梯度下降)来优化我们的未知参数,最后一步就是各种优化

OK,我们来看看一个基本的神经网络模型 在这里插入图片描述

还有我们上次的那个网络模型 在这里插入图片描述

其实真正完整的过程是这样的 在这里插入图片描述 但是注意哦,在实际的神经网络当中 我们的 “线性”是有双引号的,例如图像等等。如果只是说拟合的话,我们可以这样说,因为输入的参数,维度就是这样的线性的离散的。

动手搭建线性回归模型

现在,我们是时候使用pytorch搭建一个简单的线性模型了 在此我们先简单地说一下我们的API Linear 这个是我们的线性层,对比上面的图片 在这里插入图片描述

OK,现在我们直接看代码

from torch import nn from torch.optim import SGD import torch class LineBack(nn.Module):     def __init__(self):         super().__init__()         self.line = nn.Linear(1,1)     def forward(self,x):         x = self.line(x)         return x myline = LineBack() optim = SGD(myline.parameters(),lr=0.01) lossfunction = nn.MSELoss() #数据生成 x = [i for i in range(10)] y = [(i*2 + 2) for i in range(10)] #数据转换 x = torch.tensor(x,dtype=torch.float) x = x.reshape(-1,1) #变成10行一列 y = torch.tensor(y,dtype=torch.float) y = y.reshape(-1,1) for epoch in range(1,1001):     optim.zero_grad()#清空梯度防止影响     outputs = myline(x)     loss = lossfunction(outputs,y)     loss.backward()     optim.step()     if(epoch % 50 == 0):         print("训练:{}次的总体误差为{}".format(epoch,loss.item())) 复制代码

然后,让我们看看效果

在这里插入图片描述

总体上还是非常简单的。

我们的y = 2*x +2

非线性模型搭建

前面我们搭建了线性模型,那么现在我们来看看非线性模型。

这里由于是非线性的,所以我们必须使用激活函数。这里使用的是rule

from torch import nn from torch.optim import SGD import torch import torch.nn.functional as F class LineBack(nn.Module):     def __init__(self):         super().__init__()         self.line1 = nn.Linear(1,10)         self.line2 = nn.Linear(10,1)     def forward(self,x):         x = F.relu(self.line1(x)) # 这个和nn.RELU()是一样的,区别是这个可以当中函数在forward里面使用         x = self.line2(x)         return x myline = LineBack() optim = SGD(myline.parameters(),lr=0.01) lossfunction = nn.MSELoss() #数据生成 x = torch.linspace(-1, 1, 100) #生成-1到1的100个数字 y =  x.pow(2) + 0.2*torch.rand(x.size()) #数据转换 x = x.reshape(-1,1) #变成10行一列 y = y.reshape(-1,1) for epoch in range(1,1001):     optim.zero_grad()#清空梯度防止影响     outputs = myline(x)     loss = lossfunction(outputs,y)     loss.backward()     optim.step()     if(epoch % 50 == 0):         print("训练:{}次的总体误差为{}".format(epoch,loss.item())) 复制代码

在这里插入图片描述

TensorBoard 直观显示

前面我们在控制台显示可不好看,所以我们得华哥图,我们可以直接使用matplotlib但是在我们的tensorflow或者是pytorch里面有tensorboard这玩意可以画图,而且功能相当强大。

不过在使用之前,你需要下载

pip install tensorboard

或者使用conda,看你的环境,我是直接把pytorch环境当中本机环境了,我双系统,而且先前有 virtualenv 创建开发环境。

from torch import nn from torch.optim import SGD import torch import torch.nn.functional as F from torch.utils.tensorboard import SummaryWriter class LineBack(nn.Module):     def __init__(self):         super().__init__()         self.line1 = nn.Linear(1,10)         self.line2 = nn.Linear(10,1)     def forward(self,x):         x = F.relu(self.line1(x)) # 这个和nn.RELU()是一样的,区别是这个可以当中函数在forward里面使用         x = self.line2(x)         return x wirter = SummaryWriter("logs") #图形工具,logs保存路径 myline = LineBack() optim = SGD(myline.parameters(),lr=0.01) lossfunction = nn.MSELoss() #数据生成 x = torch.linspace(-1, 1, 100) #生成-1到1的100个数字 y =  x.pow(2) + 0.2*torch.rand(x.size()) #数据转换 x = x.reshape(-1,1) #变成10行一列 y = y.reshape(-1,1) for epoch in range(1,1001):     optim.zero_grad()#清空梯度防止影响     outputs = myline(x)     loss = lossfunction(outputs,y)     loss.backward()     optim.step()     if(epoch % 50 == 0):         percent =(1- loss.item())*100         wirter.add_scalar("接近度",percent,epoch)         print("训练:{}次的总体误差为{}".format(epoch,loss.item())) 复制代码

代码如上,然后在我们的控制台输入 在这里插入图片描述 然后打开浏览器 在这里插入图片描述 后面我们再来说是如何使用Pytorch搭建CNN神经网络,已经常见的神经网络。之后我们搭建一个简单的5层神经网络CIFAR10这个最经典的神经网络,也是数据集比较小的。没办法神经网络就是要用数据来喂。


作者:Huterox
链接:https://juejin.cn/post/7057736576293404709


文章分类
代码人生
版权声明:本站是系统测试站点,无实际运营。本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 XXXXXXo@163.com 举报,一经查实,本站将立刻删除。
相关推荐