Paddle.Hub 初探:快速基于预训练模型实现猫的 12 分类


本文介绍Paddle 2.1.0版本新功能Paddle.Hub API,可快速加载外部扩展模型。以用PaddleClas预训练模型实现猫的12分类为例,演示同步代码、加载模型列表与模型、预处理数据、训练模型及预测的过程,还提及该版本存在的一些问题。

☞☞☞AI 智能聊天, 问答助手, AI 智能搜索, 免费无限量使用 DeepSeek R1 模型☜☜☜

引入

  • Paddle 最近更新到了 2.1.0 版本了
  • 其中加入了一个新功能,即 Paddle.Hub API
  • 通过这个新功能,可以快速加载外部的拓展模型,比如加载 PaddleClas 中丰富的分类预训练模型
  • 今天就通过这个项目来体验一下这个功能,使用 PaddleClas 中的预训练模型实现极简版的猫的 12 分类

Paddle.Hub

  • 官方文档:直达链接

  • API 简介:

    API 名称 API 功能
    list 查看 Repo 支持的模型列表
    help 查看指定模型的文档
    load 加载指定模型
  • 使用介绍:
    • 简单讲这就是个可以快速调用外部扩展模型的 API
    • 只需要将模型的代码托管在 GitHub 或 Gitee 平台上或者存储在本地
    • 就可以通过这个 API 进行调用,方便开发者分享模型代码供其他人快速使用

快速使用

  • 因为 GitHub 访问速度比较慢的缘故
  • 暂时使用本地加载的方式来演示,所以需要预先同步 repo 的代码至本地后进行使用
In [ ]
# 同步 PaddleClas 代码!git clone https://gitee.com/PaddlePaddle/PaddleClas -b develop --depth 1
    In [ ]
import paddle# 加载 Repo 中的模型列表model_list = paddle.hub.list('PaddleClas', source='local', force_reload=False)print(model_list)# 查看模型帮助文档model_help = paddle.hub.help('PaddleClas', 'mobilenetv3_large_x1_25', source='local', force_reload=False)print(model_help)# 加载模型model = paddle.hub.load('PaddleClas', 'mobilenetv3_large_x1_25', source='local', force_reload=False)# 模型测试data = paddle.rand((1, 3, 224, 224))
out = model(data)print(out.shape) # [1, 1000]
       
['alexnet', 'densenet121', 'densenet161', 'densenet169', 'densenet201', 'densenet264', 'googlenet', 'inceptionv3', 'inceptionv4', 'mobilenetv1', 'mobilenetv1_x0_25', 'mobilenetv1_x0_5', 'mobilenetv1_x0_75', 'mobilenetv2_x0_25', 'mobilenetv2_x0_5', 'mobilenetv2_x0_75', 'mobilenetv2_x1_5', 'mobilenetv2_x2_0', 'mobilenetv3_large_x0_35', 'mobilenetv3_large_x0_5', 'mobilenetv3_large_x0_75', 'mobilenetv3_large_x1_0', 'mobilenetv3_large_x1_25', 'mobilenetv3_small_x0_35', 'mobilenetv3_small_x0_5', 'mobilenetv3_small_x0_75', 'mobilenetv3_small_x1_0', 'mobilenetv3_small_x1_25', 'resnet101', 'resnet152', 'resnet18', 'resnet34', 'resnet50', 'resnext101_32x4d', 'resnext101_64x4d', 'resnext152_32x4d', 'resnext152_64x4d', 'resnext50_32x4d', 'resnext50_64x4d', 'shufflenetv2_x0_25', 'squeezenet1_0', 'squeezenet1_1', 'vgg11', 'vgg13', 'vgg16', 'vgg19']

    MobileNetV3_large_x1_25
    Args:
        pretrained: bool=False. If `True` load pretrained parameters, `False` otherwise.
        kwargs: 
            class_dim: int=1000. Output dim of last fc layer.
    Returns:
        model: nn.Layer. Specific `MobileNetV3_large_x1_25` model depends on args.
    
[1, 1000]
       

已知问题

  • Paddle 2.1.0 GPU 版本暂时不太稳定,模型能够正常加载和前向计算,但是跑 PaddleHapi 的训练会直接崩溃重启(Issue 已提,Paddle 的 bug,待修复)
  • 通过 Gitee 无法加载,会报错 File is not a zip file(Issue 已提,目前该功能已从文档移除)
  • GitHub 访问速度比较慢,不过这个没啥好办法
  • 每次加载模型后,如果不重启 Notebook 内核就无法重新加载(Issue 已提,PaddleClas 的 bug,待修复)
  • PaddleClas 内的一些模型比如 MobileNet v3 系列,还无法在 PaddleHapi 中正常使用(提交的 pr 已合并)

