2017-06-27 17 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