我很想了解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个定义第一个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
p.s该代码不是我的,而是先生的工作。罗文杰