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