我有一个有三个并行分支的网络,我想分享他们所有的参数,以便在训练结束时它们是相同的。
让some_model
成为由nn.Sequential
,cudnn.SpatialConvolution
,nn.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之后,我尝试使用其他参数clone
和running_mean
调用running_std
,但是batchnorm图层的ouptut仍然不同。此外,这似乎也取消了所有其他网络参数的共享。在nn.SpatialBatchNormalization
模块之间共享参数的正确方法是什么?
答案 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
解决问题。