终于搞懂了PyTorch神经网络构建与Tensorboard可视化直观显示了!绝对的通俗易懂讲解!

文摘   2024-07-24 17:40   湖南  

--------------------

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

神经网络:

先前我们举过一个例子,就是从线性回归来推导神经网络的工作流程。我们使用损失函数,来进行反向传播,也就是使用损失函数来进行梯度下降,我们假设 y = x2 +2 此时,我们输入的是x ,y 但是我们要猜测的是 2 和 2 也就是 y = ax + b 的 a,b 。

之后对于非线性的拟合,我们还有激活函数,那么这个激活函数是什么?就是给我们的线性拟合做非线性变换。(学好神经网络,机器学习,智能优化算法你会发现大部分的数学建模题目都能用这些玩意来做,比如那个2021数学建模的A题我没看懂,C题其实不难但是懒得分析,B直接套,先来个拟合,然后我直接用傅里叶拟合,神经网络推算关系(这个做法可以有,但是过拟合是绝对的,因为数据太少,所以要有大量的误差,灵敏度分析来填坑(然鹅我忘了这个流程))。

最后一个优化直接跑优化算法,然后也是有问题也要评估分析,最后一个根据你的分析带上实验步骤,其实就是分析实验不足,也就是你的模型不足,还需要那些数据来修正。虽然做法很暴力,但是比语文建模好多了,而且分析到位的话是能够拿国奖的)。

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

OK,我们来看看一个基本的神经网络模型:

还有我们上次的那个网络模型:

其实真正完整的过程是这样的:

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

在开始搭建之前,如果你需要这份我自己整理的13个精挑细选的深度学习入门项目思维导图,用来锻炼自己的代码实战能力非常有用,每个项目的教程视频和数据集源码都可以直接点击后面的这个小按钮直接跳转非常方便。

如果需要的话可以直接扫码添加我的小助手让她无偿及时发送给你。

动手搭建线性回归模型:

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

OK,现在我们直接看代码

from torch import nnfrom torch.optim import SGDimport 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 nnfrom torch.optim import SGDimport torchimport 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 nnfrom torch.optim import SGDimport torchimport torch.nn.functional as Ffrom torch.utils.tensorboard import SummaryWriterclass 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()))

代码如上,然后在我们的控制台输入

然后打开浏览器

AI算法工程师Future
B站同名,日常分享人工智能领域知识及学习资源。
 最新文章