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

本代码使用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)这两函数,可以释放开来查看构造的函数长啥样。笔者释放开来,可以看到运行的样子长这样:
在这里插入图片描述

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

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输出效果如下:在这里插入图片描述

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)
运行效果(是动图,所以只截取一部分):

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

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

码字不易,点个赞再走呗。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值