pytorch __init__、forward与__call__的用法小结
1.介绍
当我们使用pytorch来构建网络框架的时候,也会遇到和tensorflow(tensorflow__init__、build和call小结)类似的情况,即经常会遇到__init__、forward和call这三个互相搭配着使用,那么它们的主要区别又在哪里呢?
1)__init__主要用来做参数初始化用,比如我们要初始化卷积的一些参数,就可以放到这里面,这点和tf里面的用法是一样的
2)forward是表示一个前向传播,构建网络层的先后运算步骤
3)__call__的功能其实和forward类似,所以很多时候,我们构建网络的时候,可以用__call__替代forward函数,但它们两个的区别又在哪里呢?
当网络构建完之后,调__call__的时候,会去先调forward,即__call__其实是包了一层forward,所以会导致两者的功能类似。
在pytorch在nn.Module中,实现了__call__方法,而在__call__方法中调用了forward函数:
https://github.com/pytorch/pytorch/blob/master/torch/nn/modules/module.py
2.代码
importtorch importtorch.nnasnn importtorch.nn.functionalasF classNet(nn.Module): def__init__(self,in_channels,mid_channels,out_channels): super(Net,self).__init__() self.conv0=torch.nn.Sequential( torch.nn.Conv2d(in_channels,mid_channels,kernel_size=(3,3),stride=(1,1),padding=(1,1)), torch.nn.LeakyReLU()) self.conv1=torch.nn.Sequential( torch.nn.Conv2d(mid_channels,out_channels*2,kernel_size=(3,3),stride=(1,1),padding=(1,1))) defforward(self,x): x=self.conv0(x) x=self.conv1(x) returnx classNet(nn.Module): def__init__(self,in_channels,mid_channels,out_channels): super(Net,self).__init__() self.conv0=torch.nn.Sequential( torch.nn.Conv2d(in_channels,mid_channels,kernel_size=(3,3),stride=(1,1),padding=(1,1)), torch.nn.LeakyReLU()) self.conv1=torch.nn.Sequential( torch.nn.Conv2d(mid_channels,out_channels*2,kernel_size=(3,3),stride=(1,1),padding=(1,1))) def__call__(self,x): x=self.conv0(x) x=self.conv1(x) returnx
补充:torch/nn目录结构以及__init__.py
torch/nn目录结构以及init.py
torch/nn目录结构
__init__.py:
from.modulesimport* #nn.modules导入modules目录下内容定义容器modules from.parameterimportParameter #nn.Parameter导入parameter.py定义parameter from.parallelimportDataParallel #导入parallel目录下data_parallel.py中的DataParallel类 from.importinit #nn.init导入init.py参数初始化 from.importutils #nn.utils导入utils目录下内容官网api下nn.utils下api
对于backends,functional.py,_functions需要在代码前重新Import
例如我们常用的
importtorch.nn.functionalasF就是导入了functional.py
backends和_functions是functional.py实现各种函数时所用到的。
以上为个人经验,希望能给大家一个参考,也希望大家多多支持毛票票。如有错误或未考虑完全的地方,望不吝赐教。
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。