我正在关注这个演示 - 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
我对此功能有一些疑问
答案 0 :(得分:2)
代码中使用的参数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
的价值增加1
((0) + 1
)或将其设置为_nidx_
(nil
)尚未定义。
首次调用函数时nidx的值是多少?
在该功能之前永远不会设置。尚未设置的变量在lua中具有值dl_dx
。
dl_dx在哪里更新?理想情况下,它应该在更新本地loss_x之后,但它没有明确写入
model:backward()
是模型的渐变张量。 dl_dx
计算给定损失的每个参数的梯度,并将其添加到模型的梯度张量中。由于dl_dx:zero()
是模型的梯度张量,其值将增加。请注意,渐变值是添加,这就是您需要调用dl_dx
(将feval
的值设置为零)的原因,否则您的渐变值将保持不变每次调用<string name="ExpiredWarning">Warning</string>
都会增加。
答案 1 :(得分:1)
x
是一个全局变量,请参阅第126行。该函数似乎只是更新它,而不是使用它。这是一个常见的lua习语:如果不存在,则将事物设置为参数或默认值。功能中的典型用法:
function foo(a, b)
local a = a or 0
local b = b or "foo"
end
根据值,使用and
或or
的表达式计算第一个或第二个参数。如果x and y
不是y
或x
而nil
(无或无),则false
会产生x
。
x or y
不存在(零或假),则 y
会产生x
,否则会产生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)
我不确定你到底是什么意思。它在第152行重置并由函数本身返回。它是一个全局变量,所以它可能有外部用途吗?