参考chatgpt给出的关于深度学习模型的步骤如下:
要查看已经训练好的目标检测模型中设置的可学习权重的参数,可以使用以下步骤:
首先,导入您正在使用的深度学习框架库,如PyTorch、TensorFlow等。
然后,在代码中初始化一个目标检测模型实例,并将其加载到所需的设备上(通常是CPU或GPU)。
接下来,您可以通过访问模型的“parameters”属性来获取模型中的所有可学习参数。不同的目标检测模型具有不同的参数结构,但大多数目标检测模型都包含了预测框、分类器和特征提取器等子模型的参数。
对于使用PyTorch的目标检测模型,可以使用以下代码来检索模型中所有可学习参数的值:
python
import torch
import torchvision
初始化目标检测模型并加载已经训练好的权重到设备上
model = torchvision.models.detection.fasterrcnn_resnet50_fpn(pretrained=True)
device = torch.device(“cuda:0” if torch.cuda.is_available() else “cpu”)
model.to(device)
加载预训练的权重
checkpoint = torch.load(‘path/to/checkpoint.pth’, map_location=device)
model.load_state_dict(checkpoint[‘model_state_dict’])
获取模型中所有可学习参数的值
params = list(model.parameters())
for param in params:
print(param.size(), param)
在以上代码中,我们使用预先训练的Faster R-CNN ResNet-50-FPN模型作为示例。然后,我们将该模型加载到所需的设备上,并使用已经训练好的权重文件来更新模型参数。最后,我们使用“parameters”属性获取它的所有可学习参数,并打印这些参数的尺寸和值。
如果您想查看特定子模型的参数,例如预测框或分类器,可以通过访问相应的属性来实现。例如,以下代码演示了如何检索Faster R-CNN ResNet-50-FPN模型中骨干网络ResNet50的conv1层的所有参数:
python
检索骨干网络ResNet50的conv1层的所有参数
backbone_params = list(model.backbone.conv1.parameters())
for param in backbone_params:
print(param.size(), param)
以上代码将输出Faster R-CNN ResNet-50-FPN模型中骨干网络ResNet50的conv1层的所有参数及其值。
总之,要查看已经训练好的目标检测模型中设置的可学习权重的参数,请导入相应的深度学习框架库,初始化目标检测模型实例并将其加载到所需的设备上,然后通过访问模型的“parameters”属性获取这些参数。要加载已经训练好的权重,您可以使用PyTorch中的“load_state_dict”方法。
-*******************************************************************************************************************
简单来说就是用torch.load把模型中的参数保存到checkpoint当中,然后再提取checkpoint字典当中的参数去查看就ok。
但是yolov5train.py的代码中对模型保存数据有所更改,故步骤如下:
图1.
这块是保存权重参数的,由代码可知可学习的权重都放到pg1这个列表了。
这里再看一下下面保存模型的代码:
发现,保存的模型数据只有epoch、best_fitness、…注意:模型的权重参数最后被保存在了optimizer这个词里头,而且, 如果是最后一轮保存的结果,是会被删除的,为此,这里可以修改一下代码,设定为我永久不删除,然后我权重文件****.pt当中就有了可学习权重的参数了,我们就能直接用chatgpt的方法看到了。又或者我们可以直接拿其他轮次的去查看,都可以。
具体改进:
1.改进train.py的保存的部分
if (not opt.nosave) or (final_epoch and not opt.evolve): # if save
ckpt = {'epoch': epoch,
'best_fitness': best_fitness,
'training_results': results_file.read_text(),
'model': deepcopy(model.module if is_parallel(model) else model).half(),
'ema': deepcopy(ema.ema).half(),
'updates': ema.updates,
'optimizer': optimizer.state_dict(),
'optimizer_param_groups': optimizer.param_groups,
'wandb_id': wandb_logger.wandb_run.id if wandb_logger.wandb else None,
'model_state_dict': model.state_dict(),
'model_pram': model.parameters(),
}
注意:optimizer.state_dict(),保存的形式如下:
optimizer.state_dict():返回一个dict对象,其中储存了优化器的状态信息,包括学习率、动量、weight_decay等参数的值以及每个参数对应的梯度信息。
optimizer.param_groups:返回一个包含优化器参数组(Param Group)的列表,每个Param Group中包含了一些参数和超参数,如学习率lr、权重衰减参数weight_decay、梯度的归一化系数momentum等。
model.state_dict():返回一个dict对象,其中储存了模型的状态信息,包括模型权重和偏差值的参数值,以及每一层的其他超参数设置。
model.parameters():返回一个包含模型所有参数(权重和偏差)的迭代器。
它们的区别在于:
- optimizer.state_dict()和model.state_dict()都是返回模型的状态信息,但是optimizer.state_dict()中储存的是优化器的具体参数,而model.state_dict()中储存的是模型中的具体参数。
- optimizer.param_groups是一个列表,其中每个参数组都是优化器的一个子模块,包含了一些参数和超参数。而model.parameters()是一个可迭代对象,包括模型中的所有参数,包括权重和偏差。
为此,我们要查看参数的具体值的时候,可以从model.state_dict()或者model.parameters()或者optimizer.param_groups查看,optimizer.state_dict()则看不了。
在改好以上代码以后,我们再去训练的时候,权重文件就会保存各项参数的具体值了。
2.拿到权重文件在yolo.py中进行查看
checkpoint = torch.load(r'F:\GuoZhoupeng\训练日志\2023-4-12 yolov5 Ta-conv_w[of 1除以3] have 13(...)\train\exp6\weights\best.pt', map_location=device)
# model.load_state_dict(checkpoint['model_state_dict'])
# params = model.state_dict()
state_dict = checkpoint['state_dict']
model.load_state_dict(state_dict)
print(state_dict)
model.load_state_dict(state_dict)
在这里加断点,进行debug,我们查看checkpoint的的内置参数如下:
可以看到需要的数值都有了,直接在这里面看就ok了
查看权重的具体值,有助于我们分析这个模型,并作出相应改进,非常有用!