首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用torch7演示进行线性回归

用torch7演示进行线性回归
EN

Stack Overflow用户
提问于 2016-05-26 07:52:20
回答 2查看 257关注 0票数 0

我正在跟踪这个演示- https://github.com/torch/demos/blob/master/linear-regression/example-linear-regression.lua

代码语言:javascript
复制
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 

我对这一职能有些疑虑。

  1. 代码中使用的参数x_new (或其副本x)在哪里?
  2. _nidx_ = (_nidx_ or 0) + 1是什么意思?
  3. 当函数首次被调用时,nidx的值是多少?
  4. dl_dx在哪里更新?理想情况下,它应该是在更新本地loss_x之后,但它不是显式写入的

编辑:

我的point#4现在很清楚了。对于那些有兴趣的人

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 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的每次调用而不断增加。

票数 2
EN

Stack Overflow用户

发布于 2016-05-26 09:24:37

  1. x是一个全局变量,参见第126行。该函数似乎只更新它,而不是使用它。
  2. 这是一个常见的lua成语:如果不存在参数或默认值,则将其设置为参数或默认值。在职能方面的典型用途: 函数foo(a,b)局部a=a或0局部b=b或"foo“结束

其思想是,使用andor的表达式根据值计算为第一个或第二个参数。如果x and y不是nilfalse,否则是x (0或false),则会产生x

如果x or y不存在(零或假),则生成y,而其他情况下则生成x。因此,or用于默认参数。

这两者可以用以下方式重写:

代码语言:javascript
复制
-- x and y
if x then
    return y
else
    return x
end
-- x or y
if x then
    return x
else
    return y
end
  1. 您有_nidx_ = (_nidx or 0) + 1,所以在函数的第一次调用时,_nidx_是零,因为它在任何地方都没有定义。之后,它(全局)被设置为1 (0 + 1)
  2. 我不知道你到底是什么意思。它在第152行中被重置,并由函数本身返回。它是一个全局变量,所以它可能有外部用途吗?
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37454746

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档