torch7:微调 CNN 时出错
torch7: Error in fine-tuning a CNN
我正在尝试微调预训练的OverFeat conv-net (CNN) on a dataset of images of multi-class faces. My training-testing lua script is based on the tutorial given 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
我无法解决它,因为我发现这个错误没有提供信息,因此很难跟踪和调试。有人可以帮我解决这个问题吗?
提前致谢。
此处当您执行 forward on your criterion 时,第二个参数(= 目标)的类型不正确,因此出现此错误。
由于您显然使用小批量工作,因此您应该传递大小为 N = 小批量大小的一维火炬长张量(在非批处理模式下,它可能是 number
或单个元素 1D长张量)。
注意:在训练时,就在 nn.ClassNLLCriterion
之前,您应该使用 nn.LogSoftMax()
而不是 nn.SoftMax()
层。作为替代方案,有一个结合了两者的内置层:nn.CrossEntropyCriterion
.
我正在尝试微调预训练的OverFeat conv-net (CNN) on a dataset of images of multi-class faces. My training-testing lua script is based on the tutorial given 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
我无法解决它,因为我发现这个错误没有提供信息,因此很难跟踪和调试。有人可以帮我解决这个问题吗?
提前致谢。
此处当您执行 forward on your criterion 时,第二个参数(= 目标)的类型不正确,因此出现此错误。
由于您显然使用小批量工作,因此您应该传递大小为 N = 小批量大小的一维火炬长张量(在非批处理模式下,它可能是 number
或单个元素 1D长张量)。
注意:在训练时,就在 nn.ClassNLLCriterion
之前,您应该使用 nn.LogSoftMax()
而不是 nn.SoftMax()
层。作为替代方案,有一个结合了两者的内置层:nn.CrossEntropyCriterion
.