我正在阅读https://github.com/Element-Research/dpnn/blob/master/Inception.lua
您可以在此来源中看到大量的clone()
。像
mlp:add(self.transfer:clone())
self.transfer
只不过是nn.ReLU()
。
然后,
为什么此代码使用clone()
调用激活函数?这只涉及内存问题吗?
我认为clone
分享参数。这是正确的吗?如果它是正确的,则意味着此初始模块的所有激活共享参数。这看起来像胡说八道。我是否误解了Inception-Net?
答案 0 :(得分:1)
self.transfer
,则网络transfer
中的所有模块mlp
将具有相同的状态变量output
和gradInput
。 查看此玩具代码的示例
require 'nn'
module = nn.ReLU()
net = nn.Sequential():add(nn.Linear(2,2)):add(module):add(nn.Linear(2,1)):add(module)
input = torch.Tensor(2,2):random()
net:forward(input)
print(net:get(2).output)
print(net:get(4).output)
两个print语句都将返回相同的值。修改其中一个module
输出将修改另一个输出。由于我们不想要这种行为,我们必须克隆模块。 (但是在你的情况下,克隆一个简单的nn.ReLU()
并没有用。)
如果为clone(...)函数提供了参数,它还会在创建克隆模块后使用克隆模块上的参数调用share(...),从而使用一些共享参数对该模块进行深层复制。 / p>
因此,如果您不提供任何参数,则不会共享参数。