预训练模型加载&更改网络层&batch推断

该博客介绍了如何使用预训练的MobileNetV3模型进行迁移学习,步骤包括加载预训练模型,修改网络的最后一层以适应不同类别数,固定部分层以进行微调,以及如何进行推断时的图像处理。此外,还提供了测试代码和如何在项目中固定和重组模型层的细节。
摘要由CSDN通过智能技术生成

以MobileNetV3为例,预训练模型classes=1000,项目中classes=2, 利用预训练模型训练自己的任务。

1. 预训练模型加载

net = MobileNetV3_Small(num_classes=1000)
##加载预训练模型
model = torch.load('./mbv3_small.pth.tar', map_location = 'cpu')
print('Loading base network...')
weight = model["state_dict"]
base_net = torch.nn.DataParallel(net)
base_net.load_state_dict(weight)

注意  base_net = torch.nn.DataParallel(net),那么推断的时候也须加上:

model = torch.nn.DataParallel(model)

2. 更改网络层

将最后一层全连接层替换:

base_net.module.linear4 = nn.Linear(1280, 2).cuda()

3. 测试:

x = torch.randn(2,3,224,224).cuda()
y = base_net(x)
print(y.size())

4. 有些时候要固定某些层,方法如下:

#固定除了linear4层外的其他层
for k,v in base_net.named_parameters():
    if k!='linear4.weight' and k!='linear4.bias' :
        v.requires_grad=False#固定参数

参考:

https://www.jianshu.com/p/d67d62982a24

https://blog.csdn.net/qq_28368377/article/details/108747997

https://blog.csdn.net/qq_43360777/article/details/106305469?utm_medium=distribute.pc_relevant.none-task-blog-baidujs_title-0&spm=1001.2101.3001.4242

5. 有时候推断的时候需要将图片重组为batch,方法如下:

def inference_detectors(model,frames):
    batch_frame = []
    for frame in frames:
        frame = np.asarray(frame)
        ##完成按长宽比对其进行缩放
        border_v = 0
        border_h = 0
        if (frame.shape[0] / frame.shape[1]) < 1:
            border_v = int(((frame.shape[1]) - frame.shape[0]) / 2)
        else:
            border_h = int(((frame.shape[0]) - frame.shape[1]) / 2)
        img = cv2.copyMakeBorder(frame, border_v, border_v, border_h, border_h, cv2.BORDER_CONSTANT, 0)
        img = cv2.resize(img, (224, 224))
        #img = cv2.resize(np.asarray(frame),(224,224))
        img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)  # TORGB
        img = transforms.ToTensor()(img)
        batch_frame.append(img)

    if len(batch_frame) == 0:
        return []

    ##转换为batch
    batch_frame = torch.stack(batch_frame,dim=0)
    img = Variable(torch.tensor(batch_frame).float(), requires_grad=False).cuda()
    output = model(img)
   

    pred = output.argmax(dim=1)
    pred_cpu = pred.data.cpu()
    index = np.argwhere(pred_cpu == 1)
    
    result = []
    ##返回index是一个list, 取值方法如下:
    if len(indexs[0]) > 0:
       for id in indexs[0]:
        bbox = bboxes[id]
        result.append([bbox[0], bbox[1], bbox[2], bbox[3]])    
    return result
在 PaddleCls 加载预训练模型可以通过以下步骤实现: 1. 安装 PaddlePaddle 和 PaddleCls:首先需要安装 PaddlePaddle 深度学习框架和 PaddleCls 工具包。你可以通过官方网站或者使用 pip 命令来安装。 2. 下载预训练模型权重:从 PaddleCls 的模型库选择并下载你想要使用的预训练模型的权重文件。你可以在官方文档或者 PaddleCls 的 GitHub 仓库找到相应的权重文件。 3. 创建模型并加载权重:在 Python 代码,首先导入相关的库和模块。然后,创建对应的模型,并使用 `paddle.Model` 类加载预训练模型的权重。 ```python import paddle import paddle.vision as vision # 创建模型 model = vision.models.resnet50(pretrained=False) # 加载预训练模型权重 model_state_dict = paddle.load("/path/to/pretrained_model.pdparams") model.set_state_dict(model_state_dict) ``` 注意,上述代码的 `"/path/to/pretrained_model.pdparams"` 需要替换为你下载的预训练模型权重文件的路径。 4. 使用模型进行推理:加载预训练模型后,你可以使用该模型进行图像分类、目标检测或其他任务的推理。 ```python import paddle import paddle.vision.transforms as transforms # 预处理图像 transform = transforms.Compose([ transforms.Resize(size=(224, 224)), transforms.ToTensor(), transforms.Normalize(mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225]) ]) image = transform(image) # image 为输入的图像数据 # 使用模型进行推理 logits = model(image.unsqueeze(0)) # unsqueeze(0) 将输入的图像数据扩展为 batch 维度 ``` 以上是加载预训练模型的一般步骤。具体的模型加载方法和预处理步骤可能因不同的模型和任务而有所不同,请参考 PaddleCls 的官方文档或示例代码以获得更详细的信息和使用方法。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值