我有一个带有三个并行分支的网络,我想共享它们的所有参数,以便在培训结束时它们是相同的。
假设some_model是由nn.Sequentialcudnn.SpatialConvolutionnn.PReLU组成的标准nn.SpatialBatchNormalization模块。另外,有一个nn.SpatialDropout,但是它的概率设置为0,因此它没有任何作用。

ptb=nn.ParallelTable()
ptb:add(some_model)
ptb:add(some_model:clone('weight','bias', 'gradWeight','gradBias'))
ptb:add(some_model:clone('weight','bias', 'gradWeight','gradBias'))

triplet=nn.Sequential()
triplet:add(ptb)


我认为损失函数无关紧要,但以防万一,我使用nn.DistanceRatioCriterion。为了检查所有权重是否正确共享,我将三个相同示例{A,A,A}的表传递给网络。显然,如果正确分配了权重,则所有三个分支的输出应相同。这在网络初始化时保持不变,但是一旦更新了参数,(例如,在一次小批量迭代之后),这三个分支的结果就会不同。通过逐层检查,我注意到输出中的这种差异来自nn.SpatialBatchNormalization中的some_model层。因此,似乎这些层的参数未正确共享。在this之后,我尝试使用其他参数clonerunning_mean调用running_std,但是batchnorm层的输出仍然不同。而且,这似乎也取消了所有其他网络参数的共享。在nn.SpatialBatchNormalization模块之间共享参数的正确方法是什么?

最佳答案

好的,我找到了解决方案!自the discussion I had linked to in the question以来,参数running_std似乎已更改为running_var。调用构造函数

ptb:add(some_model:clone('weight','bias', 'gradWeight','gradBias','running_mean','running_var'))


解决问题。

关于machine-learning - 使用nn.SpatialBatchNormalization在网络中共享参数,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/45520602/

10-12 19:28