猫的12分类

任务描述

  • 利用训练的模型来预测数据所属的类别。

数据说明

  • 本数据集包含12种类的猫的图片
  • 整个数据将被分为训练集与测试集。
  • 训练集:在训练集中,我们将提供高清彩色图片以及图片所属的分类
  • 测试集:在测试数据集中,我们仅仅提供彩色图片

解压数据集

  • 使用数据之前第一步就是对训练和测试集进行解压缩
In [ ]
!unzip -q -d /home/aistudio/data/data10954 /home/aistudio/data/data10954/cat_12_train.zip!unzip -q -d /home/aistudio/data/data10954 /home/aistudio/data/data10954/cat_12_test.zip
   

数据预处理

  • 对于一个数据集,首先要了解数据的组成是什么:

    • 解压完的数据集中包括两个图片文件夹以及一个数据列表文件,如下图所示

                   

    • 其中 cat_12_train 和 cat_12_test 分别存放所有训练和测试集的图片
    • train_list.txt 则是以由一行行"图片 标签"的数据组成的数据列表
      • 如:cat_12_train/8GOkTtqw7E6IHZx4olYnhzvXLCiRsUfM.jpg 0
      • 其中使用0-11分别对12个类别进行标注
      • 中间使用\t作为分隔符
  • 对于一个数据集,为了更好的衡量模型的效果,不能只有训练集和测试集,所以一般需要从中训练集中分出一部分作为验证集使用

  • 了解了上述的内容,就可以开始使用代码来对数据集进行预处理了

In [ ]
import osimport paddleimport random

total = []# 读取数据标签with open('/home/aistudio/data/data10954/train_list.txt', 'r', encoding='UTF-8') as f:    for line in f:        # 格式转换
        line = line[:-1].split('\t')
        total.append(' '.join(line)+'\n')# 打乱数据顺序random.shuffle(total)'''
