Skip to content

Latest commit

 

History

History
227 lines (158 loc) · 8.01 KB

README.md

File metadata and controls

227 lines (158 loc) · 8.01 KB

PaddleTools

Paddle动态图是不是很方便?是不是很好用?嗯?可是官方预训练参数都是静态图参数,自己从零开始又达不到精度,哎,还是先用静态图吧。不要方,PaddleTools可以帮到你!
PaddleTools是非官方出品的Paddle工具类,主要是为了添加一些日常使用Paddle时的常用工具,方便你我他!PaddleTools开源的第一款工具就是可以将Paddle的静态图参数转换为当下热门方便的动态图参数。目前,PaddleTools已支持将Paddle的参数动静态相互转换,同时还能将Pytorch的参数转到Paddle的动态图。如果大家有兴趣,欢迎一起开发这个工具类,如果没兴趣,往下看看也是可以的!

工具列表

  • 参数系列

    • PaddlePaddle静态图参数转动态图参数
    • PaddlePaddle动态图参数转静态图参数
    • Pytorch参数转PaddlePaddle动态图参数
  • 日志系列

    • 提供日志Logger,统一输出标准,同时支持日志输出到文件,方便在AIStudio使用
  • 进度提醒系列

    • 添加微信消息提醒(Server酱)
    • 添加邮件消息提醒
  • 训练辅助系列

    • 命令行参数统一化
    • 记录命令行参数改动
    • 联动日志,记录参数改动带来的变化
  • 数据读取辅助

    • 数据增强类
    • 图像分类数据读取类
    • 目标检测数据读取类
  • 动态图模型OP

    • 卷积+归一化层
  • 动态图分布式训练工具

    • 分布式训练类

安装

  • pip安装
pip3 install paddletools --upgrade
  • 源码安装
git clone https://github.com/LKKlein/PaddleTools.git
cd PaddleTools
pip3 install -r requirments.txt
python3 setup.py install

使用

功能列表:

参数转换

请注意:
1. 我们在搭建动态网络时,请将参数命名(ParamAttr)与静态图保持一致,这样才能正确读取参数!!!
2. 静态图参数只需要传递参数所在的文件夹名就可以了,动态图需要传递参数文件的名字,不包括.pdparams

  • 命令行使用
>>> pdtools --help
Usage:
    pdtools param (to_dynamic | to_static | from_torch) --src=<source_param> --dst=<destination_param> [--verbose]

Arguments:
    param                    paddle parameters operations.

Options:
    -s <source_param>, --src=<source_param>              dir path for source params.
    -d <destination_param>, --dst=<destination_param>    where should dest params to store.
    -v, --verbose                                        whether to show more logs. [default: True]

Example:
    pdtools param to_dynamic -s yolov3_pretrain/ -d yolov3 -v
    pdtools param to_static -s yolov3 -d yolov3_pretrain/ -v
    pdtools param from_torch -s yolov3.pth -d yolov3 -v
  • 代码中使用
  1. 静态图转动态图
import paddle.fluid as fluid
from paddletools.checkpoints import static2dynamic

# 第一种方式,保存到文件,然后使用动态网络从文件加载参数
static2dynamic(params_dir="yolov3_pretrain/", save_path="yolov3")

# 第二种方式,读取参数到内存,直接加载到网络中
model_state_dict = static2dynamic(params_dir="yolov3_pretrain/")

place = fluid.CPUPlace()
with fluid.dygraph.guard(place):
    model = YOLOv3()  # 初始化定义的动态图网络,这里假定为YOLOv3
    # 注意,这里的use_structured_name一定要设置为false,structured_name是由系统自动取的,与我们自己的命名不同
    # 这里可能会出现一个warning,但是没有关系,我们的参数已经是成功读取了的
    model.load_dict(model_state_dict, use_structured_name=False)  # 将读取的参数加载到网络中
  1. 动态图转静态图
