欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Pytorch--1.使用Pytorch搭建一个简易的神经网络

程序员文章站 2022-07-06 12:34:35
...

本代码使用torch神经网络库,使用python实现,使用matplotlib实现可视化。

1.首先,导入我们所需要的库

import torch
from torch.autograd import Variable
import torch.nn.functional as F
import matplotlib.pyplot as plt

其中,torch是用来构建神经网络的必备的库,Variable是用来进行数据处理的(神经网络进行处理的数据类型都是Variable数据类型),matplotlib是用来进行可视化实现的

2.产生假数据

我们要运行神经网络,就是要对数据进行处理,所以我们这里先产生一些假数据,来以便看到神经网络的效果

x = torch.unsqueeze(torch.linspace(-1,1,100),dim=1)
y = x.pow(2) + 0.2*torch.rand(x.size()) ##[]表示的是维度数据
x,y = Variable(x),Variable(y)
#神经网络只能输入Variable类型的数据

#下面这两行代码可以看到神经网络生成的图长什么样子
#plt.scatter(x.data.numpy(),y.data.numpy())
#plt.show()

下面注释掉的两行(也就是plt.scatter和plt.show)这两函数,可以释放开来查看构造的函数长啥样。笔者释放开来,可以看到运行的样子长这样:
Pytorch--1.使用Pytorch搭建一个简易的神经网络

这两行可以注掉或者放出来,笔者这边就注释掉了。

3.构建神经网络

构建我们的神经网络类,先展现出代码,解释在代码下方。

class Net(torch.nn.Module):
    def __init__(self,n_features,n_hidden,n_output): #构造函数
        #构造函数里面的三个参数分别为,输入,中间隐藏层处理,以及输出层
        super(Net,self).__init__() #官方步骤
        self.hidden=torch.nn.Linear(n_features,n_hidden)
        self.predit=torch.nn.Linear(n_hidden,n_output)

    def forward(self,x):  #搭建的第一个前层反馈神经网络  向前传递
        x = F.relu(self.hidden(x))
        x = self.predit(x)  #此行可预测也可以不预测
        return x

init()这个函数为构造函数,必须得要,我们在里面设置两个值,一个是从输入到隐藏层,一个是从隐藏层预测到输出层(我们构建的是一个最简单的三层神经网络)
forward函数为前层反馈神经网络,用于对神经网络进行更新交替,修改里面的参数。像x=self.predit(x)这一行代码可要可不要,这行代码的目的是为了进行预测,但是预测的话可能会丢失边界值(因为到了最后的边界值将不会进行预测)

4.初始化神经网络

net = Net(1,10,1)
#print(net)  //此行用于观看到是否网络搭建成功,产生效果

这个Net(1,10,1)表示,输入为1,输出为1,中间的第二层(也就是隐藏层)的神经元个数为10。可以print一下看到我们搭建的神经网络,print输出效果如下:Pytorch--1.使用Pytorch搭建一个简易的神经网络

5.进行神经网络的运行

optimizer = torch.optim.SGD(net.parameters(),lr=0.5)
loss_func = torch.nn.MSELoss() #使用均方差处理回归问题


for t in range(100):
    prediction =net(x)

    loss = loss_func(prediction,y) #//预测值一定要在前面,真实值要在后面

    optimizer.zero_grad() #将所有参数的梯度全部降为0,梯度值保留在这个里面
    loss.backward()    #反向传递过程
    optimizer.step()   #优化梯度

    if t%5==0:
        plt.cla()
        plt.scatter(x.data.numpy(),y.data.numpy())
        plt.plot(x.data.numpy(),prediction.data.numpy(),'r-',lw=5)
        plt.text(0.5,0,'Loss=%.4f' % loss.data,fontdict={'size':20,'color':'red'})
        plt.pause(0.1)

使用SGD进行随机梯度下降,使用MSEloss进行均方差回归处理。接着就行一个循环操作(也就是学习操作,学习100次),神经网络的解释附在代码中,这里就不做搬运工了,下面的if主要起到的作用的是实现可视化界面,同时我们可以在第4步的时候在print的后面加上两行代码:
plt.ion()
plt.show()
这样就可以实现图像的实时打印。

6.完整代码如下

import torch
from torch.autograd import Variable
import torch.nn.functional as F
import matplotlib.pyplot as plt

x = torch.unsqueeze(torch.linspace(-1,1,100),dim=1)
y = x.pow(2) + 0.2*torch.rand(x.size()) ##[]表示的是维度数据
x,y = Variable(x),Variable(y)
#神经网络只能输入Variable类型的数据

#下面这两行代码可以看到神经网络生成的图长什么样子
plt.scatter(x.data.numpy(),y.data.numpy())
plt.show()



class Net(torch.nn.Module):
    def __init__(self,n_features,n_hidden,n_output): #构造函数
        #构造函数里面的三个参数分别为,输入,中间隐藏层处理,以及输出层
        super(Net,self).__init__() #官方步骤
        self.hidden=torch.nn.Linear(n_features,n_hidden)
        self.predit=torch.nn.Linear(n_hidden,n_output)

    def forward(self,x):  #搭建的第一个前层反馈神经网络  向前传递
        x = F.relu(self.hidden(x))
        x = self.predit(x)  #此行可预测也可以不预测
        return x



net = Net(1,10,1)
#print(net)  #//此行用于观看到是否网络搭建成功,产生效果
###下面代码实现可视化
plt.ion()   #实现图像的实时打印
plt.show()

optimizer = torch.optim.SGD(net.parameters(),lr=0.5)
loss_func = torch.nn.MSELoss() #使用均方差处理回归问题


for t in range(100):
    prediction =net(x)

    loss = loss_func(prediction,y) #//预测值一定要在前面,真实值要在后面

    optimizer.zero_grad() #将所有参数的梯度全部降为0,梯度值保留在这个里面
    loss.backward()    #反向传递过程
    optimizer.step()   #优化梯度

    if t%5==0:
        plt.cla()
        plt.scatter(x.data.numpy(),y.data.numpy())
        plt.plot(x.data.numpy(),prediction.data.numpy(),'r-',lw=5)
        plt.text(0.5,0,'Loss=%.4f' % loss.data,fontdict={'size':20,'color':'red'})
        plt.pause(0.1)
运行效果(是动图,所以只截取一部分):

Pytorch--1.使用Pytorch搭建一个简易的神经网络
Pytorch--1.使用Pytorch搭建一个简易的神经网络
Pytorch--1.使用Pytorch搭建一个简易的神经网络

我们在这里可以看到,已经成功的实现了神经网络以及存在了自动学习功能。

码字不易,点个赞再走呗。