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