我正在使用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]
答案 0 :(得分:5)
model.forward
只是调用您提到的前向操作,但是__call__
还有一些额外的功能。
如果深入研究nn.Module
类的code,您将看到__call__
最终向前调用,但在内部处理向前或向后挂钩,并管理pytorch允许的某些状态。当调用像MLP这样的简单模型时,可能并不是真正需要的,但是像频谱归一化层这样的更复杂的模型具有钩子,因此,除非您明确只想调用{{,否则,您应尽可能使用model(.)
签名。 1}}
另请参见Calling forward function without .forward()
但是,在这种情况下,差异可能是由于某些丢失层造成的,在比较输出之前,应调用model.forward
以确保网络中的所有随机性均已关闭。