2017-08-05 186 views
0

我有一個網絡與三個並行分支,我想分享他們的所有參數,使他們在訓練結束時是相同的。 以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_meanrunning_std,但蝙蝠蛾的層數仍然不同。而且,這似乎也取消了所有其他網絡參數的共享。在nn.SpatialBatchNormalization模塊之間共享參數的正確方法是什麼?

回答

2

好的,我找到了解決方案!從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')) 

解決問題。