先来看看nn.ReLU的源码,可以看到其实在forward中nn.relu是调用了F.relu函数的:
class ReLU(Module):r"""Applies the rectified linear unit function element-wise::math:`\text{ReLU}(x) = (x)^+ = \max(0, x)`Args:inplace: can optionally do the operation in-place. Default: ``False``Shape:- Input: :math:`(*)`, where :math:`*` means any number of dimensions.- Output: :math:`(*)`, same shape as the input... image:: ../scripts/activation_images/ReLU.pngExamples::>>> m = nn.ReLU()>>> input = torch.randn(2)>>> output = m(input)An implementation of CReLU - https://arxiv.org/abs/1603.05201>>> m = nn.ReLU()>>> input = torch.randn(2).unsqueeze(0)>>> output = torch.cat((m(input),m(-input)))"""__constants__ = ['inplace']inplace: booldef __init__(self, inplace: bool = False):super(ReLU, self).__init__()self.inplace = inplacedef forward(self, input: Tensor) -> Tensor:return F.relu(input, inplace=self.inplace)def extra_repr(self) -> str:inplace_str = 'inplace=True' if self.inplace else ''return inplace_str
nn.ReLU()创建一个nn.Module,这意味着你可以添加到nn.Sequential中。而nn.functional.relu只是对 relu 函数API的调用。一般来说,用模块还是简单的函数调用,取决于你的编码风格。
在PyTorch中,nn.X都有对应的函数版本F.X,但是并不是所有的F.X均可以用于forward或其它代码段中,因为当网络模型训练完毕存储model时,forward中的F.X函数中的参数是无法保存的。也就是说,在forward中,使用的F.X函数一般均没有状态参数。