为什么在model.forward(input)和model(input)之间会有不同的输出

时间:2019-03-25 13:19:53

标签: model pytorch forward

我正在使用pytorch构建像VGG16这样的简单模型,并且我已经在模型中重载了函数forward

我发现每个人都倾向于使用model(input)而不是model.forward(input)来获取输出,并且我对它们之间的区别很感兴趣。我尝试输入相同的数据,但结果不同。我很困惑。

在输入数据之前,我已经输出了layer_weight,权重未更改,我知道当我们使用model(input)函数使用__call__时,该函数将调用model.forward

   vgg = VGG()
   vgg.double()
   for layer in vgg.modules():
      if isinstance(layer,torch.nn.Linear):
         print(layer.weight)
   print("   use model.forward(input)     ")
   result = vgg.forward(array)

   for layer in vgg.modules():
     if isinstance(layer,torch.nn.Linear):
       print(layer.weight) 
   print("   use model(input)     ")
   result_2 = vgg(array)
   print(result)
   print(result_2)

输出:

    Variable containing:1.00000e-02 *
    -0.2931  0.6716 -0.3497 -2.0217 -0.0764  1.2162  1.4983 -1.2881
    [torch.DoubleTensor of size 1x8]

    Variable containing:
    1.00000e-02 *
    0.5302  0.4494 -0.6866 -2.1657 -0.9504  1.0211  0.8308 -1.1665
    [torch.DoubleTensor of size 1x8]

1 个答案:

答案 0 :(得分:5)

model.forward只是调用您提到的前向操作,但是__call__还有一些额外的功能。

如果深入研究nn.Module类的code,您将看到__call__最终向前调用,但在内部处理向前或向后挂钩,并管理pytorch允许的某些状态。当调用像MLP这样的简单模型时,可能并不是真正需要的,但是像频谱归一化层这样的更复杂的模型具有钩子,因此,除非您明确只想调用{{,否则,您应尽可能使用model(.)签名。 1}}

另请参见Calling forward function without .forward()

但是,在这种情况下,差异可能是由于某些丢失层造成的,在比较输出之前,应调用model.forward以确保网络中的所有随机性均已关闭。