为什么在火炬的开始网中使用ReLU的clone()?

时间:2017-07-10 16:22:50

标签: clone torch

我正在阅读https://github.com/Element-Research/dpnn/blob/master/Inception.lua

您可以在此来源中看到大量的clone()。像

mlp:add(self.transfer:clone())

self.transfer只不过是nn.ReLU()

然后,

  1. 为什么此代码使用clone()调用激活函数?这只涉及内存问题吗?

  2. 我认为clone分享参数。这是正确的吗?如果它是正确的,则意味着此初始模块的所有激活共享参数。这看起来像胡说八道。我是否误解了Inception-Net?

1 个答案:

答案 0 :(得分:1)

  1. 如果您不克隆模块self.transfer,则网络transfer中的所有模块mlp将具有相同的状态变量outputgradInput
  2. 查看此玩具代码的示例

    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()并没有用。)

    1. 文件说
        

      如果为clone(...)函数提供了参数,它还会在创建克隆模块后使用克隆模块上的参数调用share(...),从而使用一些共享参数对该模块进行深层复制。 / p>

    2. 因此,如果您不提供任何参数,则不会共享参数。