pytorch的nn.functional作用和用法


nn.Conv2是一个类,而F.conv2d是一个函数

这两个功能并无区别,这两种实现方式同时存在的原因如下

在建图过程中,往往有两种层,一种如全连接层 当中是有Variable ,另外一种是如Pooling  Relu层,当中是没有Variable

如果所有的层都用nn.funcitonal来定义,那么所有的Variable如weight  bias等,都需要用户来手动定义,非常不方便

如果所有的层都要nn来定义,那么简单的都需要来建类比较麻烦。

 

这里要说明一个事情

****************************原文  https://www.zhihu.com/question/66782101  **********************

两者的相同之处:

1  nn.Xxx和nn.functional.xxx的实际功能是相同的,即nn.Conv2d和nn.functional.conv2d都是进行卷积,nn.Dropout和nn.funtional.dropout都是进行dropout...

运行效率也是近乎相同的。

nn.functional.xxx是函数接口,而nn.Xxx是nn.funcitonal.xxx的封装类,并且nn.xxx都继承于一个共同的祖先,nn.Module。这一点导致nn.Xxx除了具有nn.funcitonal.xxx功能之外,内部附带了nn.Module相关的属性和方法。如train  eval  load_state_dict

两者的差别之处:

调用方式不同

nn.Xxx需要先实例化并传入参数,然后以函数调用的方式调用实例化的对象并传入数据。

nn.Xxx不需要自己定义和管理weight,而nn.funcitonal.xxx需要自定义weight,每次调用的时候需要手动传入weight。不利于代码复用。

什么时候使用nn.functional.xxx,什么时候使用nn.Xxx

依赖于解决问题的复杂度和个人的爱好。在nn.Xxx不能满足功能的时候,nn.funcitonal.xxx是更好的选择。

 


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM