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)
运行效果(是动图,所以只截取一部分):
我们在这里可以看到,已经成功的实现了神经网络以及存在了自动学习功能。
码字不易,点个赞再走呗。
上一篇: LockSupport