我正在尝试对conv网进行微调。它具有以下结构(改编自 OverFeat ):
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, total_classes, 1, 1, 1, 1))
net:add(nn.View(total_classes))
net:add(nn.LogSoftMax())
我使用 SGD 作为优化方法,并使用以下参数:
optimState = {
learningRate = 1e-3,
weightDecay = 0,
momentum = 0,
learningRateDecay = 1e-7
}
optimMethod = optim.sgd
我正在训练如下:
optimMethod(feval, parameters, optimState)
其中:
-- 'feval' is the function with the forward and backward passes on the current batch
parameters,gradParameters = net:getParameters()
根据我的参考文献,我了解到,在对预训练网络进行微调时,建议较低(卷积)层应具有较低的学习率,而较高层应具有相对较高的学习率。
我提到了torch7的optim/sgd文档,为每一层设置不同的学习率。从那里,我得到设置 config.learningRates ,即个人学习率的向量,我可以实现我想要的。我是Torch的新手,所以,请原谅我,如果这看起来像一个愚蠢的问题,但如果有人能解释我如何以及在何处创建/使用此向量来实现我的目的,那将会非常有用吗?
提前致谢。
答案 0 :(得分:0)
我不知道你是否还需要一个答案,就像你在一年前发布这个问题一样。
无论如何,为了防止有人看到这个,我写了post here关于如何为火炬中的不同层设置不同的学习率。
解决方案是使用net:parameters()
代替net:getParameters()
。它不返回两个张量,而是返回两个张量表,包含各个张量中每个图层的参数(和gradParameters)。
通过这种方式,您可以为每个图层运行sgd()
步骤(具有不同的学习率)。您可以点击上面的链接找到完整的代码。