使用nn.SpatialBatchNormalization

时间:2017-08-05 09:59:33

标签: machine-learning torch

我有一个有三个并行分支的网络,我想分享他们所有的参数,以便在训练结束时它们是相同的。 让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图层的ouptut仍然不同。此外,这似乎也取消了所有其他网络参数的共享。在nn.SpatialBatchNormalization模块之间共享参数的正确方法是什么?

1 个答案:

答案 0 :(得分:2)

好的,我找到了解决方案!从the discussion I had linked to in the question开始,参数@app.route('/validation', methods=['get', 'post']) def validation(): data = request.get_json(force = True) myform = MyForm() for field in myform: field.data = data[field.name] myform.validate() return jsonify(myform.errors) 似乎已更改为running_std。用

调用构造函数
running_var

解决问题。