我正在跟踪这个演示- https://github.com/torch/demos/blob/master/linear-regression/example-linear-regression.lua
feval = function(x_new)
-- set x to x_new, if differnt
-- (in this simple example, x_new will typically always point to x,
-- so the copy is really useless)
if x ~= x_new then
x:copy(x_new)
end
-- select a new training sample
_nidx_ = (_nidx_ or 0) + 1
if _nidx_ > (#data)[1] then _nidx_ = 1 end
local sample = data[_nidx_]
local target = sample[{ {1} }] -- this funny looking syntax allows
local inputs = sample[{ {2,3} }] -- slicing of arrays.
dl_dx:zero()
local loss_x = criterion:forward(model:forward(inputs), target)
model:backward(inputs, criterion:backward(model.output, target))
return loss_x, dl_dx
end 我对这一职能有些疑虑。
_nidx_ = (_nidx_ or 0) + 1是什么意思?编辑:
我的point#4现在很清楚了。对于那些有兴趣的人

发布于 2016-05-26 09:24:53
代码中使用的参数x_new (或其副本x)在哪里?
x是模型参数的张量。它以前是通过x, dl_dx = model:getParameters()收购的。model:forward()和model:backward()自动使用此参数张量。x_new是模型的一组新参数,由优化器(SGD)提供。如果它与模型的参数张量有任何不同,您的模型参数将通过x:copy(x_new) (张量的x_new值的就地副本到x)设置为这些新参数。
nidx = (nidx或0) +1是什么意思?
如果还没有定义_nidx_,则通过1 ((_nidx_) + 1)增加_nidx_的值,或者将其设置为1 ((0) + 1)。
当函数首次被调用时,nidx的值是多少?
它从来没有在这个函数之前设置过。尚未设置的变量在lua中具有nil值。
dl_dx在哪里更新?理想情况下,它应该是在更新本地loss_x之后,但它不是显式写入的
dl_dx是模型的梯度张量。model:backward()计算给定损失的每个参数的梯度,并将其添加到模型的梯度张量中。由于dl_dx是模型的梯度张量,它的值会增加。注意,梯度值是添加的,这就是为什么您需要调用dl_dx:zero() (将dl_dx就地值设置为零),否则梯度值将随着feval的每次调用而不断增加。
发布于 2016-05-26 09:24:37
x是一个全局变量,参见第126行。该函数似乎只更新它,而不是使用它。其思想是,使用and或or的表达式根据值计算为第一个或第二个参数。如果x and y不是nil或false,否则是x (0或false),则会产生x。
如果x or y不存在(零或假),则生成y,而其他情况下则生成x。因此,or用于默认参数。
这两者可以用以下方式重写:
-- x and y
if x then
return y
else
return x
end
-- x or y
if x then
return x
else
return y
end_nidx_ = (_nidx or 0) + 1,所以在函数的第一次调用时,_nidx_是零,因为它在任何地方都没有定义。之后,它(全局)被设置为1 (0 + 1)https://stackoverflow.com/questions/37454746
复制相似问题