from paddletools.checkpoints import dynamic2static

dynamic2static(param_file="yolov3", filename="yolov3_pretrain/")
  1. torch参数转动态图
from paddletools.checkpoints import torch2dynamic

# 第一种方式,保存到文件,然后使用动态网络从文件加载参数
torch2dynamic(param_file="yolov3_pretrain.pth", save_path="yolov3")

# 第二种方式,读取参数到内存,直接加载到网络中
model_state_dict = torch2dynamic(param_file="yolov3_pretrain.pth")

日志输出

PaddleTools提供了封装好的彩色日志输出,无需再对logger做进一步的配置。用过logging的同学应该会比较熟悉。

from paddletools import logger

# 五种标准输出,默认输出级别是info
logger.debug("test")
logger.info("test")
logger.warning("test")
logger.error("test")
logger.critical("test")

# 新增的两种输出级别,级别在info纸上,warning之下,用于训练和验证
logger.train("test")
logger.eval("test")

输出界面长这样:

另外,logger在显示输出的同时,还支持将输出保存到文件,方便之后查看日志。这一点对AIStudio用户来说非常重要!!!
只需要在程序入口设置添加下面这一行就可以了。

from paddletools import logger

# filename是需要存储日志的文件地址,including_all表示是否将引用的其他包的输出也存储到文件,默认为全部存储
logger.log_to_file(filename="path/to/logfile", including_all=True)

消息提醒

目前提供微信和邮件两种消息提醒方式。消息提醒可以用于推送模型训练的进度,也可以用于程序异常的警告。

  • 微信消息推送

微信消息使用Server酱进行推送,使用方式也非常简单,只需要使用GitHub账号登录,然后使用微信扫码绑定即可获取一个secret,具体见官网。获取secret之后即可开始使用。
不过,请注意,每人每天发送上限500条,相同内容5分钟内不能重复发送,不同内容一分钟只能发送30条。请注意控制推送的数量!!!

from paddletools.reminder.wechat import WeChatReminder

reminder = WeChatReminder("your-secret")
reminder.send(title="我是标题", content="我是正文")
  • 邮件消息推送

邮件目前支持163邮箱126邮箱QQ邮箱Gmail邮箱四种,后续会慢慢进行扩展的。在使用邮件发送消息之前,请先确认发送邮件的邮箱已经开启了SMTP服务,具体开启方式请自行百度,关键词可参考163邮箱开启SMTP

from paddletools.reminder.email import EmailReminder

# 这里需提供发送邮件的邮箱,接收邮件的邮箱,以及发送邮件的邮箱密码
# 部分邮箱的密码为开启SMTP服务时给的授权码,而不是登录密码,如163、QQ,请注意区分
reminder = EmailReminder(send_mail="xxx#163.com", receive_mail="xxx@qq.com", password="xxxxx")
reminder.send(title="我是标题", content="我是正文")

测试

  1. 使用paddlepaddleobj365上预训练的YoloV3参数进行测试
wget https://paddlemodels.bj.bcebos.com/object_detection/ResNet50_vd_dcn_db_obj365_pretrained.tar
tar -xvf ResNet50_vd_dcn_db_obj365_pretrained.tar
pdtools param to_dynamic -s ResNet50_vd_dcn_db_obj365_pretrained -d yolov3

转换完成会在当前目录下生成一个yolov3.pdparams的动态图参数文件

  1. 搭建网络测试转换精度
  • 静态图转动态图测试

网络详情见test/demo.py,主要是一层卷积、一层批归一化、一层全连接,测试结果是静态图与动态图输出完全一致。

cd test
python3 demo.py

建议与意见

  1. 如果你有什么关于PaddleTools需要实现的需求,请尽管提出你的issue,或者发邮件给我也行(lkklein@163.com)。
  2. 欢迎各位同学一起开发,随时在线。
  3. 欢迎大家使用,star和fork。