pytorch打印模型参数,冻结训练等操作

本文介绍如何在PyTorch中查看模型、优化器及学习率调度器的参数,并提供四种不同的方法来查看模型参数。此外,还介绍了如何选择性地冻结模型的某些层进行训练。

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

准备工作

import torch.optim as optim
import torch
import torchvision.models as models
device=torch.device("cuda" if torch.cuda.is_available() else "cpu")
model=models.resnet50(pretrained=False).to(device)
optimizer=optim.Adam(model.parameters(),0.01)
scheduler = optim.lr_scheduler.MultiStepLR(optimizer, milestones=[3, 6, 10, 15, 21], gamma=1/3.)

#--------------------------------

查看模型的参数

方法一

通过torchsummary这个包,首先安装这个包,

pip install torchsummary

然后

from torchsummary import summary
summary(model,input_size=(3,416,416))

结果:
在这里插入图片描述
在这里插入图片描述

方法二

使用model.named_parameters()

sum=0
for name,param in model.named_parameters():
    num=1
    for size in param.shape:
        num *= size
    sum+=num
    print("{:30s} : {}".format(name,param.shape))    
print("total param num {}".format(sum))

结果:
在这里插入图片描述

方法三

直接使用model.parameters(),但是这样看不见参数名。

for param in model.parameters():
    print(param.shape)

结果:
在这里插入图片描述

方法四

利用state_dict,state_dict以字典的方式保持了模型的参数名称和参数,通过遍历可以获取所有的参数。

for name in model.state_dict():
    print("{:30s}:{}".format(name,model.state_dict()[name].shape))

结果:
在这里插入图片描述

pytorch中带有参数的不止有model,还有optimizer和lr_scheduler,因此它们都有一个共同的属性state_dict,所以要想查看他们的参数名称,这个方法是通用的。

查看optimizer的参数

当然,查看优化器的参数时,除了使用查看模型参数的方法四,还有以下这种方式。

#打印optimizer的参数
print("optimizer.param_groups的长度:{}".format(len(optimizer.param_groups)))
for param_group in optimizer.param_groups:
    print(param_group.keys())
    print([type(value) for value in param_group.values()])
    print('查看学习率: ',param_group['lr'])

结果:

optimizer.param_groups的长度:1
dict_keys(['params', 'lr', 'betas', 'eps', 'weight_decay', 'amsgrad', 'initial_lr'])
[<class 'list'>, <class 'float'>, <class 'tuple'>, <class 'float'>, <class 'int'>, <class 'bool'>, <class 'float'>]
查看学习率:  0.01

冻结训练

可以选择性的冻结模型的某些层。

for layer in list(model.parameters())[:2]:
    layer.requires_grad=False

关于,冻结训练,可以看我这篇文章

### 如何在深度学习框架中冻结训练模型的参数 #### PyTorch冻结训练模型的参数 在 PyTorch 中,可以通过设置 `requires_grad` 属性为 `False` 来冻结模型中的某些层或整个模型的参数。这会阻止梯度计算并更新这些被冻结的参数。 以下是具体操作方法: ```python import torch.nn as nn from torchvision import models # 加载预训练模型 model = models.resnet18(pretrained=True) # 载入带有预训练权重的 ResNet18 模型[^1] # 遍历模型的所有参数并将 requires_grad 设置为 False for param in model.parameters(): param.requires_grad = False # 如果需要微调特定部分,则可以重新打开该部分的梯度计算 # 假设只希望解冻最后一层全连接层 model.fc.requires_grad_(True) # 打印各层是否可训练的状态以验证 for name, param in model.named_parameters(): print(f"Layer: {name}, Requires Grad: {param.requires_grad}") ``` 上述代码片段展示了如何加载一个带预训练权重的 ResNet18 模型,并将其所有参数冻结,仅允许最后的全连接层参与反向传播和优化过程。 --- #### TensorFlow/Keras 中冻结训练模型的参数 在 TensorFlow 和 Keras 中,也可以轻松地冻结训练模型的部分或全部参数。通过将图层的 `trainable` 属性设置为 `False` 即可实现这一目标。 下面是一个基于 TensorFlow 的例子: ```python from tensorflow.keras.applications import VGG16 from tensorflow.keras.models import Model from tensorflow.keras.layers import Dense, Flatten # 加载预训练模型(VGG16) base_model = VGG16(weights='imagenet', include_top=False) # 不包含顶层分类器 # 冻结基础模型的所有层 base_model.trainable = False # 构建新的自定义模型 x = base_model.output x = Flatten()(x) predictions = Dense(10, activation='softmax')(x) # 替换为自己的分类头 new_model = Model(inputs=base_model.input, outputs=predictions) # 查看哪些层是可以训练的 for layer in new_model.layers: print(f"Layer Name: {layer.name}, Trainable: {layer.trainable}") # 编译新模型 new_model.compile(optimizer='adam', loss='categorical_crossentropy') ``` 在这个示例中,首先加载了一个完整的 VGG16 模型作为基底网络,并禁用了其所有的训练能力 (`base_model.trainable = False`)。接着构建一个新的顶部结构用于替换默认的分类头部,并编译最终的新模型以便于后续使用。 --- #### 关键点总结 无论是 PyTorch 还是 TensorFlow/Keras,在处理迁移学习任务时经常需要用到这种技术——即先利用已有的大规模数据集上训练好的模型初始化当前的任务模型,再根据需求决定是否调整或者固定住原有的一些权值分布情况。对于那些不需要改变的基础特征提取模块来说,“冻结”它们能够有效减少不必要的计算开销同时保留良好的泛化性能表现[^2]。 ---
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值