pytorch 中forward 的用法与解释说明
前言
最近在使用pytorch的时候,模型训练时,不需要使用forward,只要在实例化一个对象中传入对应的参数就可以自动调用forward函数
即:
forward的使用
classModule(nn.Module): def__init__(self): super(Module,self).__init__() #...... defforward(self,x): #...... returnx data=.....#输入数据 #实例化一个对象 module=Module() #前向传播 module(data) #而不是使用下面的 #module.forward(data)
实际上
module(data)
是等价于
module.forward(data)
forward使用的解释
等价的原因是因为pythoncalss中的__call__和__init__方法.
classA(): def__call__(self): print('icanbecalledlikeafunction') a=A() a()
out:
icanbecalledlikeafunction
__call__里调用其他的函数
classA(): def__call__(self,param): print('icancalledlikeafunction') print('传入参数的类型是:{}值为:{}'.format(type(param),param)) res=self.forward(param) returnres defforward(self,input_): print('forward函数被调用了') print('inforward,传入参数类型是:{}值为:{}'.format(type(input_),input_)) returninput_ a=A() input_param=a('i') print("对象a传入的参数是:",input_param)
out:
icancalledlikeafunction
传入参数的类型是:
forward函数被调用了
inforward,传入参数类型是:
对象a传入的参数是:i
补充:Pytorch模型中nn.Model中的forward()前向传播不调用解释
在pytorch中没有调用模型的forward()前向传播,只实列化后把参数传入。
定义模型
classModule(nn.Module): def__init__(self): super(Module,self).__init__() #...... defforward(self,x): #...... returnx data=.....#输入数据 #实例化一个对象 module=Module() #前向传播直接把输入传入实列化 module(data) #没有使用module.forward(data)
实际上module(data)等价于module.forward(data)
等价的原因是因为pythoncalss中的__call__可以让类像函数一样调用
当执行model(x)的时候,底层自动调用forward方法计算结果
classA(): def__call__(self): print('icanbecalledlikeafunction') a=A() a() >>>icanbecalledlikeafunction
在__call__里可调用其它的函数
classA(): def__call__(self,param): print('我在__call__中,传入参数',param) res=self.forward(param) returnres defforward(self,x): print('我在forward函数中,传入参数类型是值为:',x) returnx a=A() y=a('i') >>>我在__call__中,传入参数i >>>我在forward函数中,传入参数类型是值为:i print("传入的参数是:",y) >>>传入的参数是:i
以上为个人经验,希望能给大家一个参考,也希望大家多多支持毛票票。如有错误或未考虑完全的地方,望不吝赐教。
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。