首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >关于tutorials上的feval函数/2_supervised/4_Train.lua

关于tutorials上的feval函数/2_supervised/4_Train.lua
EN

Stack Overflow用户
提问于 2016-09-19 18:43:23
回答 1查看 172关注 0票数 2

在gihub:https://github.com/torch/tutorials/blob/master/2_supervised/4_train.lua上,我们有一个定义训练过程的脚本示例。我对这个脚本中的feval函数的构造很感兴趣。

代码语言:javascript
复制
-- 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)进行输入。这真的加快了这个过程。以下是修改脚本:

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

EN

回答 1

Stack Overflow用户

发布于 2016-09-21 23:57:46

我相信你已经注意到了,获得第二种工作方式需要的不仅仅是简单地更改feval。在您的第二个示例中,输入需要是4D张量,而不是3D张量表(除非我上次更新后发生了变化)。根据所使用的损失标准/模型,这些张量具有不同的大小。无论是谁实现了这个示例,都一定认为循环是一种更简单的方法。此外,ClassNLLCriterion似乎不喜欢批处理(通常会使用CrossEntropy标准来解决这个问题)。

抛开这些不谈,这两种方法应该会产生相同的结果。唯一的细微差别是,第一个示例使用平均误差/梯度,第二个示例使用总和,您可以从中看到:

代码语言:javascript
复制
                   gradParameters:div(inputs:size(1))
                   f = f/inputs:size(1)

在第二种情况下,f和gradParameters应该只与第一种情况的因子opt.batchSize不同。对于优化目的,它们在数学上是等效的。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39571214

复制
相关文章

相似问题

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