PyTorch中nn-XXX与F-XXX的区别

文章比较了PyTorch库中torch.nn模块的类形式和torch.nn.functional模块的函数形式,强调了两者在可学习参数、梯度计算、内存占用和输出显示上的差异,以ReLU激活函数为例详细说明.

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

nn.XXX与F.XXX

PyTorch中torch.nn**(以下简写为nn)中的模块和torch.nn.functional(以下简写为F)**中的模块都提供了常用的神经网络操作,包括激活函数、损失函数、池化操作等。它们的主要区别如下:

  • nn中的模块是以类形式存在的;F中的模块是以函数形式存在的
  • nn中的模块是nn.Module的子类,包含可学习参数、可导,在反向传播中可以计算梯度,可以在模型中作为子模块使用;F中的模块是纯函数,没有与之相关联的可学习参数,虽然也可以用于反向传播,但是其梯度需要手动计算
  • nn中的模块需要实例化后,将张量作为实例的调用参数;F中的模块直接传递张量作为参数
  • nn中的模块可以管理和访问模块的内部参数和状态;F中的函数是纯函数,没有与之相关联的参数或状态,因此无法直接管理和访问函数的内部状态

nn.Relu与F.relu()

以激活函数ReLu为例,在使用激活函数时,有以下两种方式可以使用:

# 方法一
nn.ReLU()
# 方法二
F.relu(input)

这两种方法都是使用ReLu激活,但使用的场景不一样。

  • nn.ReLU是一个类,必须实例化后才能使用,一般在定义网络层的时候使用

    # nn.ReLU的常用方法
    nn.Sequential(
                nn.Conv2d(in_channels, out_channels),
                nn.ReLU(inplace=True)
            )
    
  • F.relu()是函数调用,一般使用在foreward()函数

  • nn.ReLU只能处理Variable类型的张量;而F.relu()可以处理Tensor和Variable类型的张量

  • nn.ReLU需要额外占用内存用来存储中间结果;而F.relu()则是直接在原张量上进行操作,不需要额外的内存占用

另外:

  • 当用print()打印输出神经网络时,会输出nn.ReLU()层,而F.relu()是没有输出的
`nn.Sequential` 是 PyTorch 中的一个模块,它用于组合多个神经网络层,使得模型构建更加简洁明了。通常,当你想要按照特定顺序应用一系列层时,如线性层(Linear)、激活函数(ReLU)等,可以使用 Sequential 来组织。 然而,`nn.functional` 模块提供了独立于任何 Module 的函数式接口,这些函数可以直接作用于张量,不需要创建一个新的 Layer 对象。例如,`nn.functional.relu()` 可以直接对输入张量应用 ReLU 激活,而不需要先创建一个 `nn.ReLU` 类实例并调用它的 forward 方法。 两者不能直接结合使用的原因在于它们的设计目的不同。`nn.Sequential` 是为了方便管理模型结构和参数,适合构建完整的网络层级;而 `nn.functional` 提供的是底层操作,更灵活但需要手动管理内存和维度变化。 如果你需要在 Sequential 中使用某个来自 nn.functional 的操作,你可以在相应的 Sequential 层后面添加一个 `.apply()` 或 `.forward()` 方法,传入一个函数来实现。例如: ```python from torch import nn from torch.nn import functional as F model = nn.Sequential( nn.Linear(10, 64), lambda x: F.relu(x), # 使用 nn.functional.relu 直接在 Sequential 中 nn.Linear(64, 10) ) # 或者这样使用 .apply() model.apply(lambda module: F.relu(module)) if isinstance(model, nn.Sequential) else model ``` 这里我们通过匿名函数 `lambda x: F.relu(x)` 或 `.apply()` 把 `relu` 函数应用到 `nn.Linear` 后的输出上。但请注意,这种方式并不常见,因为通常会倾向于保持 Sequential 的一致性,如果可能的话,还是推荐使用 `nn.ReLU` 类作为子层。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值