Bootstrap

torch.nn.functional函数和torch.nn.Module层比较

PyTorch 中,torch.nn.functional 中的函数和 torch.nn.Module 中的层(layer)有很多相似的地方,它们往往执行相同的操作,例如卷积、线性变换、激活函数等。然而,两者在使用时有一些重要的区别:

1. 状态与参数

  • torch.nn.Module 层:通常包含可学习的参数(例如卷积层的权重和偏置、线性层的权重和偏置等)。这些参数会在训练时自动更新,并且可以通过模型的 parameters() 方法轻松获取。
  • torch.nn.functional 函数:这些函数通常是无状态的,它们不保存可学习的参数。例如,使用 torch.nn.functional.conv2d 时,用户必须显式传递权重和偏置。使用这些函数时,参数管理通常由用户自行负责。

例子

  • torch.nn.Conv2d 是有状态的卷积层,它包含可学习的权重和偏置参数。
  • torch.nn.functional.conv2d 是无状态的,需要显式传递权重和偏置。
# 使用 nn.Module 定义的有状态卷积层
conv_layer = torch.nn.Conv2d(in_channels=3, out_channels=16, kernel_size=3)
output = conv_layer(input_tensor)  # 直接应用层,内部包含权重和偏置

# 使用 torch.nn.functional 中的无状态卷积函数
weights = torch.randn(16, 3, 3, 3)  # 自定义权重
output = torch.nn.functional.conv2d(input_tensor, weights)  # 需要显式传递权重

2. 自动处理可学习参数

  • torch.nn.Module 层:层会自动处理可学习参数,包括初始化、保存、加载(通过 model.state_dict() 和 model.load_state_dict())以及在优化器中自动更新参数。
  • torch.nn
;