Мне интересно понять, как Lua передает параметры нейронной сети каждому модулю, особенно в CNN, где параметры составляют фильтры / ядра.
bottom, top = split_model(nChannel)
bottom = bottom:cuda()
top = top:cuda()
Приведенный выше код создает модельс 9 последовательными слоями SpatialConvolution -> SpatialBatchNormalization -> ReLU
local bottom_param, bottom_grad_param = bottom:getParameters()
Я предполагаю, что выше связывает bottom_param и bottom_grad_param для хранения параметров для модели
local params = torch.load(opt.model_param)
Выше загружаетФайл .t7, который уже содержит предварительно обученные параметры
bottom_param:copy(params)
В приведенной выше строке копируются предварительно обученные параметры в bottom_param, передавая параметры в модель
Мой вопрос заключается в том, каким образом параметрыпрошло.Первые 9 определяют 1-е ядро 3x3?
Функция split_model такова:
function split_model(nChannel)
local half_padding = 9
local bottom = nn.Sequential()
bottom:add(nn.SpatialReflectionPadding(half_padding, half_padding, half_padding, half_padding))
-- building block
local function ConvBNReLU(nInputPlane, nOutputPlane, kw, kh, pw, ph)
pw = pw or 0
ph = ph or 0
bottom:add(nn.SpatialConvolution(nInputPlane, nOutputPlane, kw, kh, 1, 1, pw, ph))
bottom:add(nn.SpatialBatchNormalization(nOutputPlane,1e-3))
bottom:add(nn.ReLU(true))
return bottom
end
ConvBNReLU( nChannel,64,3,3)
ConvBNReLU(64,64,3,3)--:add(nn.Dropout(0.4))
ConvBNReLU(64,64,3,3)--:add(nn.Dropout(0.4))
ConvBNReLU(64,64,3,3)--:add(nn.Dropout(0.4))
ConvBNReLU(64,64,3,3)--:add(nn.Dropout(0.4))
ConvBNReLU(64,64,3,3)--:add(nn.Dropout(0.5))
ConvBNReLU(64,64,3,3)--:add(nn.Dropout(0.4))
ConvBNReLU(64,64,3,3)--:add(nn.Dropout(0.4))
bottom:add(nn.SpatialConvolution(64, 64, 3, 3))
bottom:add(nn.SpatialBatchNormalization(64,1e-3))
local top = nn.Sequential()
top:add(nn.CMulTable())
top:add(nn.Sum(2))
return bottom, top
end
ps код не мой и работа г-на.Вэньцзе Ло