我有一個網絡與三個並行分支,我想分享他們的所有參數,使他們在訓練結束時是相同的。 以some_model
爲標準nn.Sequential
模塊由cudnn.SpatialConvolution
,nn.PReLU
,nn.SpatialBatchNormalization
組成。此外,有一個nn.SpatialDropout
,但它的概率設置爲0
,所以它沒有效果。網絡中的參數共享與nn.SpatialBatchNormalization
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}
的表格傳遞給網絡。顯然,如果權重正確共享,那麼所有三個分支的輸出應該是相同的。這在網絡初始化時保持不變,但是一旦參數已被更新(例如,在一次小批量迭代之後),三個分支的結果變得不同。通過逐層檢查,我發現這個輸出差異來自於some_model
中的nn.SpatialBatchNormalization
層。因此,來自這些層的參數看起來似乎沒有正確共享。在this之後,我試着撥打clone
,附加參數爲running_mean
和running_std
,但蝙蝠蛾的層數仍然不同。而且,這似乎也取消了所有其他網絡參數的共享。在nn.SpatialBatchNormalization
模塊之間共享參數的正確方法是什麼?