torch7: установка переменной скорости обучения для разных слоев Conv-net

Я пытаюсь настроить конвенцию. Он имеет следующую структуру (адаптировано из 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, поэтому, пожалуйста, простите меня, если это кажется глупым вопросом, но было бы действительно полезно, если бы кто-нибудь мог объяснить мне, как и где создать / использовать этот вектор для моей цели?

Заранее спасибо.


person dyno8426    schedule 23.02.2016    source источник


Ответы (1)


Я не знаю, нужен ли вам еще ответ, поскольку вы разместили этот вопрос год назад.

В любом случае, на случай, если кто-то это увидит, я написал напишите здесь о том, как установить разную скорость обучения для разных слоев в torch.

Решение состоит в том, чтобы использовать net:parameters() вместо net:getParameters(). Вместо того, чтобы возвращать два тензора, он возвращает две таблицы тензоров, содержащие параметры (и gradParameters) для каждого слоя в отдельных тензорах.

Таким образом, вы можете выполнить sgd() шаг (с разной скоростью обучения) для каждого слоя. Вы можете найти полный код, нажав на ссылку выше.

person Blackecho    schedule 22.02.2017