您的位置:首页 > 理论基础 > 计算机网络

torch入门笔记11:如何训练神经网络

2016-10-09 15:00 459 查看
这一节先介绍一些基本操作,然后再对我们前面建立的网络进行训练

神经网络的前向传播和反向传播


 

随即生产一张照片,1通道,32x32像素的。为了直观像是,导入image包,然后用itorch.image()方法显示生成的图片,就是随即的一些点。 


 

Step1:

mainly the net initialization -> net: zeroGradParameters将网络里面的梯度缓存设置为0
net:forward() -> get the predict value 

用之前建立好的神经网络net调用forward()方法输入随即生成的图片得到输出的结果,如打印出来的形式,net最后是10个输出节点,这里输出了10个值。注意,这是前向传播,网络里面的权重是随即分布的,这是BP算法之前需要做的运算。 


 
18行是将网络里面的梯度缓存设置为0,19行是网络net的反向传播方法,第一个参数是输入的图片,这里应与forward()方法里面输入的图片一致,第二个参数在这里的意思是训练用的分类标签,注意不是预测出来的标签,是训练样本的真实的标签,即需要拟合的标签。最后返回的是需要输入的梯度,即进行梯度下降算法是需要的那个梯度(可能是,我回头再确认下,这个不影响我们训练)。 

前向传播和反向传播的基本过程就是上面,当然到这还不能我们的网络,还没有定义损失函数,下面介绍损失函数的基本操作。

Step2: set the loss function -> criterion = nn.MSEcriterion()

Get the loss from function -> criterion:forward(predicts,targets)

Then, get the gradient of loss function -> criterion:backward(predicts,targets)
criterion评价准则,这是用来定义损失函数的。当你想让你的神经网络学习一些东西时,你就要给他一些反馈,告诉他怎么做是对的。损失函数能够形式化的衡量你的神经网络的好坏。例子如下: 


 

还是在nn这个包里面有很多的评测函数,在这里我选择了ClassNLLCriterion()这种方法,这是用来多分类的方法,用的是negative log-likelihood(负对数似然概率,抱歉非数学专业不知道怎么翻译这个,不过不影响时候,只需知道他是用来做多分来的评测函数就行)。 


 
损失函数的实现也有正向和方向两个操作,多说一点,不同的神经网络用BP算法求解的思想是一样的,但是定义的网络不同其具体的损失度量不同官方文档还强调该函数特别适合不平衡数据的分类!!!。就这个例子来说我们定义是适合对分类的损失函数,调用他的前向传播方法并输入的参数分别为预测的类和训练样本所属的类。这里执行后会有一个返回值,即他们的误差(err),博主没有进行赋值。 


 
Step3: Get the dl=d(loss_function)(gradients) / dx (input) = D(net_gradients)/Dx -> net:backward(input,gradients)

Updates Nets -> net:updateParamertes(0.01)
return loss, dl_dx  

执行完损失函数的前向操作后,再进行反向操作,backward()方法里面的参数同forward()函数里的参数,返回值是损失函数的梯度。 


 


 

调用神经网络net的backward()方法输入训练集和其对应的损失函数梯度。然后,使用神经网络net的updateParameters()更新权重,该方法的输入值为学习率,即完成了训练。注意,gradInput这个返回值可写可不写不影响我们的训练。
Step4: use the optimization :
optim.sgd(feval, x, sgd_params)  

feval -> return loss,dl/dx

x -> input 

sgd_params -> learning rates
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: