第五讲 pytorch实现神经网络
一 本节课程介绍
1.1 知识点
1、神经网络的基本介绍;
2、pytorch实现神经网络回归预测;
二 课程内容
2.1 神经网络基本介绍
神经网络本质是链式求导法则的应用,它是神经网络的基础,也是神经网络理论的重要发展成果。它的法则从宏观来看很像人类的思考方式,所以通常用它来模拟人类的学习思维能力,被广泛应用于价值评估和价格预测领域。
神经网络结构包括一个输入层,一个输出层,一个或多个隐含层。每层由若干个节点构成,各层节点通过全连接的方式连接,而同层内各神经元之间相互独立。神经网络的训练过程就是不断调整连接权值的过程,这个过程进行到输出的均方误差达到要求的标准。BP神经网络在初始化权重后进行训练,按照一定的规则(如梯度下降)使得输出结果与期望输出误差最小。
BP神经网络的传递函数作为激活输入,通过链式求导法则实现传递函数变换,使之转化为输出。传递函数必须可微,BP神经网络模型较为典型的隐含层传递函数常使用Sigmoid函数等。
2.2 损失函数介绍
损失函数用来评价模型的预测值和真实值不一样的程度,损失函数越好,通常模型的性能越好。不同的模型用的损失函数一般也不一样。在这里常用MSE均方差损失于预测回归模型上,常常使用交叉熵损失用于分类模型上,原因在于均方误差的统计平均和交叉熵的不易陷入局部最优解。
三 实验测试
3.1 数据处理
首先要导入库:
import torch
from torch.autograd import variable
from torch.functional import F
import matplotlib.pyplot as plt
(1)数据生成,在-2到2之间均匀生成200个数据,将其转为100组数据,即100行一列。
x=torch.unsqueeze(torch.linspace(-2,2,100),dim=1)
(2)生成y变量公式,其中torch.rand(x.size())为噪声:
y=x.pow(4)+x+torch.rand(x.size())
(3)将数据转为torch变量。:
x,y=variable(x),variable(y)
3.2 模型结构搭建
建立类变量,初始化,这里使用super(Net,self).init()解释如下:在python中创建类后,通常会创建一个 __ init__ ()方法,这个方法会在创建类的实例的时候自动执行。 __ init__ ()方法必须包含一个self参数,而且要是第一个参数。这里super(Net, self).init()是指首先找到Net的父类,然后把类Net的对象self转换为父类的对象,然后“被转换”的父类对象调用自己的init函数,其实简单理解就是子类把父类的__init__()放到自己的__init__()当中,这样子类就有了父类的__init__()的那些东西。
self.hidden中n_feature为输入为节点数,n_hidden为隐藏节点数,n_output为输出节点数。
Forward定义前向传播,使用Relu激活函数。然后设置隐藏节点为100个。
class Net(torch.nn.Module):
def __init__(self,n_feature,n_hidden,n_output):
super(Net,self).__init__()
self.hidden=torch.nn.Linear(n_feature,n_hidden)
self.output=torch.nn.Linear(n_hidden,n_output)
def forward(self,x):
x=F.relu(self.hidden(x))
x=self.output(x)
return x
net=Net(1,100,1)
3.3 优化器和损失函数
这里我们使用Adagrad损失函数,学习率为0.01,使用均方误差损失用于预测。
opitimizer=torch.optim.Adagrad(net.parameters(),lr=0.01)
loss_func=torch.nn.MSELoss()
3.4 模型迭代训练
这里设置迭代900步,每次迭代需要计算损失,并消除上一步梯度,然后loss反向传播,step前向计算。
losss=[]
for i in range(900):
predict=net(x)
loss=loss_func(predict,y)
opitimizer.zero_grad()
loss.backward()
opitimizer.step()
print(loss)
losss.append(loss.data.numpy())
3.5 可视化绘图
根据损失绘制损失函数图。
plt.plot(losss)
plt.show()
四 思考与作业
(1)尝试测试pytorch不同优化器效果
(2)尝试不同激活函数观察效果
(3)尝试加深网络结构