I'm using pytorch to build a simple model like VGG16,and I have overloaded the function forward
in my model.
I found everyone tends to use model(input)
to get the output rather than model.forward(input)
, and I am interested in the difference between them. I try to input the same data, but the result is different. I'm confused.
I have output the layer_weight before I input data, the weight not be changed, and I know when we using model(input)
it using __call__
function, and this function will 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)
output:
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]
Umang Gupta.. 5
model.forward
只是调用您提到的前向操作,但要多做__call__
一些事情。
如果您深入研究类的代码,nn.Module
您将看到__call__
最终的调用,但在内部处理向前或向后的挂钩,并管理pytorch允许的某些状态。当调用像MLP这样的简单模型时,可能并不是真正需要它,但是像频谱归一化层这样的更复杂的模型具有钩子,因此model(.)
,除非您明确只想调用,否则应尽可能使用签名。model.forward
另请参见不带.forward()的调用前转功能
但是,在这种情况下,差异可能是由于某些丢失层造成的,vgg.eval()
在比较输出之前,应先致电确保网络中的所有随机性均已关闭。
model.forward
只是调用您提到的前向操作,但要多做__call__
一些事情。
如果您深入研究类的代码,nn.Module
您将看到__call__
最终的调用,但在内部处理向前或向后的挂钩,并管理pytorch允许的某些状态。当调用像MLP这样的简单模型时,可能并不是真正需要它,但是像频谱归一化层这样的更复杂的模型具有钩子,因此model(.)
,除非您明确只想调用,否则应尽可能使用签名。model.forward
另请参见不带.forward()的调用前转功能
但是,在这种情况下,差异可能是由于某些丢失层造成的,vgg.eval()
在比较输出之前,应先致电确保网络中的所有随机性均已关闭。