转自:http://www.aichengxu.com/view/2464033
代码地址:https://github.com/vic-w/torch-practice/tree/master/multilayer-perceptro
--网络结构1-3-3-1,隐含层为两层,每层都有3个神经元,输入层和输出层都有一个神经元
model = nn.Sequential()
--model现在是一个容器,要往这个容器中添加神经网络层(输入层、隐含层、输出层)来构成多层感知器(神经网络)
--容器要添加的第一层为输入层,1个输入, 3个输出
model:add(nn.Linear(1,3))
--然后我们在他后面添加一个Sigmoid层,它的节点个数会自动和前一层的输出个数保持一致。这里的--sigmoid函数是用来将数据归到0-1之间的数
--sigmoid函数有个缺点,当远0点数据时,sigmoid会输出为1,导数接近为0
model:add(nn.Sigmoid())
--接下来我们添加第一和第二隐藏层中间的线性连接,输入是3,输出也是3。
model:add(nn.Linear(3,3))
--作用一样
model:add(nn.Sigmoid())
--增加线性层,3个输入一个输出
model:add(nn.Linear(3,1))
--构建多层感知器的完整代码如下
model = nn.Sequential()
model:add(nn.MulConstant(0.1)) --在输入进入之前先乘以0.1,缩小训练值
model:add(nn.Linear(1,3))
model:add(nn.Sigmoid())
model:add(nn.Linear(3,3))
model:add(nn.Sigmoid())
model:add(nn.Linear(3,1))
model:add(nn.MulConstant(50000)) --在输入之后乘以50000,对预测数据的缩小
--默认的权值优化是梯度下降法,训练速度很慢。其实Torch已经给我们提供了各种先进的优化算法,都--放在optim这个库里。我们在文件的头部添加包含optim库
require 'optim'
--模型的参数拿出来看看,w是权值,1x3+3+3x3+3+3x1+1=22,dl_dw是w对loss的偏导,而且这两个--都是引用,也就是值的变化会影响模型的参数
w, dl_dw = model:getParameters()
feval = function(w_new)
if w ~= w_new then w:copy(w_new) end
--导数初始为0
dl_dw:zero()
--与上一篇的作用相同
price_predict = model:forward(month_train)
loss = criterion:forward(price_predict, price_train)
model:backward(month_train, criterion:backward(price_predict, price_train))
--返回损失和梯度
return loss, dl_dw
end
--参数设定,学习率是0.01
params = {
learningRate = 1e-2
}
--迭代3000次,使用改进的梯度下降法
for i=1,3000 do
optim.rprop(feval, w, params)
--每10次动态画图,{}分割每一组数据,{}中的第一个参数是横坐标点,第二个参数是纵坐标点
ifi%10==0 then
gnuplot.plot({month, price}, {month_train:reshape(10),price_predict:reshape(10)})
end
end