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