pytorch中nn.ReLU()和F.relu()有什么区别?

对于一些常见模块或者算子,在pytorch的nn模块和nn.functional中都有实现,例如nn.ReLU()和F.relu(),nn.Conv2d和F.conv2d()等。

对于这二者都可以实现指定目的,但是二者有什么区别呢?

对于nn中实现的,它继承了nn.Module类,它是一个类,如果要使用需要先实例化创建一个对象才可以调用,而nn.functional中实现的它是一个函数,可以直接当作函数进行调用。

a = torch.randn(3, 4)
print(a)

relu = nn.ReLU()
print(relu(a))

print(F.relu(a))
tensor([[-0.4196,  0.6217, -1.2835,  2.2796],
        [-1.2185,  0.5819, -1.0084, -1.0939],
        [-1.3235, -0.6229,  0.2442, -1.0914]])
tensor([[0.0000, 0.6217, 0.0000, 2.2796],
        [0.0000, 0.5819, 0.0000, 0.0000],
        [0.0000, 0.0000, 0.2442, 0.0000]])
tensor([[0.0000, 0.6217, 0.0000, 2.2796],
        [0.0000, 0.5819, 0.0000, 0.0000],
        [0.0000, 0.0000, 0.2442, 0.0000]])

对于定义模型类时,一般我们把带有学习参数的层放在构造函数中,而将不带有学习参数的层放在forward中进行实现,例如:

class Net(nn.Module):
    def __init__(self):
        super().__init__
        self.conv = nn.Conv2d(1, 6, 5)
        self.fc = nn.Linear(10, 2)
    
    def forward(self, x):
        x = self.conv(x)
        x = F.max_pool2d(x)
        x = self.fc(x)
        x = F.dropout(x)
        x = F.sigmoid(x)
        
        return x

你可能感兴趣的:(PyTorch,pytorch,人工智能,神经网络,深度学习,python)