在gihub:https://github.com/torch/tutorials/blob/master/2_supervised/4_train.lua上,我们有一个定义训练过程的脚本示例。我对这个脚本中的feval函数的构造很感兴趣。
-- create closure to evaluate f(X) and df/dX
local feval = function(x)
-- get new parameters
if x ~= parameters then
parameters:copy(x)
end
-- reset gradients
gradParameters:zero()
-- f is the average of all criterions
local f = 0
-- evaluate function for complete mini batch
for i = 1,#inputs do
-- estimate f
local output = model:forward(inputs[i])
local err = criterion:forward(output, targets[i])
f = f + err
-- estimate df/dW
local df_do = criterion:backward(output, targets[i])
model:backward(inputs[i], df_do)
-- update confusion
confusion:add(output, targets[i])
end
-- normalize gradients and f(X)
gradParameters:div(#inputs)
f = f/#inputs
-- return f and df/dX
return f,gradParameters
end我尝试通过抑制循环来修改此函数:对于i= 1,#input会...因此,我不是按输入(inputsi)进行前向和后向输入,而是对整个迷你批处理(Input)进行输入。这真的加快了这个过程。以下是修改脚本:
-- create closure to evaluate f(X) and df/dX
local feval = function(x)
-- get new parameters
if x ~= parameters then
parameters:copy(x)
end
-- reset gradients
gradParameters:zero()
-- f is the average of all criterions
local f = 0
-- evaluate function for complete mini batch
-- estimate f
local output = model:forward(inputs)
local f = criterion:forward(output, targets)
-- estimate df/dW
local df_do = criterion:backward(output, targets)
-- update weight
model:backward(inputs, df_do)
-- update confusion
confusion:batchAdd(output, targets)
-- return f and df/dX
return f,gradParameters
end但是,当我详细检查给定小批量的feval (f,gradParameters)的返回时,使用循环和不使用循环得到的结果不同。
所以我的问题是:1-为什么我们有这个循环?2-在没有这个循环的情况下有可能得到同样的结果吗?
关于Sam
注:我是Torch7的初学者
发布于 2016-09-21 23:57:46
我相信你已经注意到了,获得第二种工作方式需要的不仅仅是简单地更改feval。在您的第二个示例中,输入需要是4D张量,而不是3D张量表(除非我上次更新后发生了变化)。根据所使用的损失标准/模型,这些张量具有不同的大小。无论是谁实现了这个示例,都一定认为循环是一种更简单的方法。此外,ClassNLLCriterion似乎不喜欢批处理(通常会使用CrossEntropy标准来解决这个问题)。
抛开这些不谈,这两种方法应该会产生相同的结果。唯一的细微差别是,第一个示例使用平均误差/梯度,第二个示例使用总和,您可以从中看到:
gradParameters:div(inputs:size(1))
f = f/inputs:size(1)在第二种情况下,f和gradParameters应该只与第一种情况的因子opt.batchSize不同。对于优化目的,它们在数学上是等效的。
https://stackoverflow.com/questions/39571214
复制相似问题