pytorch api文档:nn.Module的named_parameters()方法-返回模型中所有可训练的参数

作用

model.named_parameters() 是 PyTorch 中 nn.Module 类的内置方法,它的主要作用是返回一个迭代器,遍历模型中所有可训练的参数(nn.Parameter 类型),并且同时返回每个参数的名称和参数本身。

这和 model.parameters() 不同:

  • model.parameters() 只返回参数本身,没有名称
  • model.named_parameters() 同时返回 (名称字符串, 参数张量) 元组

例子

下面用一个简单的神经网络模型来演示它的用法

import torch
import torch.nn as nn

# 定义一个简单的模型
class SimpleModel(nn.Module):
    def __init__(self):
        super(SimpleModel, self).__init__()
        self.fc1 = nn.Linear(10, 5)  # 全连接层1: 10输入,5输出
        self.relu = nn.ReLU()
        self.fc2 = nn.Linear(5, 2)   # 全连接层2: 5输入,2输出

    def forward(self, x):
        x = self.fc1(x)
        x = self.relu(x)
        x = self.fc2(x)
        return x

# 实例化模型
model = SimpleModel()

# 使用 named_parameters() 遍历参数
print("模型的所有可训练参数(名称 + 参数):")
for name, param in model.named_parameters():
    print(f"参数名称: {name}")
    print(f"参数形状: {param.shape}")
    print(f"是否可训练: {param.requires_grad}")
    print("-" * 50)

输出结果示例:

模型的所有可训练参数(名称 + 参数):
参数名称: fc1.weight
参数形状: torch.Size([5, 10])
是否可训练: True
--------------------------------------------------
参数名称: fc1.bias
参数形状: torch.Size([5])
是否可训练: True
--------------------------------------------------
参数名称: fc2.weight
参数形状: torch.Size([2, 5])
是否可训练: True
--------------------------------------------------
参数名称: fc2.bias
参数形状: torch.Size([2])
是否可训练: True
--------------------------------------------------

应用场景

场景1:冻结部分层的参数(训练时不更新)

这是最常用的场景之一,比如迁移学习中冻结主干网络:

# 冻结 fc1 层的参数(设置 requires_grad=False)
for name, param in model.named_parameters():
    if "fc1" in name:
        param.requires_grad = False

# 验证冻结结果
print("\n冻结后的参数状态:")
for name, param in model.named_parameters():
    print(f"{name}: requires_grad = {param.requires_grad}")

场景2:查看/修改特定参数

# 获取 fc2.weight 的值
for name, param in model.named_parameters():
    if name == "fc2.weight":
        print(f"\nfc2.weight 的值:\n{param[:2]}")  # 打印前2行
        # 也可以直接修改参数值(比如初始化)
        param.data.fill_(0.1)  # 将参数值全部设为0.1

总结

  1. model.named_parameters() 核心是返回参数名称+参数张量的迭代器,比 model.parameters() 更易定位具体参数;
  2. 最常用的场景是冻结部分层参数(迁移学习)、定位/修改特定参数;
  3. 只有 nn.Parameter 类型的变量会被遍历(比如 nn.Linear/nn.Conv2d 的权重/偏置),普通张量不会被包含。

原文出处:/show_1GW2egn5bB7P.html