2017-06-27 18 views
0

我最近經歷了很多火炬碼。我已經注意到,模型構建,通常之後,它被克隆,像下面的代碼:爲什麼在火炬手訓練前克隆整個模型?

siamese_1=siamese_1:cuda() 
parameters,gradParameters = siamese_1:getParameters() 
siamese_2=siamese_1:clone('weight','bias','gradWeight','gradBias') 
siamese_net:add(siamese_1) 
siamese_net:add(siamese_2) 

siamese_1是一個構造的模型。

這很難理解爲什麼這樣做?

此代碼用於對網絡進行微調。來自this存儲庫(第122行至第126行)。

回答

1

當您克隆模型並指定一些其他參數(如'weight等)時,新模型將與原始模型共享這些參數。因此,在你的情況下,型號siamese_1siamese_2分享他們的權重,偏差和相應的梯度。

在您所看到的代碼中,作者想要創建一個網絡,其中兩個並行網絡共享其權重,這就是爲什麼他們使用clone函數的原因。

+0

在這段代碼中,網絡並行性已經在上面提到的行之上完成了。 我明白,參數克隆到另一個模塊('siamese_2'),但爲什麼然後'siamese_1'也添加到'siamese_net'? – deepdebugging

+0

不,線122至126做平行。 'siamese_net'是一個'ParallelTable',因此你需要至少添加2個模塊(並行)到這個網絡。這就是爲什麼你添加'siamese_1'和'siamese_2',因此它們在'siamese_net'網絡中並行。 – fonfonx

+0

的確,我也發現並行網絡是需要的,因爲這個實現嘗試在同一時間傳遞兩個數據張量。 – deepdebugging