pytorch中nn.functional和nn.Module的区别

简介: pytorch中nn.functional和nn.Module的区别

在pytorch中有两个常用的模块,分别是nn.functionalnn.Module,这二者能够实现一些网络层的定义,对于nn中大多数的layer,在nn.functional中都有对应的函数算子

这二者但也并非相同,还是存在区别的:

  • nn.Module中实现的layer是一个特殊的类,继承了nn.Module,例如 class Layer(nn.Module),对于继承了nn.Module的层结构,他们能够自动提取可学习参数,并且内部已经实现好了forward函数。
  • nn.functional实现的layer是一个函数,可以直接调用,不需要实例化,对于这些函数内部是没有可学习参数的。
x = torch.randn(2, 3)
y_1 = nn.ReLU()(x)
y_2 = nn.functional.relu(x)

那么为什么同样功能要设计两个接口呢?

对于模型具有可学习参数,例如Conv2d、Linear等,最好使用nn.Module,因为继承了nn.Module能够自动提取可学习参数,也可以使用nn.functional来实现,但是这样较为复杂,需要自己手动设置参数Parameter然后传入。

如果模型不具备可学习参数,例如ReLU、MaxPool2d等,使用nn.functional和nn.Module都可以。

但是有特例,nn.Dropout,最好使用nn.Module,虽然它没有可学习参数,但是这个层有个特点就是训练和推理不同,如果使用nn.Module来实现,这时就可以使用model.train()和model.eval()来区分。

x = torch.randn(10, 4)
w = torch.randn(3, 4)
b = torch.randn(1, 3)
y = F.linear(x, w, b)
print(y.shape)

需要手动定义参数Parameter来实现,还有一种写法:

class Linear(nn.Module):
    def __init__(self):
        super().__init__()
        self.w = torch.randn(3, 4)
        self.b = torch.randn(1, 3)
    def forward(self, x):
        return F.linear(x, w, b)

这两种写法是一样的,对于刚入门一般都是采用下面写法,利用定义好的层,采用自定义参数写法来说能够更灵活,能够实现更为复杂的操作。

class Linear(nn.Module):
    def __init__(self):
        super().__init__()
        self.linear = nn.Linear(4, 3)
    def forward(self, x):
        return self.linear(x)


目录
相关文章
|
1月前
|
机器学习/深度学习 PyTorch TensorFlow
|
1月前
|
机器学习/深度学习 PyTorch 算法框架/工具
深度学习框架:Pytorch与Keras的区别与使用方法
深度学习框架:Pytorch与Keras的区别与使用方法
|
12天前
|
机器学习/深度学习 PyTorch 算法框架/工具
【从零开始学习深度学习】18. Pytorch中自定义层的几种方法:nn.Module、ParameterList和ParameterDict
【从零开始学习深度学习】18. Pytorch中自定义层的几种方法:nn.Module、ParameterList和ParameterDict
|
12天前
|
机器学习/深度学习 PyTorch 算法框架/工具
【从零开始学习深度学习】16. Pytorch中神经网络模型的构造方法:Module、Sequential、ModuleList、ModuleDict的区别
【从零开始学习深度学习】16. Pytorch中神经网络模型的构造方法:Module、Sequential、ModuleList、ModuleDict的区别
|
1月前
|
机器学习/深度学习 PyTorch TensorFlow
Pytorch 与 Tensorflow:深度学习的主要区别(1)
Pytorch 与 Tensorflow:深度学习的主要区别(1)
46 2
|
1月前
|
机器学习/深度学习 PyTorch TensorFlow
深度学习:Pytorch 与 Tensorflow 的主要区别(2)
深度学习:Pytorch 与 Tensorflow 的主要区别(2)
33 0
|
7月前
|
机器学习/深度学习 PyTorch 算法框架/工具
Pytorch torch.nn库以及nn与nn.functional有什么区别?
Pytorch torch.nn库以及nn与nn.functional有什么区别?
54 0
|
机器学习/深度学习 PyTorch 算法框架/工具
pytorch中nn.ReLU()和F.relu()有什么区别?
pytorch中nn.ReLU()和F.relu()有什么区别?
400 0
|
11月前
|
存储 PyTorch 算法框架/工具
PyTorch模型创建与nn.Module
PyTorch模型创建与nn.Module
87 1
|
PyTorch 算法框架/工具
【PyTorch】rand/randn/randint/randperm的区别
【PyTorch】rand/randn/randint/randperm的区别
69 0