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是更好的选择。

 

posted @ 2020-10-22 22:17  大大的海棠湾  阅读(2305)  评论(0)    收藏  举报