我正在尝试在多类人脸图像数据集上微调预训练的 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
我无法解决它,因为我发现此错误无法提供信息,因此难以跟踪和调试。有人可以帮我解决这个问题吗?
提前致谢。
答案 0 :(得分:1)
当你执行forward on your criterion时,第二个参数(= target)的类型不正确,因此出现此错误。
由于您显然使用迷你批次,您应该通过1D火炬长张量大小N =小批量大小(在非批量模式下它可以是number
或单个元素1D长张量)。
注意:在培训时间nn.ClassNLLCriterion
之前,您应该使用nn.LogSoftMax()
而不是nn.SoftMax()
图层。作为替代方案,有一个内置层,它结合了两个:nn.CrossEntropyCriterion
。