切分数据集
95%的数据作为训练集
5%的数据作为验证集
'''split_num = int(len(total)*0.95) 

# 写入训练数据列表with open('/home/aistudio/data/data10954/train.txt', 'w', encoding='UTF-8') as f:    for line in total[:split_num]:
        f.write(line)# 写入验证数据列表with open('/home/aistudio/data/data10954/dev.txt', 'w', encoding='UTF-8') as f:    for line in total[split_num:]:
        f.write(line)# 写入测试数据列表with open('/home/aistudio/data/data10954/test.txt', 'w', encoding='UTF-8') as f:    for line in ['cat_12_test/%s\n' % img for img in os.listdir('/home/aistudio/data/data10954/cat_12_test')]:
        f.write(line)
   

模型训练

  • 模型训练的一般步骤如下:

    1. 搭建模型
    2. 构建数据集和数据读取器
    3. 配置各种参数
    4. 构建训练任务
    5. 开始训练模型
  • 注:启动训练前请重启 Notebook 内核

  • 注:目前只有 CPU 环境才可以正常运行如下代码

In [ ]
import osimport paddleimport randomimport paddle.nn as nnimport paddle.vision.transforms as T# 构建数据集class CatDataset(paddle.io.Dataset):
    def __init__(self, transforms, dataset_path='/home/aistudio/data/data10954', mode='train'):
        self.mode = mode
        self.dataset_path = dataset_path
        self.transforms = transforms
        self.num_classes = 5

        if self.mode == 'train':
            self.file = 'train.txt'
        elif self.mode == 'dev':
            self.file = 'dev.txt'
        else:
            self.file = 'test.txt'
        self.file = os.path.join(dataset_path, self.file)        with open(self.file, 'r') as file:
            self.data = file.read()[:-1].split('\n')    def __getitem__(self, idx):
        if self.mode in ['train', 'dev']:
            img_path, grt = self.data[idx].split(' ')
            img_path = os.path.join(self.dataset_path, img_path)
            im = paddle.vision.image_load(img_path)
            im = im.convert("RGB")
            im = self.transforms(im)            return im, int(grt)        else:
            img_path = self.data[idx]
            img_path = os.path.join(self.dataset_path, img_path)
            im = paddle.vision.image_load(img_path)
            im = im.convert("RGB")
            im = self.transforms(im)            return im    def __len__(self):
        return len(self.data)# 加载数据集train_transforms = T.Compose([
    T.Resize(256),
    T.RandomCrop(224),
    T.RandomHorizontalFlip(),
    T.RandomVerticalFlip(),
    T.ToTensor(),
    T.Normalize(mean=[0.5, 0.5, 0.5], std=[0.5, 0.5, 0.5])
])

test_transforms = T.Compose([
    T.Resize(256),
    T.CenterCrop(224),
    T.ToTensor(),
    T.Normalize(mean=[0.5, 0.5, 0.5], std=[0.5, 0.5, 0.5])
])

train_dataset = CatDataset(train_transforms, mode='train')
dev_dataset = CatDataset(test_transforms, mode='dev')
test_dataset = CatDataset(test_transforms, mode='test')# 加载模型model = paddle.hub.load('PaddleClas', 'mobilenetv3_large_x0_5', source='local', force_reload=False, class_dim=12, pretrained=True)
model = paddle.Model(model)# 定义优化器opt = paddle.optimizer.Adam(learning_rate=0.001, parameters=model.parameters())# 配置模型model.prepare(optimizer=opt, loss=nn.CrossEntropyLoss(), metrics=paddle.metric.Accuracy(topk=(1, 5)))

model.fit(
    train_data=train_dataset, 
    eval_data=dev_dataset, 
    batch_size=32, 
    epochs=2, 
    eval_freq=1, 
    log_freq=1, 
    save_dir='save_models', 
    save_freq=1, 
    verbose=1, 
    drop_last=False, 
    shuffle=True,
    num_workers=0)
       
2025-05-18 12:43:59 INFO: unique_endpoints {''}
2025-05-18 12:43:59 INFO: Downloading MobileNetV3_large_x0_5_pretrained.pdparams from https://paddle-imagenet-models-name.bj.bcebos.com/dygraph/MobileNetV3_large_x0_5_pretrained.pdparams
100%|██████████| 15875/15875 [00:00<00:00, 18983.36it/s]
/opt/conda/envs/python35-paddle120-env/lib/python3.7/site-packages/paddle/fluid/dygraph/layers.py:1297: UserWarning: Skip loading for out.weight. out.weight receives a shape [1280, 1000], but the expected shape is [1280, 12].
  warnings.warn(("Skip loading for {}. ".format(key) + str(err)))
/opt/conda/envs/python35-paddle120-env/lib/python3.7/site-packages/paddle/fluid/dygraph/layers.py:1297: UserWarning: Skip loading for out.bias. out.bias receives a shape [1000], but the expected shape is [12].
  warnings.warn(("Skip loading for {}. ".format(key) + str(err)))
       
The loss value printed in the log is the current step, and the metric is the average value of previous steps.
Epoch 1/2
       
/opt/conda/envs/python35-paddle120-env/lib/python3.7/site-packages/paddle/fluid/layers/utils.py:77: DeprecationWarning: Using or importing the ABCs from 'collections' instead of from 'collections.abc' is deprecated, and in 3.8 it will stop working
  return (isinstance(seq, collections.Sequence) and
       
step 65/65 [==============================] - loss: 2.7684 - acc_top1: 0.6628 - acc_top5: 0.9464 - 3s/step        
save checkpoint at /home/aistudio/save_models/0
Eval begin...
step 4/4 [==============================] - loss: 0.8948 - acc_top1: 0.7685 - acc_top5: 0.9907 - 732ms/step         
Eval samples: 108
Epoch 2/2
step 65/65 [==============================] - loss: 0.5738 - acc_top1: 0.8397 - acc_top5: 0.9942 - 3s/step        
save checkpoint at /home/aistudio/save_models/1
Eval begin...
step 4/4 [==============================] - loss: 0.5484 - acc_top1: 0.8611 - acc_top5: 0.9907 - 779ms/step         
Eval samples: 108
save checkpoint at /home/aistudio/save_models/final
       

模型预测

  • 模型预测一般步骤:

    1. 读取数据
    2. 模型预测
    3. 预测结果后处理
    4. 输出最终结果
In [ ]
import numpy as np# 模型预测results = model.predict(test_dataset, batch_size=32, num_workers=0, stack_outputs=True, callbacks=None)# 对预测结果进行后处理total = []for img, result in zip(test_dataset.data, np.argmax(results[0], 1)):
    total.append('%s,%s\n' % (img.split('/')[-1], result))# 生成结果文件with open('result.csv','w') as f:    for line in total:
        f.write(line)
       
Predict begin...
step 8/8 [==============================] - 805ms/step        
Predict samples: 240


# 重启  # 切分  # 是个  # 测试数据  # 后处理  # 访问速度  # 比较慢  # 就可以  # 文档  # python  # 加载  # gitee  # issue  # bug  # github  # red  # ai  # git 


相关栏目: 【 Google疑问12 】 【 Facebook疑问10 】 【 网络优化91478 】 【 技术知识72672 】 【 云计算0 】 【 GEO优化84317 】 【 优选文章0 】 【 营销推广36048 】 【 网络运营41350 】 【 案例网站102563 】 【 AI智能45237


相关推荐: 千问怎样用提示词获取健康建议_千问健康类提示词注意事项【指南】  Midjourney怎样加元素词丰富画面_Midjourney元素词技巧【方法】  探索心灵的音乐之旅:Kanwar Garewal的《Ishq Bulleh Nu》  如何用AI一键生成求职简历?AI简历优化与制作工具推荐【干货】  Artist.ly AI Image Designer: 终极指南  播客数据深度分析:揭秘全球听众分布及增长策略  AI Lead Generation: 解锁未来增长引擎,营销新纪元  如何使用 DeepSeek API 构建低成本智能应用  AI伴侣:连接还是孤独?真实对话揭秘AI伦理困境  AI视频创作终极指南:文本到视频的免费工具与技巧  Filmora 13 AI音乐生成器:创意视频配乐新纪元  Gemini 与 Google Drive 结合的文件智能检索  Claude如何关闭自动续费_Claude续费关闭方法【方法】  Z170芯片组内存兼容性问题终极指南  AI写作鱼怎么一键生成论文大纲_AI写作鱼大纲生成与逻辑梳理【技巧】  开源AI Agent项目精选:赋能智能自动化  AI内容检测与优化:免费工具助你提升内容质量  百度AI助手网页版入口 免安装直接打开入口  Gamma做年终总结PPT怎么用_Gamma做年终总结PPT使用方法详细指南【教程】  斑马AI怎样设置专注模式_斑马AI专注时段与干扰屏蔽【指南】  人工智能时代:你需要知道的真相和未来趋势  ChatGPT一键生成PPT怎么加动画_ChatGPTPPT动画添加【指南】  Google AI Studio:免费AI视频生成器使用指南  旅游营销AI:ChatGPT邮件营销策略,提升旅游业务转化率  通义万相做海报怎么用_通义万相做海报使用方法详细指南【教程】  千问能否生成多语言年终总结_千问多语言翻译与本地化调整【攻略】  如何通过 DeepSeek 优化分布式存储系统架构  AI论文写作终极指南:DeepSeek与HIX Bypass结合使用教程  老电脑焕新:i5-2400搭配FirePro V5900 打造复古游戏利器  Midjourney怎样加风格词调质感_Midjourney风格词技巧【指南】  百度输入法智能预测怎么关 百度输入法ai联想词关闭  智谱AI智能绘图怎么用_智谱AI智能绘图使用方法详细指南【教程】  豆包AI怎么评价回答的好坏_点赞与反馈功能使用教程  5分钟搞定求职信:利用AI工具大幅提升求职效率的实操技巧  AI动画制作终极指南:让你的图片和人物栩栩如生  EdrawMax全面评测:使用AI轻松绘制流程图和思维导图  Removebg怎样快速抠图_Removebg上传图片与自动抠图步骤【教程】  人脸识别的伦理困境:Massive Attack的演出引发的思考  如何用AI自动生成Python代码 AI编程助手ChatGPT使用方法【教程】  豆包AI怎样生成PPT目录页_豆包AI目录自动生成与页码添加【指南】  可灵ai怎么生成招聘JD文案_可灵aiJD生成要素与岗位描述优化【技巧】  AI员工工具详解:添加与移除指南,提升效率  Depseek怎么生成员工成长总结_Depseek成长维度提取与案例整合【方法】  v0 Report深度测评:AI文档生成器的优缺点分析与实用指南  雷小兔ai智能写作如何生成文案_雷小兔ai智能写作文案生成场景选择【攻略】  稿定设计AI抠图怎样调整透明度_稿定设计AI透明度滑块与渐变设置【攻略】  Motion 教程:AI 驱动的智能日程安排,提高工作效率  解读Childish Gambino《This Is America》的深层含义与文化影响  AI Buildr: 构建 AI 应用的终极指南  AI自动化工作流:Zapier提升效率,优化工作流程 

 2025-07-24

了解您产品搜索量及市场趋势,制定营销计划

同行竞争及网站分析保障您的广告效果

点击免费数据支持

提交您的需求,1小时内享受我们的专业解答。

南京市珐之弘网络技术有限公司


南京市珐之弘网络技术有限公司

南京市珐之弘网络技术有限公司专注海外推广十年,是谷歌推广.Facebook广告全球合作伙伴,我们精英化的技术团队为企业提供谷歌海外推广+外贸网站建设+网站维护运营+Google SEO优化+社交营销为您提供一站式海外营销服务。

 87067657

 13565296790

 87067657@qq.com

Notice

We and selected third parties use cookies or similar technologies for technical purposes and, with your consent, for other purposes as specified in the cookie policy.
You can consent to the use of such technologies by closing this notice, by interacting with any link or button outside of this notice or by continuing to browse otherwise.