torch.nn 中大多数 layer 在 torch.nn.funtional 中都有一个与之对应的函数。二者的区别在于:
torch.nn.Module 中实现 layer 的都是一个特殊的类, 会自动提取可学习的参数。
nn.functional 中的函数,更像是纯函数,由 def function( ) 定义,只是进行简单的数学运算而已。即 functional 中的函数是一个确定的不变的运算公式,输入数据产生输出就ok。而深度学习中会有很多权重是在不断更新的,不可能每进行一次 forward 就用新的权重重新来定义一遍函数来进行计算,所以说就会采用类的方式,以确保能在参数发生变化时仍能使用我们之前定好的运算步骤。
从上可知,如果模型有可学习的参数,最好使用nn.Module对应的相关layer,否则二者都可以使用,没有什么区别。比如Relu其实没有可学习的参数,只是进行一个运算而已,所以使用的就是functional中的relu函数,而卷积层和全连接层都有可学习的参数,所以用的是nn.Module中的类。
不具备可学习参数的层,将它们用函数代替,这样可以不用放在构造函数中进行初始化。