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

时间:2016-02-23 12:57:50

标签: lua training-data torch conv-neural-network

我正在尝试对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的新手,所以,请原谅我,如果这看起来像一个愚蠢的问题,但如果有人能解释我如何以及在何处创建/使用此向量来实现我的目的,那将会非常有用吗?

提前致谢。

1 个答案:

答案 0 :(得分:0)

我不知道你是否还需要一个答案,就像你在一年前发布这个问题一样。

无论如何,为了防止有人看到这个,我写了post here关于如何为火炬中的不同层设置不同的学习率。

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

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