我正在尝试实现具有多个层的神经网络。我试图了解我所做的是否正确,如果没有,我该如何调试。我这样做的方式是,我以下面的方式定义我的神经网络(我使用一些先前学过的嵌入来初始化可查询层):
lookupTableLayer = nn.LookupTable(vector:size()[1], d)
for i=1,vector:size()[1] do
lookupTableLayer.weight[i] = vector[i]
end
mlp=nn.Sequential();
mlp:add(lookupTableLayer)
mlp:add(nn.TemporalConvolution(d,H,K,dw))
mlp:add(nn.Tanh())
mlp:add(nn.Max(1))
mlp:add(nn.Tanh())
mlp:add(nn.Linear(H,d))
现在,为了训练网络,我循环遍历每个训练示例,对于每个示例,我调用gradUpdate(),它具有此代码(这直接来自示例):
function gradUpdate(mlp, x, indexY, learningRate)
local pred = mlp:forward(x)
local gradCriterion = findGrad(pred, indexY)
mlp:zeroGradParameters()
mlp:backward(x, gradCriterion)
mlp:updateParameters(learningRate)
end
findGrad函数只是WARP Loss的一个实现,它返回渐变输出。我想知道这是否是我需要的全部?我假设这将反向传播并更新所有层的参数。为了检查这一点,我训练了这个网络并保存了模型。然后我加载了模型并做了:
{load saved mlp after training}
lookuptable = mlp:findModules('nn.LookupTable')[1]
现在,我检查了vector [1]和lookuptable.weight [1],它们是相同的。我无法理解为什么查找表层中的权重没有得到更新?我在这里缺少什么?
期待您的回复!