2016-02-23 7 views
0

Я пытаюсь настроить конвективную сеть. Он имеет следующую структуру (адаптировано из OverFeat):torch7: Установка скорости обучения переменных для разных уровней конвертации

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

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

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

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

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