torch7:为不同的卷积神经网络层设置可变学习率

我正在尝试微调一个卷积神经网络。它有以下结构(改编自 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' 是在当前批次上进行前向和后向传递的函数 
parameters,gradParameters = net:getParameters()

从我的参考资料中,我了解到在微调预训练网络时,建议较低(卷积)层应具有较低的学习率,而较高层应具有相对较高的学习率。

我参考了 torch7 的 optim/sgd 文档以设置每层不同的学习率。从那里,我得出了设置 config.learningRates,即一个单独学习率的向量,我可以实现我想要的。由于我是 Torch 的新手,如果有人能够解释一下如何创建/使用此向量以达到我的目的,那将非常有帮助。

提前感谢。

点赞
用户1851402
用户1851402

我不知道你是否仍需要答案,因为你一个月以前发布了这个问题。

无论如何,以防有人看到这个问题,我在这里写了一篇文章,介绍了如何在 Torch 中为不同层设置不同的学习率。

解决方案是使用 net:parameters()而不是 net:getParameters()。它不返回两个张量,而是返回两个张量表,分别包含每个层的参数(和gradParameters)。

通过这种方法,您可以为每个层运行sgd()步骤(具有不同的学习率)。您可以通过点击上面的链接找到完整的代码。

2017-02-22 22:04:49