【问题标题】:torch7: Error in fine-tuning a CNNtorch7:微调 CNN 时出错
【发布时间】:2016-05-07 14:50:18
【问题描述】:

我正在尝试在多类人脸图像数据集上微调预训练的 OverFeat 卷积网络 (CNN)。我的训练测试 lua 脚本基于给定的教程 here

我首先创建了一个脚本,并尝试通过对 ImageNet 数据集的子集进行训练测试来测试我的脚本。解决一些问题后,它按预期工作,没有任何错误。但是,随后我对脚本进行了细微更改,例如在神经网络中添加几层,更改输入文件和标签,以使其适应新的数据集。我要微调的更新模型如下:

   net:add(SpatialConvolution(3, 96, 7, 7, 2, 2))
   net:add(nn.ReLU(true))
   net:add(SpatialMaxPooling(3, 3, 3, 3))
   net:add(SpatialConvolutionMM(96, 256, 7, 7, 1, 1))
   net:add(nn.ReLU(true))
   net:add(SpatialMaxPooling(2, 2, 2, 2))
   net:add(SpatialConvolutionMM(256, 512, 3, 3, 1, 1, 1, 1))
   net:add(nn.ReLU(true))
   net:add(SpatialConvolutionMM(512, 512, 3, 3, 1, 1, 1, 1))
   net:add(nn.ReLU(true))
   net:add(SpatialConvolutionMM(512, 1024, 3, 3, 1, 1, 1, 1))
   net:add(nn.ReLU(true))
   net:add(SpatialConvolutionMM(1024, 1024, 3, 3, 1, 1, 1, 1))
   net:add(nn.ReLU(true))
   net:add(SpatialMaxPooling(3, 3, 3, 3))
   net:add(SpatialConvolutionMM(1024, 4096, 5, 5, 1, 1))
   net:add(nn.ReLU(true))
   net:add(SpatialConvolutionMM(4096, 4096, 1, 1, 1, 1))
   net:add(nn.ReLU(true))
   net:add(SpatialConvolutionMM(4096, 1000, 1, 1, 1, 1))
   -- net:add(nn.View(1000))
   net:add(nn.ReLU(true))
   net:add(SpatialConvolutionMM(1000, 530, 1, 1, 1, 1))
   net:add(nn.View(530))
   net:add(nn.SoftMax())

我正在使用 nn.ClassNLLCriterion() 来训练我的网络。但在训练时,我面临以下错误:

==> online epoch # 1 [batchSize = 8]    
/home/adarshc/torch/install/bin/luajit: ...shc/torch/install/share/lua/5.1/nn/ClassNLLCriterion.lua:38: attempt to call method 'type' (a nil value)
stack traceback:
    ...shc/torch/install/share/lua/5.1/nn/ClassNLLCriterion.lua:38: in function 'forward'
    final_2.lua:486: in function 'opfunc'
    /home/adarshc/torch/install/share/lua/5.1/optim/sgd.lua:43: in function 'optimMethod'
    final_2.lua:509: in function 'train'
    final_2.lua:613: in main chunk
    [C]: in function 'dofile'
    ...rshc/torch/install/lib/luarocks/rocks/trepl/scm-1/bin/th:131: in main chunk
    [C]: at 0x00406670

我无法解决它,因为我发现此错误没有提供信息,因此难以跟踪和调试。有人可以帮我解决这个问题吗?

提前致谢。

【问题讨论】:

  • 包括产生错误的整个代码以及示例数据。此外 - 为了调试,将你的网络简化为简单的东西,你有 10 层!如果您的参数有任何错误,将很难捕捉到它,此外,这样的模型将需要大量时间来训练,而且它似乎是您的第一个方法之一,您永远不应该从如此复杂的事情开始.
  • @lejlot,我从这种复杂性开始,因为就我而言,这是最简单的开始。我本可以包含整个代码,但它足够大,可以简单地在问题中引用它。另外,由于我遇到了编译器错误,我认为我正在期待我可能会犯的某种常见错误。我在问题本身中提到的对我来说更令人费解的事情是,我在不同的数据集上使用了几乎相同的过程,并且它按预期工作得很好。我只是对其进行了一些修改以使其适应新的数据集,但我得到了错误。
  • 不,不是。拥有两个卷积层就足以开始并了解您的错误是什么

标签: lua machine-learning torch conv-neural-network


【解决方案1】:

在这里,当您执行 forward on your criterion 时,第二个参数 (= target) 的类型不正确,因此会出现此错误。

由于您显然使用小批量工作,因此您应该传递大小为 N = 小批量大小的一维火炬长张量(在非批量模式下,它可能是 number 或单个元素一维长张量)。

注意:在训练时,就在nn.ClassNLLCriterion 之前,您应该使用nn.LogSoftMax() 而不是nn.SoftMax() 层。作为替代方案,有一个将两者结合的内置层:nn.CrossEntropyCriterion

【讨论】:

  • deltheil,在我的例子中,标签的类/集是字符串的张量。因此,训练和测试文件中的标签是字符串。这应该是个问题吗?因为当我尝试做classes:type() 时,我在这个新添加的行中得到了attempt to call method 'type' (a nil value) 的类似错误。这里,classes = require 'classes',其中 classes.lua 是一个文件,以字符串形式返回标签​​张量。
  • 每个标签(= 目标)必须是一个类索引,即一个介于 1 和 N 之间的数字,其中 N = 类总数(参见 doc)。正如解释的那样,它可能是一个包含这个数字(或批处理模式下的这些数字)的一维张量。所以是的,使用字符串或字符串张量是一个问题。
  • deltheil,是的,你是对的。我通过用相应的整数索引(在带有训练测试标签的文件中)替换类名字符串来更正我的代码,并且我的训练程序现在正在运行。谢谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-02-27
  • 1970-01-01
  • 2022-09-27
  • 1970-01-01
  • 2015-12-08
  • 1970-01-01
  • 2017-09-13
相关资源
最近更新 更多