未验证 提交 97931636 编写于 作者: S Steffy-zxf 提交者: GitHub

transfer readthedocs platform (#338)

* update doc
上级 20b5787f
......@@ -72,7 +72,7 @@ paddlehub.server_check()
### 模型即软件
PaddleHub提出 **模型即软件** 的理念,通过Python API或命令行实现快速预测,更方便地使用PaddlePaddle模型库。
安装PaddleHub成功后,执行命令[hub run](https://github.com/PaddlePaddle/PaddleHub/wiki/PaddleHub%E5%91%BD%E4%BB%A4%E8%A1%8C%E5%B7%A5%E5%85%B7#run),可以快速体验PaddleHub无需代码、一键预测的命令行功能,如下三个示例:
安装PaddleHub成功后,执行命令[hub run](./docs/tutorial/cmdintro.md),可以快速体验PaddleHub无需代码、一键预测的命令行功能,如下三个示例:
* 使用[词法分析](http://www.paddlepaddle.org.cn/hub?filter=category&value=LexicalAnalysis)模型LAC进行分词
```shell
......@@ -86,20 +86,22 @@ $ hub run senta_bilstm --input_text "今天天气真好"
{'text': '今天天气真好', 'sentiment_label': 1, 'sentiment_key': 'positive', 'positive_probs': 0.9798, 'negative_probs': 0.0202}]
```
* 使用[目标检测](http://www.paddlepaddle.org.cn/hub?filter=category&value=ObjectDetection)模型 SSD/YOLO v3/Faster RCNN 对图片进行目标检测
* 使用[目标检测](http://www.paddlepaddle.org.cn/hub?filter=category&value=ObjectDetection)模型Ultra-Light-Fast-Generic-Face-Detector-1MB对图片进行人脸识别
```shell
$ wget https://paddlehub.bj.bcebos.com/resources/test_image.jpg
$ hub run ultra_light_fast_generic_face_detector_1mb_640 --input_path test_image.jpg
```
![人脸识别结果](docs/imgs/face_detection_result.jpeg)
* 使用[图像分割](https://www.paddlepaddle.org.cn/hub?filter=en_category&value=ImageSegmentation)模型ace2p对图片进行语义分割
```shell
$ wget https://paddlehub.bj.bcebos.com/resources/test_object_detection.jpg
$ hub run ssd_mobilenet_v1_pascal --input_path test_object_detection.jpg
$ hub run yolov3_darknet53_coco2017 --input_path test_object_detection.jpg
$ hub run faster_rcnn_coco2017 --input_path test_object_detection.jpg
$ wget https://paddlehub.bj.bcebos.com/resources/test_image.jpg
$ hub run ace2p --input_path test_image.jpg
```
![SSD检测结果](https://raw.githubusercontent.com/PaddlePaddle/PaddleHub/release/v1.3/docs/imgs/object_detection_result.png)
![图像分割结果](docs/imgs/img_seg_result.jpeg)
除了上述三类模型外,PaddleHub还发布了图像分类、语义模型、视频分类、图像生成、图像分割、文本审核、关键点检测等业界主流模型,更多PaddleHub已经发布的模型,请前往 https://www.paddlepaddle.org.cn/hub 查看
PaddleHub同时支持安装、卸载、查看模型信息等命令行功能,详细参见[PaddleHub命令行工具介绍](https://github.com/PaddlePaddle/PaddleHub/wiki/PaddleHub%E5%91%BD%E4%BB%A4%E8%A1%8C%E5%B7%A5%E5%85%B7)
### 迁移学习
迁移学习(Transfer Learning)通俗来讲,就是运用已有的知识来学习新的知识,核心是找到已有知识和新知识之间的相似性。PaddleHub提供了Fine-tune API,只需要少量代码即可完成深度学习模型在自然语言处理和计算机视觉场景下的迁移学习。
......@@ -129,19 +131,19 @@ PaddleHub同时支持安装、卸载、查看模型信息等命令行功能,
关于PaddleHub快捷完成迁移学习,更多信息参考:
[Fine-tune API](https://github.com/PaddlePaddle/PaddleHub/wiki/PaddleHub-Finetune-API)
[Fine-tune API](./docs/reference)
[自定义数据集如何Fine-tune](https://github.com/PaddlePaddle/PaddleHub/wiki/PaddleHub%E9%80%82%E9%85%8D%E8%87%AA%E5%AE%9A%E4%B9%89%E6%95%B0%E6%8D%AE%E5%AE%8C%E6%88%90FineTune)
[自定义数据集如何Fine-tune](./docs/tutorial/how_to_load_data.md)
[实现自定义迁移任务](https://github.com/PaddlePaddle/PaddleHub/wiki/PaddleHub:-%E8%87%AA%E5%AE%9A%E4%B9%89Task)
[实现自定义迁移任务](./docs/tutorial/how_to_define_task.md)
[ULMFiT优化策略](https://github.com/PaddlePaddle/PaddleHub/blob/release/v1.3/tutorial/strategy_exp.md)
[ULMFiT优化策略](./docs/tutorial/strategy_exp.md)
### 服务化部署PaddleHub Serving
PaddleHub提供便捷的服务化部署能力,简单一行命令即可实现模型部署上线以对外提供服务。
**PaddleHub 1.5.0版本增加文本Embedding服务[Bert Service](./tutorial/bert_service.md), 轻松获取文本embedding**
**PaddleHub 1.5.0版本增加文本Embedding服务[Bert Service](./docs/tutorial/bert_service.md), 轻松获取文本embedding**
PaddleHub Serving启动方式有两种:
......@@ -161,13 +163,13 @@ $ hub serving start --config config.json
config.json文件包含待部署模型信息等,
关于PaddleHub Serving详细信息参见[PaddleHub Serving一键服务化部署](./tutorial/serving.md)
关于PaddleHub Serving详细信息参见[PaddleHub Serving一键服务化部署](./docs/tutorial/serving.md)
### 超参优化AutoDL Finetuner
深度学习模型往往包含许多的超参数,而这些超参数的取值对模型性能起着至关重要的作用。因为模型参数空间大,目前超参调整都是通过手动,依赖人工经验或者不断尝试,且不同模型、样本数据和场景下不尽相同,所以需要大量尝试,时间成本和资源成本非常浪费。PaddleHub AutoDL Finetuner可以实现自动调整超参数,使得模型性能达到最优水平。它通过多种调优的算法来搜索最优超参。
AutoDL Finetuner详细信息参见[PaddleHub超参优化](./tutorial/autofinetune.md)
AutoDL Finetuner详细信息参见[PaddleHub超参优化](./docs/tutorial/autofinetune.md)
## FAQ
......
......@@ -64,4 +64,4 @@
## 超参优化AutoDL Finetuner
PaddleHub还提供了超参优化(Hyperparameter Tuning)功能, 自动搜索最优模型超参得到更好的模型效果。详细信息参见[AutoDL Finetuner超参优化功能教程](../tutorial/autofinetune.md)
PaddleHub还提供了超参优化(Hyperparameter Tuning)功能, 自动搜索最优模型超参得到更好的模型效果。详细信息参见[AutoDL Finetuner超参优化功能教程](../docs/tutorial/autofinetune.md)
......@@ -63,4 +63,4 @@ img_cls.py以mobilenet为预训练模型,在flowers数据集上进行Fine-tune
在完成安装PaddlePaddle与PaddleHub后,通过执行脚本`sh run_autofinetune.sh`即可开始使用超参优化功能。
**NOTE:** 关于PaddleHub超参优化详情参考[教程](../../tutorial/autofinetune.md)
**NOTE:** 关于PaddleHub超参优化详情参考[教程](../../docs/tutorial/autofinetune.md)
......@@ -73,4 +73,4 @@ text_cls.py以ernie为预训练模型,在ChnSentiCorp数据集上进行Fine-tu
在完成安装PaddlePaddle与PaddleHub后,通过执行脚本`sh run_autofinetune.sh`即可开始使用超参优化功能。
**NOTE:** 关于PaddleHub超参优化详情参考[教程](../../tutorial/autofinetune.md)
**NOTE:** 关于PaddleHub超参优化详情参考[教程](../../docs/tutorial/autofinetune.md)
......@@ -172,4 +172,4 @@ $ tensorboard --logdir $CKPT_DIR/visualization --host ${HOST_IP} --port ${PORT_N
## 超参优化AutoDL Finetuner
PaddleHub还提供了超参优化(Hyperparameter Tuning)功能, 自动搜索最优模型超参得到更好的模型效果。详细信息参见[AutoDL Finetuner超参优化功能教程](../../tutorial/autofinetune.md)
PaddleHub还提供了超参优化(Hyperparameter Tuning)功能, 自动搜索最优模型超参得到更好的模型效果。详细信息参见[AutoDL Finetuner超参优化功能教程](../../docs/tutorial/autofinetune.md)
......@@ -205,4 +205,4 @@ python predict.py --checkpoint_dir $CKPT_DIR --max_seq_len 128
## 超参优化AutoDL Finetuner
PaddleHub还提供了超参优化(Hyperparameter Tuning)功能, 自动搜索最优模型超参得到更好的模型效果。详细信息参见[AutoDL Finetuner超参优化功能教程](../../tutorial/autofinetune.md)
PaddleHub还提供了超参优化(Hyperparameter Tuning)功能, 自动搜索最优模型超参得到更好的模型效果。详细信息参见[AutoDL Finetuner超参优化功能教程](../../docs/tutorial/autofinetune.md)
......@@ -194,4 +194,4 @@ python predict.py --checkpoint_dir $CKPT_DIR --max_seq_len 128
## 超参优化AutoDL Finetuner
PaddleHub还提供了超参优化(Hyperparameter Tuning)功能, 自动搜索最优模型超参得到更好的模型效果。详细信息参见[AutoDL Finetuner超参优化功能教程](../../tutorial/autofinetune.md)
PaddleHub还提供了超参优化(Hyperparameter Tuning)功能, 自动搜索最优模型超参得到更好的模型效果。详细信息参见[AutoDL Finetuner超参优化功能教程](../../docs/tutorial/autofinetune.md)
......@@ -211,4 +211,4 @@ python predict.py --checkpoint_dir $CKPT_DIR --max_seq_len 384 --batch_size=1
## 超参优化AutoDL Finetuner
PaddleHub还提供了超参优化(Hyperparameter Tuning)功能, 自动搜索最优模型超参得到更好的模型效果。详细信息参见[AutoDL Finetuner超参优化功能教程](../../tutorial/autofinetune.md)
PaddleHub还提供了超参优化(Hyperparameter Tuning)功能, 自动搜索最优模型超参得到更好的模型效果。详细信息参见[AutoDL Finetuner超参优化功能教程](../../docs/tutorial/autofinetune.md)
......@@ -192,4 +192,4 @@ python predict.py --checkpoint_dir $CKPT_DIR --max_seq_len 128
## 超参优化AutoDL Finetuner
PaddleHub还提供了超参优化(Hyperparameter Tuning)功能, 自动搜索最优模型超参得到更好的模型效果。详细信息参见[AutoDL Finetuner超参优化功能教程](../../tutorial/autofinetune.md)
PaddleHub还提供了超参优化(Hyperparameter Tuning)功能, 自动搜索最优模型超参得到更好的模型效果。详细信息参见[AutoDL Finetuner超参优化功能教程](../../docs/tutorial/autofinetune.md)
......@@ -186,4 +186,4 @@ python predict.py --checkpoint_dir $CKPT_DIR
## 超参优化AutoDL Finetuner
PaddleHub还提供了超参优化(Hyperparameter Tuning)功能, 自动搜索最优模型超参得到更好的模型效果。详细信息参见[AutoDL Finetuner超参优化功能教程](../../tutorial/autofinetune.md)
PaddleHub还提供了超参优化(Hyperparameter Tuning)功能, 自动搜索最优模型超参得到更好的模型效果。详细信息参见[AutoDL Finetuner超参优化功能教程](../../docs/tutorial/autofinetune.md)
......@@ -200,4 +200,4 @@ python predict.py --checkpoint_dir $CKPT_DIR --max_seq_len 128
## 超参优化AutoDL Finetuner
PaddleHub还提供了超参优化(Hyperparameter Tuning)功能, 自动搜索最优模型超参得到更好的模型效果。详细信息参见[AutoDL Finetuner超参优化功能教程](../../tutorial/autofinetune.md)
PaddleHub还提供了超参优化(Hyperparameter Tuning)功能, 自动搜索最优模型超参得到更好的模型效果。详细信息参见[AutoDL Finetuner超参优化功能教程](../../docs/tutorial/autofinetune.md)
......@@ -10,14 +10,14 @@ PaddleHub Serving主要包括利用Bert Service实现embedding服务化,以及
## Bert Service
`Bert Service`是基于[Paddle Serving](https://github.com/PaddlePaddle/Serving)框架的快速部署模型远程计算服务方案,可将embedding过程通过调用API接口的方式实现,减少了对机器资源的依赖。使用PaddleHub可在服务器上一键部署`Bert Service`服务,在另外的普通机器上通过客户端接口即可轻松的获取文本对应的embedding数据。
关于其具体信息和demo请参见[Bert Service](../../tutorial/bert_service.md)
关于其具体信息和demo请参见[Bert Service](../../docs/tutorial/bert_service.md)
该示例展示了利用`Bert Service`进行远程embedding服务化部署和在线预测,并获取文本embedding结果。
## 预训练模型一键服务部署
预训练模型一键服务部署是基于PaddleHub的预训练模型快速部署的服务化方案,能够将模型预测以API接口的方式实现。
关于预训练模型一键服务部署的具体信息请参见[PaddleHub Serving](../../tutorial/serving.md)
关于预训练模型一键服务部署的具体信息请参见[PaddleHub Serving](../../docs/tutorial/serving.md)
预训练模型一键服务部署包括以下示例:
......
......@@ -3,7 +3,7 @@
### 什么是Bert Service
`Bert Service`是基于[Paddle Serving](https://github.com/PaddlePaddle/Serving)框架的快速部署模型远程计算服务方案,可将embedding过程通过调用API接口的方式实现,减少了对机器资源的依赖。使用PaddleHub可在服务器上一键部署`Bert Service`服务,在另外的普通机器上通过客户端接口即可轻松的获取文本对应的embedding数据。
**NOTE:** 关于`Bert Service`的更多信息请参见[Bert Serving](../../../tutorial/bert_service.md)
**NOTE:** 关于`Bert Service`的更多信息请参见[Bert Serving](../../../docs/tutorial/bert_service.md)
## Demo——利用Bert Service部署ernie_tiny在线embedding服务
在这里,我们将展示一个实际场景中可能使用的demo,我们利用PaddleHub在一台GPU机器上部署`ernie_tiny`模型服务,并在另一台CPU机器上尝试访问,获取一首七言绝句的embedding。
......@@ -68,4 +68,4 @@ Paddle Inference Server exit successfully!
这样,我们就利用一台GPU机器就完成了`Bert Service`的部署,并利用另一台普通机器进行了测试,可见通过`Bert Service`能够方便地进行在线embedding服务的快速部署。
## 预训练模型一键服务部署
除了`Bert Service`外,PaddleHub Serving还具有预训练模型一键服务部署功能,能够将预训练模型快捷部署上线,对外提供可靠的在线预测服务,具体信息请参见[Module Serving](../../../tutorial/serving.md)
除了`Bert Service`外,PaddleHub Serving还具有预训练模型一键服务部署功能,能够将预训练模型快捷部署上线,对外提供可靠的在线预测服务,具体信息请参见[Module Serving](../../../docs/tutorial/serving.md)
......@@ -8,7 +8,7 @@ PaddleHub Serving是基于PaddleHub的一键模型服务部署工具,能够通
### 支持模型
目前PaddleHub Serving支持PaddleHub所有可直接用于预测的模型进行服务部署,包括`lac``senta_bilstm`等NLP类模型,以及`yolov3_darknett53_coco2017``vgg16_imagenet`等CV类模型,未来还将支持开发者使用PaddleHub Fine-tune API得到的模型用于快捷服务部署。
**NOTE:** 关于PaddleHub Serving一键服务部署的具体信息请参见[PaddleHub Serving](../../../tutorial/serving.md)
**NOTE:** 关于PaddleHub Serving一键服务部署的具体信息请参见[PaddleHub Serving](../../../docs/tutorial/serving.md)
## Demo
......@@ -47,4 +47,4 @@ PaddleHub Serving是基于PaddleHub的一键模型服务部署工具,能够通
  该示例展示了利用senta_lstm完成中文文本情感分析服务化部署和在线预测,获取文本的情感分析结果。
## Bert Service
除了预训练模型一键服务部署功能之外,PaddleHub Serving还具有`Bert Service`功能,支持ernie_tiny、bert等模型快速部署,对外提供可靠的在线embedding服务,具体信息请参见[Bert Service](../../../tutorial/bert_service.md)
除了预训练模型一键服务部署功能之外,PaddleHub Serving还具有`Bert Service`功能,支持ernie_tiny、bert等模型快速部署,对外提供可靠的在线embedding服务,具体信息请参见[Bert Service](../../../docs/tutorial/bert_service.md)
......@@ -217,4 +217,4 @@ python predict.py --checkpoint_dir $CKPT_DIR --max_seq_len 128
## 超参优化AutoDL Finetuner
PaddleHub还提供了超参优化(Hyperparameter Tuning)功能, 自动搜索最优模型超参得到更好的模型效果。详细信息参见[AutoDL Finetuner超参优化功能教程](../../tutorial/autofinetune.md)
PaddleHub还提供了超参优化(Hyperparameter Tuning)功能, 自动搜索最优模型超参得到更好的模型效果。详细信息参见[AutoDL Finetuner超参优化功能教程](../../docs/tutorial/autofinetune.md)
# Minimal makefile for Sphinx documentation
#
# You can set these variables from the command line, and also
# from the environment for the first two.
SPHINXOPTS ?=
SPHINXBUILD ?= sphinx-build
SOURCEDIR = .
BUILDDIR = _build
# Put it first so that "make" without argument is like "make help".
help:
@$(SPHINXBUILD) -M help "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O)
.PHONY: help Makefile
# Catch-all target: route all unknown targets to Sphinx using the new
# "make mode" option. $(O) is meant as a shortcut for $(SPHINXOPTS).
%: Makefile
@$(SPHINXBUILD) -M $@ "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O)
# Configuration file for the Sphinx documentation builder.
#
# This file only contains a selection of the most common options. For a full
# list see the documentation:
# http://www.sphinx-doc.org/en/master/config
# -- Path setup --------------------------------------------------------------
# If extensions (or modules to document with autodoc) are in another directory,
# add these directories to sys.path here. If the directory is relative to the
# documentation root, use os.path.abspath to make it absolute, like shown here.
#
from recommonmark.transform import AutoStructify
from recommonmark.parser import CommonMarkParser
import paddlehub as hub
import os
import sys
sys.path.insert(0, os.path.abspath('../paddlehub'))
# -- Project information -----------------------------------------------------
project = 'PaddleHub'
copyright = '2020, PaddlePaddle'
author = 'PaddlePaddle'
# The full version, including alpha/beta/rc tags
release = hub.version.hub_version
# -- General configuration ---------------------------------------------------
# Add any Sphinx extension module names here, as strings. They can be
# extensions coming with Sphinx (named 'sphinx.ext.*') or your custom
# ones.
extensions = [
'sphinx.ext.autodoc',
'sphinx.ext.mathjax',
'sphinx_markdown_tables',
'sphinx.ext.napoleon',
]
# Add any paths that contain templates here, relative to this directory.
templates_path = ['_templates']
# The suffix(es) of source filenames.
# You can specify multiple suffix as a list of string:
#
source_parsers = {'.md': CommonMarkParser}
source_suffix = ['.rst', '.md']
# The master toctree document.
master_doc = 'index'
# The language for content autogenerated by Sphinx. Refer to documentation
# for a list of supported languages.
#
# This is also used if you do content translation via gettext catalogs.
# Usually you set "language" from the command line for these cases.
language = "Simplified Chinese"
# List of patterns, relative to source directory, that match files and
# directories to ignore when looking for source files.
# This pattern also affects html_static_path and html_extra_path.
exclude_patterns = []
# -- Options for HTML output -------------------------------------------------
# The theme to use for HTML and HTML Help pages. See the documentation for
# a list of builtin themes.
#
html_theme = 'sphinx_rtd_theme'
# -- Extension configuration -------------------------------------------------
def setup(app):
app.add_config_value('recommonmark_config', {
'enable_eval_rst': True,
'enable_auto_toc_tree': False,
}, True)
app.add_transform(AutoStructify)
贡献代码
==================
PaddleHub非常欢迎贡献者,特别是代码和预训练模型贡献者。以下文档介绍了如何贡献代码和预训练模型。
.. toctree::
:maxdepth: 1
贡献代码<contri_pr.md>
贡献预训练模型<contri_pretrained_model>
\ No newline at end of file
# 贡献代码
PaddleHub非常欢迎贡献者。
首先,如果有什么不确定的事情,可随时提交问题或拉取请求。 不会有人因此而抱怨。我们会感激任何形式的贡献,不想用一堆规则来阻止这些贡献。
本文档包括了所有在贡献中需要注意的要点,会加快合并代码、解决问题的速度。
查看[概览](../overview.md)来初步了解。
下面是一些简单的贡献指南。
## 提交问题
当你使用PaddleHub遇到问题时,可以通过提交[issue](https://github.com/PaddlePaddle/PaddleHub/issues)来反馈。
在提出问题时,请说明以下事项:
* 按照问题模板的内容来填写问题细节,以便评审者查找问题原因。
* 出现问题的场景 (尽量详细,以便重现问题)。
* 错误和日志消息。
* 其它可能有用的细节信息。
## 提交新功能建议/BUG修复
* 在适配使用场景时,总会需要一些新的功能。 可以加入新功能的讨论,也可以直接提交新功能的Pull-Request请求。
* 在自己的 github 账户下 fork PaddleHub(https://github.com/PaddlePaddle/PaddleHub)。 在 fork 后, 利用git工具(add, commit, pull, push)提交PR。 然后就可以提交拉取请求了。
如何提PR,参考下列步骤:
### 第一步:将自己目录下PaddleHub远程仓库clone到本地:
```
https://github.com/USERNAME/PaddleHub
```
### 第二步:切换到远程分支develop
```
git checkout develop
```
### 第三步:基于远程分支develop新建本地分支new-feature
```
git checkout -b new-feature
```
### 第四步:使用pre-commit钩子
PaddleHub开发人员使用pre-commit工具来管理Git预提交钩子。它可以帮助我们格式化源代码Python,在提交(commit)前自动检查一些基本事宜(如每个文件只有一个 EOL,Git 中不要添加大文件等)。
pre-commit测试是 Travis-CI 中单元测试的一部分,不满足钩子的PR不能被提交到Paddle,首先安装并在当前目录运行它:
```shell
➜ pip install pre-commit
➜ pre-commit install
```
### 第五步:在new-feature分支上开发你的需求,提交你的更改
```
git commit -m "add new feature"
```
### 第六步:在准备发起Pull Request之前,需要同步原仓库(https://github.com/PaddlePaddle/PaddleHub )最新的代码。
通过 git remote 查看当前远程仓库的名字。
```shell
➜ git remote
origin
➜ git remote -v
origin https://github.com/USERNAME/PaddleHub (fetch)
origin https://github.com/USERNAME/PaddleHub (push)
```
这里 origin 是自己用户名下的PaddleHub,接下来创建一个原始PaddleHub仓库的远程主机,命名为 upstream。
```shell
➜ git remote add upstream https://github.com/PaddlePaddle/PaddleHub
➜ git remote
origin
upstream
```
获取 upstream 的最新代码并更新当前分支。
```shell
➜ git fetch upstream
➜ git pull upstream develop
```
### 第七步:推送本地分支new-feature到自己的PaddleHub库
```
➜ git push origin new-feature
```
这样你的PaddleHub库的new-feature分支包含了你的最新更改,点击上面的“pull request”就可以推送请求了。
如果评审人员给出了反馈需要继续修正代码,可以从第五步重新开始,这样所有的提交都会显示到同一个pull request中。
## 代码风格和命名约定
* NNI 遵循 [PEP8](https://www.python.org/dev/peps/pep-0008/) 的 Python 代码命名约定。在提交拉取请求时,请尽量遵循此规范。 可通过`flake8``pylint`的提示工具来帮助遵循规范。
## 文档
文档使用了 [sphinx](http://sphinx-doc.org/) 来生成,支持 [Markdown](https://guides.github.com/features/mastering-markdown/)[reStructuredText](http://www.sphinx-doc.org/en/master/usage/restructuredtext/basics.html) 格式。 所有文档都在 [docs/](../docs) 目录下。
* 在提交文档改动前,请先**在本地生成文档**`cd docs/ && make clean && make html`,然后,可以在 `docs/_build/html` 目录下找到所有生成的网页。 请认真分析生成日志中的**每个 WARNING**,这非常有可能是或**空连接**或其它问题。
* 需要链接时,尽量使用**相对路径**
# 贡献预训练模型
我们非常欢迎开发者贡献预训练模型到PaddleHub中,如果你想要贡献预训练模型,请提供以下资源:
## 模型
请提供相应的网络结构和参数文件,除了PaddlePaddle的模型外,我们也支持将其他主流框架的模型转换到PaddleHub中,包括:
* tensorflow
* pytorch
* mxnet
* caffe
* onnx
您可以直接使用 [**x2paddle**](https://github.com/PaddlePaddle/X2Paddle) 进行转换,也可以将相应模型提供给我们,由我们进行转换
## 相关代码
* 支持预测的模型,请提供相应的预测脚本以及测试样例
* 支持finetune的模型,请提供相应的finetune demo
## 相应的介绍资料
|资料|是否必选|
|-|-|
|模型结构|√|
|预训练的数据集|√|
|模型介绍文案|√|
|源代码链接||
|模型结构图||
|第三方库依赖||
**NOTE:**
* 为了保证使用体验,请确保模型在python 2.7/3.x下均可正常运行
# 常见问题
## 使用pip install paddlehub时提示`Could not find a version that satisfies the requirement paddlehub (from versions: )`
这可能是因为pip指向了一个pypi的镜像源,该镜像源没有及时同步paddlehub版本导致。
使用如下命令来安装:
```shell
$ pip install -i https://pypi.org/simple/ paddlehub
```
## 使用paddlehub时,提示`ModuleNotFoundError: No module named 'paddle'`
这是因为PaddleHub依赖于PaddlePaddle,用户需要自行安装合适的PaddlePaddle版本。
如果机器不支持GPU,那么使用如下命令来安装PaddlePaddle的CPU版本:
```shell
$ pip install paddlepaddle
```
如果机器支持GPU,则使用如下命令来安装PaddlePaddle的GPU版本:
```shell
$ pip install paddlepaddle-gpu
```
## 利用PaddleHub ernie/bert进行Finetune时,提示`paddle.fluid.core_avx.EnforceNotMet: Input ShapeTensor cannot be found in Op reshape2`等信息
这是因为ernie/bert module的创建时和此时运行环境中PaddlePaddle版本不对应。
首先将PaddleHub升级至最新版本,同时将ernie卸载。
```shell
$ pip install --upgrade paddlehub
$ hub uninstall ernie
```
## 使用paddlehub时,无法下载预置数据集、module的等现象
下载数据集、module等,PaddleHub要求机器可以访问外网。可以使用server_check()可以检查本地与远端PaddleHub-Server的连接状态,使用方法如下:
```python
import paddlehub
paddlehub.server_check()
# 如果可以连接远端PaddleHub-Server,则显示Request Hub-Server successfully.
# 如果无法连接远端PaddleHub-Server,则显示Request Hub-Server unsuccessfully.
```
## PaddleHub Module是否支持多线程,如何加快Module训练或预测的速度。
PaddleHub Module不支持多线程,可以通过使用GPU、加大batch_size等措施加速训练或者预测。
以下示例为加速LAC Module分词的方法:
```python
results = lac.lexical_analysis(data=inputs, use_gpu=True, batch_size=10)
```
## 如何获取输入句子经过ERNIE编码后的句子表示Embedding?
具体参考[BERT Services]()使用说明
## 在虚拟机Python2环境中使用hub命令报错“Illegal instruction”
请先排除numpy的版本问题:使用pip show numpy检查numpy的版本,如果是1.16.0~1.16.3会出现[numpy错误](https://github.com/numpy/numpy/issues/9532),请pip uinstall numpy后再用pip install numpy<1.17.0安装新版本的numpy。
## 如何修改PaddleHub的修改预训练模型存放路径?
通过设置系统环境变量HUB_HOME,修改预训练模型存放路径
#########################################
PaddleHub 文档
#########################################
.. toctree::
:caption: 目录
:maxdepth: 2
:titlesonly:
概述<overview>
安装<installation>
快速体验<quickstart>
教程<tutorial/tutorial_index>
API<reference/ref_index>
FAQ<faq>
社区贡献<contribution/contri_index.rst>
更新历史<release>
\ No newline at end of file
# 安装
## 环境依赖
* Python==2.7 or Python>=3.5 for Linux or Mac
**Python>=3.6 for Windows**
* PaddlePaddle>=1.5
除上述依赖外,PaddleHub的预训练模型和预置数据集需要连接服务端进行下载,请确保机器可以正常访问网络。若本地已存在相关的数据集和预训练模型,则可以离线运行PaddleHub。
**NOTE:** 使用PaddleHub下载数据集、预训练模型等,要求机器可以访问外网。可以使用`server_check()`可以检查本地与远端PaddleHub-Server的连接状态,使用方法如下:
```python
import paddlehub
paddlehub.server_check()
# 如果可以连接远端PaddleHub-Server,则显示Request Hub-Server successfully。
# 如果无法连接远端PaddleHub-Server,则显示Request Hub-Server unsuccessfully。
```
@ECHO OFF
pushd %~dp0
REM Command file for Sphinx documentation
if "%SPHINXBUILD%" == "" (
set SPHINXBUILD=sphinx-build
)
set SOURCEDIR=.
set BUILDDIR=_build
if "%1" == "" goto help
%SPHINXBUILD% >NUL 2>NUL
if errorlevel 9009 (
echo.
echo.The 'sphinx-build' command was not found. Make sure you have Sphinx
echo.installed, then set the SPHINXBUILD environment variable to point
echo.to the full path of the 'sphinx-build' executable. Alternatively you
echo.may add the Sphinx directory to PATH.
echo.
echo.If you don't have Sphinx installed, grab it from
echo.http://sphinx-doc.org/
exit /b 1
)
%SPHINXBUILD% -M %1 %SOURCEDIR% %BUILDDIR% %SPHINXOPTS% %O%
goto end
:help
%SPHINXBUILD% -M help %SOURCEDIR% %BUILDDIR% %SPHINXOPTS% %O%
:end
popd
欢迎使用**PaddleHub**
PaddleHub是飞桨预训练模型管理和迁移学习工具,通过PaddleHub开发者可以使用高质量的预训练模型结合Fine-tune API快速完成迁移学习到应用部署的全流程工作。其提供了飞桨生态下的高质量预训练模型,涵盖了图像分类、目标检测、词法分析、语义模型、情感分析、视频分类、图像生成、图像分割、文本审核、关键点检测等主流模型。更多模型详情请查看官网:https://www.paddlepaddle.org.cn/hub
基于预训练模型,PaddleHub支持以下功能:
* **[命令行工具](#命令行工具)**,通过Python API或命令行方便快捷地完成模型的搜索、下载、安装、升级、预测等功能
* **[迁移学习](#迁移学习)**,用户通过Fine-tune API,只需要少量代码即可完成自然语言处理和计算机视觉场景的深度迁移学习。
* **[服务化部署](#服务化部署paddlehub-serving)**,简单一行命令即可搭建属于自己的模型的API服务。
* **[超参优化](#超参优化autodl-finetuner)**,自动搜索最优超参,得到更好的模型效果。
![PaddleHub](./docs/imgs/paddlehub_figure.jpg)
# PaddleHub 特性
## 命令行工具
借鉴了Anaconda和PIP等软件包管理的理念,开发了PaddleHub命令行工具。可以方便快捷的完成模型的搜索、下载、安装、升级、预测等功能。
更加详细的使用说明可以参考
[PaddleHub命令行工具](tutorial/cmdintro.md)
目前的预训练模型覆盖了图像分类、语义模型、视频分类、图像生成、图像分割、文本审核、关键点检测等业界主流模型,更多PaddleHub已经发布的模型,请前往 https://www.paddlepaddle.org.cn/hub 查看。[快速体验](quickstart.md)通过命令行即可调用预训练模型进行预测。
## 迁移学习
迁移学习(Transfer Learning)通俗来讲,就是运用已有的知识来学习新的知识,核心是找到已有知识和新知识之间的相似性。PaddleHub提供了Fine-tune API,只需要少量代码即可完成深度学习模型在自然语言处理和计算机视觉场景下的迁移学习,可以在更短的时间完成模型的训练,同时模型具备更好的泛化能力。
![PaddleHub-Finetune](./docs/imgs/paddlehub_finetune.jpg)
<p align="center">
<img src="./imgs/paddlehub_finetune.gif" align="middle"
</p>
<p align='center'>
十行代码完成ERNIE工业级文本分类
</p>
PaddleHub提供了使用Finetune-API和预训练模型完成[文本分类](https://github.com/PaddlePaddle/PaddleHub/tree/release/v1.4/demo/text_classification)[序列标注](https://github.com/PaddlePaddle/PaddleHub/tree/release/v1.4/demo/sequence_labeling)[多标签分类](https://github.com/PaddlePaddle/PaddleHub/tree/release/v1.4/demo/multi_label_classification)[图像分类](https://github.com/PaddlePaddle/PaddleHub/tree/release/v1.4/demo/image_classification)[检索式问答任务](https://github.com/PaddlePaddle/PaddleHub/tree/release/v1.4/demo/qa_classification)[回归任务](https://github.com/PaddlePaddle/PaddleHub/tree/release/v1.4/demo/regression)[句子语义相似度计算](https://github.com/PaddlePaddle/PaddleHub/tree/release/v1.4/demo/sentence_similarity)[阅读理解任务](https://github.com/PaddlePaddle/PaddleHub/tree/release/v1.4/demo/reading_comprehension)等迁移任务的使用示例,详细参见[demo](https://github.com/PaddlePaddle/PaddleHub/tree/release/v1.4/demo)
* 场景化使用
PaddleHub在AI Studio上提供了IPython NoteBook形式的demo。用户可以直接在平台上在线体验,链接如下:
|预训练模型|任务类型|数据集|AIStudio链接|备注|
|-|-|-|-|-|
|ResNet|图像分类|猫狗数据集DogCat|[点击体验](https://aistudio.baidu.com/aistudio/projectdetail/147010)||
|ERNIE|文本分类|中文情感分类数据集ChnSentiCorp|[点击体验](https://aistudio.baidu.com/aistudio/projectdetail/147006)||
|ERNIE|文本分类|中文新闻分类数据集THUNEWS|[点击体验](https://aistudio.baidu.com/aistudio/projectdetail/221999)|本教程讲述了如何将自定义数据集加载,并利用Fine-tune API完成文本分类迁移学习。|
|ERNIE|序列标注|中文序列标注数据集MSRA_NER|[点击体验](https://aistudio.baidu.com/aistudio/projectdetail/147009)||
|ERNIE|序列标注|中文快递单数据集Express|[点击体验](https://aistudio.baidu.com/aistudio/projectdetail/184200)|本教程讲述了如何将自定义数据集加载,并利用Fine-tune API完成序列标注迁移学习。|
|ERNIE Tiny|文本分类|中文情感分类数据集ChnSentiCorp|[点击体验](https://aistudio.baidu.com/aistudio/projectdetail/186443)||
|Senta|文本分类|中文情感分类数据集ChnSentiCorp|[点击体验](https://aistudio.baidu.com/aistudio/projectdetail/216846)|本教程讲述了任何利用Senta和Fine-tune API完成情感分类迁移学习。|
|Senta|情感分析预测|N/A|[点击体验](https://aistudio.baidu.com/aistudio/projectdetail/215814)||
|LAC|词法分析|N/A|[点击体验](https://aistudio.baidu.com/aistudio/projectdetail/215711)||
|Ultra-Light-Fast-Generic-Face-Detector-1MB|人脸检测|N/A|[点击体验](https://aistudio.baidu.com/aistudio/projectdetail/215962)||
**NOTE:** [`飞桨PaddleHub`](https://aistudio.baidu.com/aistudio/personalcenter/thirdview/79927)是PaddleHub的官方账号。
关于PaddleHub快捷完成迁移学习,更多信息参考:
[API](reference)
[自定义数据集如何Fine-tune](tutorial/how_to_load_data.md)
[实现自定义迁移任务](tutorial/how_to_define_task.md)
[ULMFiT优化策略](tutorial/strategy_exp.md)
## 服务化部署PaddleHub Serving
PaddleHub Serving是基于PaddleHub的一键模型服务部署工具,能够通过简单的Hub命令行工具轻松启动一个模型预测在线服务。
其主要包括利用Bert Service实现embedding服务化,以及利用预测模型实现预训练模型预测服务化两大功能。未来还将支持开发者使用PaddleHub Fine-tune API的模型服务化。
关于服务化部署详细信息参见[PaddleHub Serving一键服务部署](tutorial/serving.md)
## 超参优化AutoDL Finetuner
深度学习模型往往包含许多的超参数,而这些超参数的取值对模型性能起着至关重要的作用。因为模型参数空间大,目前超参调整都是通过手动,依赖人工经验或者不断尝试,且不同模型、样本数据和场景下不尽相同,所以需要大量尝试,时间成本和资源成本非常浪费。PaddleHub AutoDL Finetuner可以实现自动调整超参数,使得模型性能达到最优水平。它通过多种调优的算法来搜索最优超参。
AutoDL Finetuner详细信息参见[PaddleHub超参优化](tutorial/autofinetune.md)
# 快速体验
安装PaddleHub成功后,执行命令[hub run](tutorial/cmdintro.md),可以快速体验PaddleHub无需代码、一键预测的命令行功能,如下三个示例:
使用[词法分析](http://www.paddlepaddle.org.cn/hub?filter=category&value=LexicalAnalysis)模型LAC进行分词
```shell
$ hub run lac --input_text "今天是个好日子"
[{'word': ['今天', '是', '个', '好日子'], 'tag': ['TIME', 'v', 'q', 'n']}]
```
使用[情感分析](http://www.paddlepaddle.org.cn/hub?filter=category&value=SentimentAnalysis)模型Senta对句子进行情感预测
```shell
$ hub run senta_bilstm --input_text "今天天气真好"
{'text': '今天天气真好', 'sentiment_label': 1, 'sentiment_key': 'positive', 'positive_probs': 0.9798, 'negative_probs': 0.0202}]
```
使用[目标检测](http://www.paddlepaddle.org.cn/hub?filter=category&value=ObjectDetection)模型Ultra-Light-Fast-Generic-Face-Detector-1MB对图片进行人脸识别
```shell
$ wget https://paddlehub.bj.bcebos.com/resources/test_image.jpg
$ hub run ultra_light_fast_generic_face_detector_1mb_640 --input_path test_image.jpg
```
![人脸识别结果](./imgs/face_detection_result.jpeg)
使用[图像分割](https://www.paddlepaddle.org.cn/hub?filter=en_category&value=ImageSegmentation)模型ace2p对图片进行tu
```shell
$ wget https://paddlehub.bj.bcebos.com/resources/test_image.jpg
$ hub run ace2p --input_path test_image.jpg
```
![图像分割结果](./imgs/img_seg_result.jpeg)
除了上述三类模型外,PaddleHub还发布了图像分类、语义模型、视频分类、图像生成、图像分割、文本审核、关键点检测等业界主流模型,更多PaddleHub已经发布的模型,请前往 https://www.paddlepaddle.org.cn/hub 查看
## hub.config
在PaddleHub中,RunConfig代表了在对[Task](./task)进行Fine-tune时的运行配置。包括运行的epoch次数、batch的大小、是否使用GPU训练等。
### Class `hub.finetune.config.RunConfig`
```python
hub.RunConfig(
log_interval=10,
eval_interval=100,
use_pyreader=False,
use_data_parallel=False,
save_ckpt_interval=None,
use_cuda=False,
checkpoint_dir=None,
num_epoch=10,
batch_size=None,
enable_memory_optim=False,
strategy=None)`
```
**参数:**
* `log_interval`: 打印训练日志的周期,默认为10。
* `eval_interval`: 进行评估的周期,默认为100。
* `use_pyreader`: 是否使用pyreader,默认False。
* `use_data_parallel`: 是否使用并行计算,默认False。打开该功能依赖nccl库。
* `save_ckpt_interval`: 保存checkpoint的周期,默认为None。
* `use_cuda`: 是否使用GPU训练和评估,默认为False。
* `checkpoint_dir`: checkpoint的保存目录,默认为None,此时会在工作目录下根据时间戳生成一个临时目录。
* `num_epoch`: 运行的epoch次数,默认为10。
* `batch_size`: batch大小,默认为None。
* `enable_memory_optim`: 是否进行内存优化,默认为False。
* `strategy`: finetune的策略。默认为None,此时会使用DefaultFinetuneStrategy策略。
**返回**
`RunConfig`
**示例**
```python
import paddlehub as hub
config = hub.RunConfig(
use_cuda=True,
num_epoch=10,
batch_size=32)
```
#### `log_interval`
获取RunConfig设置的log_interval属性
**示例**
```python
import paddlehub as hub
config = hub.RunConfig()
log_interval = config.log_interval()
```
#### `eval_interval`
获取RunConfig设置的eval_interval属性
**示例**
```python
import paddlehub as hub
config = hub.RunConfig()
eval_interval = config.eval_interval()
```
#### `use_pyreader`
获取RunConfig设置的use_pyreader属性
**示例**
```python
import paddlehub as hub
config = hub.RunConfig()
use_pyreader = config.use_pyreader()
```
#### `use_data_parallel`
获取RunConfig设置的use_data_parallel属性
**示例**
```python
import paddlehub as hub
config = hub.RunConfig()
use_data_parallel = config.use_data_parallel()
```
#### `save_ckpt_interval`
获取RunConfig设置的save_ckpt_interval属性
**示例**
```python
import paddlehub as hub
config = hub.RunConfig()
save_ckpt_interval = config.save_ckpt_interval()
```
#### `use_cuda`
获取RunConfig设置的use_cuda属性
**示例**
```python
import paddlehub as hub
config = hub.RunConfig()
use_cuda = config.use_cuda()
```
#### `checkpoint_dir`
获取RunConfig设置的checkpoint_dir属性
**示例**
```python
import paddlehub as hub
config = hub.RunConfig()
checkpoint_dir = config.checkpoint_dir()
```
#### `num_epoch`
获取RunConfig设置的num_epoch属性
**示例**
```python
import paddlehub as hub
config = hub.RunConfig()
num_epoch = config.num_epoch()
```
#### `batch_size`
获取RunConfig设置的batch_size属性
**示例**
```python
import paddlehub as hub
config = hub.RunConfig()
batch_size = config.batch_size()
```
#### `strategy`
获取RunConfig设置的strategy属性
**示例**
```python
import paddlehub as hub
config = hub.RunConfig()
strategy = config.strategy()
```
#### `enable_memory_optim`
获取RunConfig设置的enable_memory_optim属性
**示例**
```python
import paddlehub as hub
config = hub.RunConfig()
enable_memory_optim = config.enable_memory_optim()
```
**若您想在自定义数据集上完成Fine-tune,请查看[PaddleHub适配自定义数据完成Fine-tune](../tutorial/how_to_load_data.md)**
## hub.dataset
### Class `hub.dataset.ChnSentiCorp`
ChnSentiCorp 是中文情感分析数据集,其目标是判断一段文本的情感态度。
**示例**
```python
import paddlehub as hub
dataset = hub.dataset.ChnSentiCorp()
```
数据集样例
```text
label text_a
1 选择珠江花园的原因就是方便,有电动扶梯直接到达海边,周围餐馆、食廊、商场、超市、摊位一应俱全。酒店装修一般,但还算整洁。 泳池在大堂的屋顶,因此很小,>不过女儿倒是喜欢。 包的早餐是西式的,还算丰富。 服务吗,一般
1 15.4寸笔记本的键盘确实爽,基本跟台式机差不多了,蛮喜欢数字小键盘,输数字特方便,样子也很美观,做工也相当不错
0 房间太小。其他的都一般。。。。。。。。。
...
```
以上类别“0”表示反对态度,“1”表示支持态度。每个字段以tab键分隔。
### Class `hub.dataset.LCQMC`
LCQMC 是哈尔滨工业大学在自然语言处理国际顶会 COLING2018 构建的问答匹配中文数据集,其目标是判断两个问题的语义是否相同。
**示例**
```python
import paddlehub as hub
dataset = hub.dataset.LCQMC()
```
数据集样例
```text
text_a text_b label
喜欢打篮球的男生喜欢什么样的女生 爱打篮球的男生喜欢什么样的女生 1
我手机丢了,我想换个手机 我想买个新手机,求推荐 1
大家觉得她好看吗 大家觉得跑男好看吗? 0
...
```
以上类别“0”表示语义相同,“1”表示语义相反。每个字段以tab键分隔。
### Class `hub.dataset.NLPCC_DPQA`
NLPCC_DPQA 是由国际自然语言处理和中文计算会议NLPCC于2016年举办的评测任务,其目标是选择能够回答问题的答案。
**示例**
```python
import paddlehub as hub
dataset = hub.dataset.NLPCC_DPQA()
```
数据集样例
```text
qid text_a text_b label
0 黑缘粗角肖叶甲触角有多大? 触角近于体长之半,第1节粗大,棒状,第2节短,椭圆形,3、4两节细长,稍短于第5节,第5节基细端粗,末端6节明显粗大。 1
0 黑缘粗角肖叶甲触角有多大? 前胸前侧片前缘直;前胸后侧片具粗大刻点。 0
0 黑缘粗角肖叶甲触角有多大? 足粗壮;胫节具纵脊,外端角向外延伸,呈弯角状;爪具附齿。 0
1 暮光闪闪的姐姐是谁? 暮光闪闪是一匹雌性独角兽,后来在神秘魔法的影响下变成了空角兽(公主),她是《我的小马驹:友情是魔法》(英文名:My Little Pony:Friendship is Magic)中的主角之一。 0
1 暮光闪闪的姐姐是谁? 她是银甲闪闪(Shining Armor)的妹妹,同时也是韵律公主(Princess Cadance)的小姑子。 1
...
```
以上qid表示问题的序号,类别“0”表示相应问题的错误答案,类别“1”表示相应问题的正确答案。每个字段以tab键分隔。
### Class `hub.dataset.MSRA_NER`
MSRA-NER(SIGHAN 2006) 数据集由微软亚研院发布,其目标是命名实体识别,是指识别中文文本中具有特定意义的实体,主要包括人名、地名、机构名等。
**示例**
```python
import paddlehub as hub
dataset = hub.dataset.MSRA-NER()
```
数据集样例
```text
text_a label
海^B钓^B比^B赛^B地^B点^B在^B厦^B门^B与^B金^B门^B之^B间^B的^B海^B域^B。 O^BO^BO^BO^BO^BO^BO^BB-LOC^BI-LOC^BO^BB-LOC^BI-LOC^BO^BO^BO^BO^BO^BO
这^B座^B依^B山^B傍^B水^B的^B博^B物^B馆^B由^B国^B内^B一^B流^B的^B设^B计^B师^B主^B持^B设^B计^B,^B整^B个^B建^B筑^B群^B精^B美^B而^B恢^B宏^B。 O^BO^BO^BO^BO^BO^BO^BO^BO^BO^BO^BO^BO^BO^BO^BO^BO^BO^BO^BO^BO^BO^BO^BO^BO^BO^BO^BO^BO^BO^BO^BO^BO^BO^BO
但^B作^B为^B一^B个^B共^B产^B党^B员^B、^B人^B民^B公^B仆^B,^B应^B当^B胸^B怀^B宽^B阔^B,^B真^B正^B做^B到^B“^B先^B天^B下^B之^B忧^B而^B忧^B,^B后^B天^B下^B之^B乐^B而^B乐^B”^B,^B淡^B化^B个^B人^B的^B名^B利^B得^B失^B和^B宠^B辱^B悲^B喜^B,^B把^B改^B革^B大^B业^B摆^B在^B首^B位^B,^B这^B样^B才^B能^B超^B越^B自^B我^B,^B摆^B脱
^B世^B俗^B,^B有^B所^B作^B为^B。 O^BO^BO^BO^BO^BO^BO^BO^BO^BO^BO^BO^BO^BO^BO^BO^BO^BO^BO^BO^BO^BO^BO^BO^BO^BO^BO^BO^BO^BO^BO^BO^BO^BO^BO^BO^BO^BO^BO^BO^BO^BO^BO^BO^BO^BO^BO^BO^BO^BO^BO^BO^BO^BO^BO^BO^BO^BO^BO^BO^BO^BO^BO^BO^BO^BO^BO^BO^BO^BO^BO^BO^BO^BO^BO^BO^BO^BO^BO^BO^BO^BO^BO^BO^BO^BO^BO^BO
...
```
以上label是针对每一个字的标签,并且一句话中的每个字以不可见字符“\002”分隔(如上述“^B”)。每个字段以tab键分隔。标注规则如下表:
| 标签 | 定义 |
| ---- | ---- |
| B-LOC | 地点的起始位置 |
| I-LOC | 地点的中间或结束位置 |
| B-PER | 人名的起始位置 |
| I-PER | 人名的中间或结束位置 |
| B-ORG | 机构名的起始位置 |
| I-ORG | 机构名的中间或者结束位置 |
| O | 不关注的字 |
### Class `hub.dataset.Toxic`
Toxic 是英文多标签分类数据集,其目标是将一段话打上6个标签,toxic(恶意),severetoxic(穷凶极恶),obscene(猥琐),threat(恐吓),insult(侮辱),identityhate(种族歧视),这些标签并不是互斥的。即这段话可以打上多个标签。
**示例**
```python
import paddlehub as hub
dataset = hub.dataset.Toxic()
```
数据集样例
```text
id,comment_text,toxic,severe_toxic,obscene,threat,insult,identity_hate
0000997932d777bf,"Explanation
Why the edits made under my username Hardcore Metallica Fan were reverted? They weren't vandalisms, just closure on some GAs after I voted at New York Dolls FAC. And please don't remove the template from the talk page since I'm retired now.89.205.38.27",0,0,0,0,0,0
000103f0d9cfb60f,"D'aww! He matches this background colour I'm seemingly stuck with. Thanks. (talk) 21:51, January 11, 2016 (UTC)",0,0,0,0,0,0
0002bcb3da6cb337,COCKSUCKER BEFORE YOU PISS AROUND ON MY WORK,1,1,1,0,1,0
...
```
每个字段以","分隔。第一列表示样本ID,第二列表示样本文本数据,第3-8列表示相应样本是否含有对应的标签(0表示没有对应列的标签,1表示有对应列的标签)。如示例数据中的第三条数据,表示文本"COCKSUCKER BEFORE YOU PISS AROUND ON MY WORK"有标签toxic、severe_toxic、obscene和insult。
### Class `hub.dataset.SQUAD`
SQuAD 是英文阅读理解数据集,给定一个段落文本以及一个问题,其目标是在该段落中找到问题的答案位置。
**示例**
```python
import paddlehub as hub
dataset = hub.dataset.SQUAD()
```
关于该数据集详细信息可以参见[SQuAD官网介绍](https://rajpurkar.github.io/SQuAD-explorer/)
### Class `hub.dataset.GLUE`
GLUE是一个英文数据集集合,包含9项自然语言理解任务数据集:
- 文本分类任务数据集CoLA,其目标是给定一个句子,判断其语法正确性。
- 情感分析任务数据集吧SST-2,其目标是给定一个句子,判断其情感极性。
- 句子对分类任务数据集MRPC,其目标是给定两个句子,判断它们是否具有相同的语义关系。
- 回归任务数据集STS-B,其目标是给定两个句子,计算它们的语义相似性。
- 句子对分类任务数据集QQP,其目标是给定两个句子,判断它们是否具有相同的语义关系。
- 文本推理任务数据集MNLI,其目标是给定前提与假设,判断它们的逻辑关系(“矛盾“ / “中立” / “蕴含”)。该数据集又分为“匹配”与“不匹配”两个版本,“匹配”与“不匹配”指的是训练集与测试集的数据来源是否一致,是否属于相同领域风格的文本。在PaddleHub中,您可以通过“MNLI_m”和"MNLI_mm"来指定不同的版本
- 问题推理任务QNLI,其目标是给定问题,判断它的回答是否正确。
- 文本蕴含任务RTE,其目标是给定两个句子,判断它们是否具有蕴含关系。
- 文本蕴含任务WNLI,其目标是给定两个句子,判断它们是否具有蕴含关系。由于该数据集存在一些问题,我们暂时没有实现该数据集。
**示例**
```python
import paddlehub as hub
dataset = hub.dataset.GLUE(sub_dataset='SST-2')
MNLI_Matched = hub.dataset.GLUE(sub_dataset='MNLI_m')
MNLI_MisMatched = hub.dataset.GLUE(sub_dataset='MNLI_mm')
```
关于该数据集详细信息可以参见[GLUE官网介绍](https://gluebenchmark.com/)
### Class `hub.dataset.XNLI`
XNLI是一个跨语言自然语言推理数据集,其目标是给定前提与假设,判断它们的逻辑关系(“矛盾“ / “中立” / “蕴含”)。XNLI的验证集与测试集包含15种语言版本,在BERT与ERNIE中,它的训练集来自英文数据集MNLI,将其翻译至对应的语言版本即可。我们采用了相同的数据集方案,并划分了15种语言的数据集:
<table>
<thead>
</thead>
<tbody><tr>
<td align="center">ar - Arabic</td>
<td align="center">bg - Bulgarian</td>
<td align="center">de - German</td>
</tr>
<tr>
<td align="center">el - Greek</td>
<td align="center">en - English</td>
<td align="center">es - Spanish </td>
</tr>
<tr>
<td align="center">fr - French </td>
<td align="center">hi - Hindi</td>
<td align="center">ru - Russian</td>
</tr>
<tr>
<td align="center">sw - Swahili </td>
<td align="center">th - Thai</td>
<td align="center">tr - Turkish</td>
</tr>
<tr>
<td align="center">ur - Urdu </td>
<td align="center">vi - Vietnamese</td>
<td align="center">zh - Chinese</td>
</tr>
</tbody></table>
**示例**
```python
import paddlehub as hub
dataset = hub.dataset.XNLI(language='zh')
```
以中文数据集为例:
```text
premise hypo label
从 概念 上 看 , 奶油 收入 有 两 个 基本 方面 产品 和 地理 . 产品 和 地理 是 什么 使 奶油 抹 霜 工作 . neutral
我们 的 一个 号码 会 非常 详细 地 执行 你 的 指示 我 团队 的 一个 成员 将 非常 精确 地 执行 你 的 命令 entailment
男 女 同性恋 . 异性恋者 contradiction
```
每个字段以tab键分隔。类别netral表示中立,类别entailment表示蕴含,类别contradiction表示矛盾。
### Class `hub.dataset.TNews`
TNews是今日头条中文新闻(短文本)分类数据集,其目标是为短新闻进行分类。该数据集总共15个类别,包括 "news_story", "news_culture", "news_entertainment", "news_sports", "104": "news_finance", "news_house", "news_car", "news_edu", "news_tech", "news_military", "news_travel", "news_world", "stock", "news_agriculture", "news_game"。
**示例**
```python
import paddlehub as hub
dataset = hub.dataset.TNews()
```
数据集样例:
```text
6552277613866385923_!_104_!_news_finance_!_股票中的突破形态_!_股票
6553229876915077646_!_102_!_news_entertainment_!_他是最帅的古装男神,10国语言六门武术,演技在线却常演配角!_!_三生三世十里桃花,张智尧,杨门女将之女儿当自强,陆
小凤,印象深刻,陆小凤传奇,杨宗保,花满楼,古剑奇谭
6553551207028228622_!_102_!_news_entertainment_!_陈伟霆和黄晓明真的有差别,难怪baby会选择黄晓明_!_陈伟霆,黄晓明,粉丝
```
每个字段以“\_!\_”进行分隔,第一列表示数据ID,第二列表示类别ID, 第三列表示类别,第四列表示短新闻文本,第五列表示文本关键词。
### Class `hub.dataset.INews`
INews是一个互联网情感分析任务,其目标是判断中文长文本的情感倾向,数据集总共分3类(0,1,2)。
**示例**
```python
import paddlehub as hub
dataset = hub.dataset.INews()
```
数据集样例:
```text
label_!_id_!_title_!_content
1_!_bbf2e8a4824149bea36e703bbe8b0795_!_问大家一下,g20峰会之后,杭州的外国人是不是一下子多起来了_!_问大家一下,g20峰会之后,杭州的外国人是不是一下子多起来了,尤其是在杭州定居的外国人?
```
每个字段以“\_!\_”进行分隔,第一列表示类别,第二列表示数据ID, 第三列表示新闻标题,第四列表示新闻文本。
### Class `hub.dataset.DRCD`
DRCD是台达阅读理解数据集,属于通用领域繁体中文机器阅读理解数据集。
**示例**
```python
import paddlehub as hub
dataset = hub.dataset.DRCD()
```
数据格式和SQuAD相同,关于该数据集详细信息参见[DRCD](https://github.com/DRCKnowledgeTeam/DRCD)
### Class `hub.dataset.CMRC2018`
CMRC2018聚焦基于篇章片段抽取的中文阅读理解,给定篇章、问题,其目标是从篇章中抽取出连续片段作为答案。
**示例**
```python
import paddlehub as hub
dataset = hub.dataset.CMRC2018()
```
数据格式和SQuAD相同,关于该数据集详细信息参见[CMRC](https://hfl-rc.github.io/cmrc2018/)
### Class `hub.dataset.BQ`
BQ是一个智能客服中文问句匹配数据集,该数据集是自动问答系统语料,共有120,000对句子对,并标注了句子对相似度值。数据中存在错别字、语法不规范等问题,但更加贴近工业场景。
**示例**
```python
import paddlehub as hub
dataset = hub.dataset.BQ()
```
数据集样例:
```text
请问一天是否都是限定只能转入或转出都是五万。 微众多少可以赎回短期理财 0
微粒咨询电话号码多少 你们的人工客服电话是多少 1
已经在银行换了新预留号码。 我现在换了电话号码,这个需要更换吗 1
```
每个字段以tab键分隔,第1,2列表示两个文本。第3列表示类别(0或1,0表示两个文本不相似,1表示两个文本相似)。
### Class `hub.dataset.IFLYTEK`
IFLYTEK是一个中文长文本分类数据集,该数据集共有1.7万多条关于app应用描述的长文本标注数据,包含和日常生活相关的各类应用主题,共119个类别:"打车":0,"地图导航":1,"免费WIFI":2,"租车":3,….,"女性":115,"经营":116,"收款":117,"其他":118(分别用0-118表示)。
**示例**
```python
import paddlehub as hub
dataset = hub.dataset.IFLYTEK()
```
数据集样例:
```text
70_!_随意发SendAnywherePro是一款文件分享工具,你可以快速的将分享手机中的照片、视频、联系人、应用、文件、文件夹等任何文件分享给其他人,可以在手机之前发送或接收,也可以通过官网www.sendweb.com不许要注册账号,只需输入一次key即可接收。
```
每个字段以“\_!\_”键分隔,第1列表示类别ID。第2列表示文本数据。
### Class `hub.dataset.THUCNEWS`
THUCNEWS是一个中文长文本分类数据集,该数据集共有4万多条中文新闻长文本标注数据,共14个类别,包括"体育", "娱乐", "家居", "彩票", "房产", "教育", "时尚", "时政", "星座", "游戏", "社会", "科技", "股票", "财经"。
**示例**
```python
import paddlehub as hub
dataset = hub.dataset.THUCNEWS()
```
数据集样例:
```text
0_!_体育_!_97498.txt_!_林书豪拒绝中国篮协邀请 将随中华台北征战亚锦赛  信息时报讯 (记者 冯爱军) 中国篮协比中华台北篮协抢先一步了。据台湾媒体报道,刚刚成功签...倘若顺利,最快明年东亚区资格赛与亚锦赛就有机会看到林书豪穿上中华台北队球衣。”
```
每个字段以“\_!\_”键分隔,第1列表示类别ID,第2列表示类别,第3列表示文本数据。
### Class `hub.dataset.DogCatDataset`
DOGCAT是由Kaggle提供的数据集,用于图像二分类,其目标是判断一张图片是猫或是狗。
**示例**
```python
import paddlehub as hub
dataset = hub.dataset.DogCatDataset()
```
数据集样例:
```text
dog/4122.jpg 1
dog/6337.jpg 1
cat/3853.jpg 0
cat/5831.jpg 0
```
每个字段以空格键分隔。第一列表示图片所在路径,第二列表示图片类别,1表示属于,0表示不属于。
### Class `hub.dataset.Food101`
FOOD101 是由Kaggle提供的数据集,含有101种类别,其目标是判断一张图片属于101种类别中的哪一种类别。
**示例**
```python
import paddlehub as hub
dataset = hub.dataset.Food101()
```
关于该数据集详细信息参见[Kaggle Food101](https://www.kaggle.com/dansbecker/food-101)
### Class `hub.dataset.Indoor67`
INDOOR数据集是由麻省理工学院发布,其包含67种室内场景,其目标是识别一张室内图片的场景类别。
**示例**
```python
import paddlehub as hub
dataset = hub.dataset.Indoor67()
```
关于该数据集详细信息参见[Indoor67](http://web.mit.edu/torralba/www/indoor.html)
### Class `hub.dataset.Flowers`
Flowers数据集是是公开花卉数据集,数据集有5种类型,包括"roses","tulips","daisy","sunflowers","dandelion"。
**示例**
```python
import paddlehub as hub
dataset = hub.dataset.Flowers()
```
数据集样例:
```text
dandelion/7148085703_b9e8bcd6ca_n.jpg 4
roses/5206847130_ee4bf0e4de_n.jpg 0
tulips/8454707381_453b4862eb_m.jpg 1
```
每个字段以空格键分隔。第一列表示图片所在路径,第二列表示图片类别ID。
### Class `hub.dataset.StanfordDogs`
StanfordDogS数据集是斯坦福大学发布,其包含120个种类的狗,用于做图像分类。
**示例**
```python
import paddlehub as hub
dataset = hub.dataset.StanfordDogs()
```
关于该数据集详细信息参考[StanfordDogs](http://vision.stanford.edu/aditya86/ImageNetDogs/main.html)
参考
==================
以下介绍了PaddleHub 数据集(dataset)、优化策略(strategy)、运行配置(config)、迁移任务(task)等API介绍。
.. toctree::
:maxdepth: 1
hub.dataset<dataset>
hub.strategy<strategy>
hub.config<config>
hub.task<task_index>
\ No newline at end of file
## hub.strategy
在PaddleHub中,Strategy类封装了一系列适用于迁移学习的Fine-tune策略。Strategy包含了对预训练参数使用什么学习率变化策略,使用哪种类型的优化器,使用什么类型的正则化等。
### Class `hub.finetune.strategy.AdamWeightDecayStrategy`
```python
hub.AdamWeightDecayStrategy(
learning_rate=1e-4,
lr_scheduler="linear_decay",
warmup_proportion=0.0,
weight_decay=0.01,
optimizer_name="adam")
```
基于Adam优化器的学习率衰减策略
**参数**
* learning_rate: 全局学习率,默认为1e-4
* lr_scheduler: 学习率调度方法,默认为"linear_decay"
* warmup_proportion: warmup所占比重
* weight_decay: 学习率衰减率
* optimizer_name: 优化器名称,默认为adam
**返回**
`AdamWeightDecayStrategy`
**示例**
```python
...
strategy = hub.AdamWeightDecayStrategy()
config = hub.RunConfig(
use_cuda=True,
num_epoch=10,
batch_size=32,
checkpoint_dir="hub_finetune_ckpt",
strategy=strategy)
```
### Class `hub.finetune.strategy.DefaultFinetuneStrategy`
```python
hub.DefaultFinetuneStrategy(
learning_rate=1e-4,
optimizer_name="adam",
regularization_coeff=1e-3)
```
默认的Finetune策略,该策略会对预训练参数增加L2正则作为惩罚因子
**参数**
* learning_rate: 全局学习率。默认为1e-4
* optimizer_name: 优化器名称。默认adam
* regularization_coeff: 正则化的λ参数。默认为1e-3
**返回**
`DefaultFinetuneStrategy`
**示例**
```python
...
strategy = hub.DefaultFinetuneStrategy()
config = hub.RunConfig(
use_cuda=True,
num_epoch=10,
batch_size=32,
checkpoint_dir="hub_finetune_ckpt",
strategy=strategy)
```
### Class `hub.finetune.strategy.L2SPFinetuneStrategy`
```python
hub.L2SPFinetuneStrategy(
learning_rate=1e-4,
optimizer_name="adam",
regularization_coeff=1e-3)
```
使用L2SP正则作为惩罚因子的Finetune策略
**参数**
* learning_rate: 全局学习率。默认为1e-4
* optimizer_name: 优化器名称。默认为adam
* regularization_coeff: 正则化的λ参数。默认为1e-3
**返回**
`L2SPFinetuneStrategy`
**示例**
```python
...
strategy = hub.L2SPFinetuneStrategy()
config = hub.RunConfig(
use_cuda=True,
num_epoch=10,
batch_size=32,
checkpoint_dir="hub_finetune_ckpt",
strategy=strategy)
```
### Class `hub.finetune.strategy.ULMFiTStrategy`
```python
hub.ULMFiTStrategy(
learning_rate=1e-4,
optimizer_name="adam",
cut_fraction=0.1,
ratio=32,
dis_blocks=3,
factor=2.6,
frz_blocks=3)
```
该策略实现了[ULMFiT](https://arxiv.org/abs/1801.06146)论文中提出的三种策略:Slanted triangular learning rates, Discriminative fine-tuning, Gradual unfreezing。
- Slanted triangular learning rates是一种学习率先上升再下降的策略,如下图所示:
<div align=center><img src="https://github.com/PaddlePaddle/PaddleHub/wiki/images/slanted.png" width="50%" height="50%"></div>
- Discriminative fine-tuning是一种学习率逐层递减的策略,通过该策略可以减缓底层的更新速度。
- Gradual unfreezing是一种逐层解冻的策略,通过该策略可以优先更新上层,再慢慢解冻下层参与更新。
**参数**
* learning_rate: 全局学习率。默认为1e-4。
* optimizer_name: 优化器名称。默认为adam。
* cut_fraction: 设置Slanted triangular learning rates学习率上升的步数在整个训练总步数中的比例,对应论文中Slanted triangular learning rates中的cut_frac。默认为0.1,如果设置为0,则不采用Slanted triangular learning rates。
* ratio: 设置Slanted triangular learning rates下降的最小学习率与上升的最大学习率的比例关系,默认为32,表示最小学习率是最大学习率的1/32。
* dis_blocks: 设置 Discriminative fine-tuning中的块数。由于预训练模型中没有记录op的层数,Paddlehub通过op的前后关系推测op所在的层次,这会导致诸如LSTM这类计算单元的op会被当作是不同层的op。为了不使层次划分太细,我们将层次进行了分块,用块的概念代替原论文中层的概念,通过设置dis_blocks即可设置块的个数。默认为3,如果设置为0,则不采用Discriminative fine-tuning。
* factor: 设置Discriminative fine-tuning的衰减率。默认为2.6,表示下一层的学习率是上一层的1/2.6。
* frz_blocks: 设置Gradual unfreezing中的块数。块的概念同“dis_blocks”中介绍的概念。
**返回**
`ULMFiTStrategy`
**示例**
```python
...
strategy = hub.ULMFiTStrategy()
config = hub.RunConfig(
use_cuda=True,
num_epoch=10,
batch_size=32,
checkpoint_dir="hub_finetune_ckpt",
strategy=strategy)
```
### Class `hub.finetune.strategy.CombinedStrategy`
```python
hub.CombinedStrategy(
optimizer_name="adam",
learning_rate=1e-4,
scheduler=None,
regularization=None,
clip=None)
```
Paddlehub中的基类策略,上文的所有策略都基于该策略,通过该策略可以设置所有策略参数。
**参数**
* optimizer_name: 优化器名称,默认为adam。
* learning_rate: 全局学习率,默认为1e-4。
* scheduler: 学习率调度方法,默认为None,此时不改变任何默认学习率调度方法参数,不采取任何学习率调度方法,即:
```python
scheduler = {
"warmup": 0.0,
"linear_decay": {
"start_point": 1.0,
"end_learning_rate": 0.0,
},
"noam_decay": False,
"discriminative": {
"blocks": 0,
"factor": 2.6
},
"gradual_unfreeze": 0,
"slanted_triangle": {
"cut_fraction": 0.0,
"ratio": 32
}
}
```
* regularization: 正则方法,默认为None,此时不改变任何默认正则方法参数,不采取任何正则方法,即:
```python
regularization = {
"L2": 0.0,
"L2SP": 0.0,
"weight_decay": 0.0,
}
```
* clip: 梯度裁剪方法,默认为None,此时不改变任何默认正则方法参数,不采取任何梯度裁剪方法,即:
```python
clip = {
"GlobalNorm": 0.0,
"Norm": 0.0
}
```
**返回**
`CombinedStrategy`
**示例**
```python
...
# Parameters not specified will remain default
scheduler = {
"discriminative": {
"blocks": 3,
"factor": 2.6
}
}
# Parameters not specified will remain default
regularization = {"L2": 1e-3}
# Parameters not specified will remain default
clip = {"GlobalNorm": 1.0}
strategy = hub.CombinedStrategy(
scheduler = scheduler,
regularization = regularization,
clip = clip
)
config = hub.RunConfig(
use_cuda=True,
num_epoch=10,
batch_size=32,
checkpoint_dir="hub_finetune_ckpt",
strategy=strategy)
```
# Class `hub.BaseTask`
基础的Task类,封装了finetune、eval、finetune_and_eval、predict等基础接口以及事件的回调机制。该类无法直接使用,需要继承实现特定接口
```python
hub.BaseTask(
feed_list,
data_reader,
main_program=None,
startup_program=None,
config=None,
metrics_choice="default"):
```
**参数**
* feed_list (list): 待feed变量的名字列表
* data_reader: 提供数据的Reader
* main_program (fluid.Program): 存储了模型计算图的Program,如果未提供,则使用fluid.default_main_program()
* startup_program (fluid.Program): 存储了模型参数初始化op的Program,如果未提供,则使用fluid.default_startup_program()
* config ([RunConfig](../config.md)): 运行配置
* metric_choices : 任务评估指标,默认为"acc"。metrics_choices支持训练过程中同时评估多个指标,作为最佳模型的判断依据,例如["matthews", "acc"],"matthews"将作为主指标,为最佳模型的判断依据;
## 基本概念
### phase / 执行状态
Task可以有不同的执行状态(训练/测试/预测),在不同状态下所获取到的属性会有区别,例如,当处于训练状态时,通过task获取到的feed_list除了输入特征外,还包括输入label,而处于预测状态时,所获取到的feed_list只包括输入特征
Task通过phase属性来区分不同的状态,对应的关系如下:
|phase|状态|
|-|-|
|train|训练|
|val, dev, test|评估|
|predict, inference|预测|
### env / 执行环境
Task中的每个执行状态,都有一个对应的执行环境env([RunEnv])用于保存该状态下的属性。当phase发生变化时,env也会发生变化,从而保证用户在不同状态下可以取到正确的属性。
## Func `phase_guard`
配合使用python的“with”语句来改变task的phase状态,在with块中,task的phase为所指定的新phase,退出with块后,恢复上一个phase
**参数**
* phase: 所要切换的phase状态,必须是[有效的phase状态](#phase--执行状态)
**示例**
```python
import paddlehub as hub
...
# 打印该task进行过多少个step的训练
with task.phase_guard("train"):
print(task.current_step)
```
## Func `enter_phase`
改变task的phase状态
**参数**
* phase: 所要切换的phase状态,必须是[有效的phase状态](#phase--执行状态)
**示例**
```python
import paddlehub as hub
...
# 打印该task进行过多少个step的训练
task.enter_phase("train")
print(task.current_step)
```
## Func `exit_phase`
退出task的当前phase状态,回到上一步的状态
**参数**
* phase: 所要切换的phase状态
**示例**
```python
import paddlehub as hub
...
task.enter_phase("train")
task.exit_phase()
```
## Func `save_checkpoint`
保存当前的checkpoint到config指定的目录
**示例**
```python
import paddlehub as hub
...
with task.phase_guard("train"):
task.save_checkpoint()
```
## Func `load_checkpoint`
从config指定的checkpoint目录中加载checkpoint数据
**示例**
```python
import paddlehub as hub
...
with task.phase_guard("train"):
task.load_checkpoint()
```
## Func `save_parameters`
保存参数到指定的目录
**参数**
* dirname: 保存参数的目录
**示例**
```python
import paddlehub as hub
...
with task.phase_guard("train"):
task.save_parameters("./params")
```
## Func `load_parameters`
从指定的目录中加载参数
**参数**
* dirname: 待加载参数所在目录
**示例**
```python
import paddlehub as hub
...
with task.phase_guard("train"):
task.load_parameters("./params")
```
## Func `finetune`
根据config配置进行finetune
**示例**
```python
import paddlehub as hub
...
task.finetune()
```
## Func `finetune_and_eval`
根据config配置进行finetune,并且定期进行eval
**示例**
```python
import paddlehub as hub
...
task.finetune_and_eval()
```
## Func `eval`
根据config配置进行eval
**示例**
```python
import paddlehub as hub
...
task.eval(load_best_model = False)
```
## Func `predict`
根据config配置进行predict
**示例**
```python
import paddlehub as hub
...
task.predict()
```
## Func `predict`
根据config配置进行predict
**示例**
```python
import paddlehub as hub
...
task.predict()
```
## Property `is_train_phase`
判断是否处于训练阶段
## Property `is_test_phase`
判断是否处于评估阶段
## Property `is_predict_phase`
判断是否处于预测阶段
## Property `phase`
当前的phase
## Property `env`
当前环境[RunEnv]()对象
## Property `py_reader`
当前env中的PyReader对象
## Property `current_step`
当前env所执行过的step数
## Property `current_epoch`
当前env所执行过的epoch数量
## Property `main_program`
当前env对应的主Program,包含训练/评估/预测所需的计算图
## Property `startup_program`
当前env对应的初始化Program,包含初始化op
## Property `reader`
当前env下对应的数据Reader
## Property `loss`
当前env下对应的loss Variable,只在test和train phase有效
## Property `labels`
当前env下对应的label Variable,只在test和train phase有效
## Property `outputs`
当前env下对应的outputs Variable
## Property `metrics`
当前env下对应的metrics Variable,只在test和train phase有效
## Property `feed_list`
当前env下对应的feed list
## Property `fetch_list`
当前env下对应的fetch_list
# Class `hub.ImageClassifierTask`
通用的分类任务Task,继承自[BaseTask](base_task.md),该Task基于输入的特征,添加一个或多个全连接层来创建一个分类任务用于Fine-tune,度量指标为准确率,损失函数为交叉熵Loss。
```python
hub.ImageClassifierTask(
feature,
num_classes,
feed_list,
data_reader,
startup_program=None,
config=None,
hidden_units=None,
metrics_choices="default"):
```
**参数**
* feature (fluid.Variable): 输入的特征矩阵。
* num_classes (int): 分类任务的类别数量
* feed_list (list): 待feed变量的名字列表
* data_reader: 提供数据的Reader
* startup_program (fluid.Program): 存储了模型参数初始化op的Program,如果未提供,则使用fluid.default_startup_program()
* config ([RunConfig]()): 运行配置
* hidden_units (list): ImageClassifierTask最终的全连接层输出维度为label_size,是每个label的概率值。在这个全连接层之前可以设置额外的全连接层,并指定它们的输出维度,例如hidden_units=[4,2]表示先经过一层输出维度为4的全连接层,再输入一层输出维度为2的全连接层,最后再输入输出维度为label_size的全连接层。
* metrics_choices("default" or list ⊂ ["acc", "f1", "matthews"]): 任务训练过程中需要计算的评估指标,默认为“default”,此时等效于["acc"]。metrics_choices支持训练过程中同时评估多个指标,其中指定的第一个指标将被作为主指标用于判断当前得分是否为最佳分值,例如["matthews", "acc"],"matthews"将作为主指标,参与最佳模型的判断中;“acc”只计算并输出,不参与最佳模型的判断。
**返回**
`ImageClassifierTask`
**示例**
[图像分类](https://github.com/PaddlePaddle/PaddleHub/blob/release/v1.5/demo/image_classification/img_classifier.py)
# Class `hub.MultiLabelClassifierTask`
多标签分类Task,继承自[BaseTask](base_task.md),该Task基于输入的特征,添加一个或多个全连接层来创建一个多标签分类任务用于finetune,度量指标为多个标签的平均AUC,损失函数为多个标签的平均交叉熵。
```python
hub.MultiLabelClassifierTask(
feature,
num_classes,
feed_list,
data_reader,
startup_program=None,
config=None,
hidden_units=None,
metrics_choices="default"):
```
**参数**
* feature (fluid.Variable): 输入的特征矩阵。
* num_classes (int): 多标签任务的标签数量
* feed_list (list): 待feed变量的名字列表
* data_reader: 提供数据的Reader
* startup_program (fluid.Program): 存储了模型参数初始化op的Program,如果未提供,则使用fluid.default_startup_program()
* config ([RunConfig](../config.md)): 运行配置
* hidden_units (list): MultiLabelClassifierTask最终的全连接层输出维度为[num_classes, 2],是属于各个标签的概率值。在这个全连接层之前可以设置额外的全连接层,并指定它们的输出维度,例如hidden_units=[4,2]表示先经过一层输出维度为4的全连接层,再输入一层输出维度为2的全连接层,最后再拼接上输出维度为[num_classes, 2]的全连接层。
* metrics_choices("default" or list ⊂ ["auc"]): 任务训练过程中需要计算的评估指标,默认为“default”,此时等效于["auc"]。
**返回**
`MultiLabelClassifierTask`
**示例**
[多标签分类](https://github.com/PaddlePaddle/PaddleHub/blob/release/v1.4/demo/multi_label_classification/multi_label_classifier.py)
# Class `hub.ReadingComprehensionTask`
阅读理解任务Task,继承自[BaseTask](base_task.md),该Task基于输入的特征,添加一个全连接层来创建一个阅读理解任务用于Fine-tune,损失函数为交叉熵Loss。
```python
hub.ReadingComprehensionTask(
feature,
feed_list,
data_reader,
startup_program=None,
config=None):
```
**参数**
* feature (fluid.Variable): 输入的特征矩阵。
* feed_list (list): 待feed变量的名字列表
* data_reader: 提供数据的Reader
* startup_program (fluid.Program): 存储了模型参数初始化op的Program,如果未提供,则使用fluid.default_startup_program()
* config ([RunConfig](../config.md)): 运行配置
**返回**
`ReadingComprehensionTask`
**示例**
[阅读理解](https://github.com/PaddlePaddle/PaddleHub/tree/release/v1.4/demo/reading_comprehension)
# Class `hub.RegressionTask`
文本回归任务Task,继承自[BaseTask](base_task.md),该Task基于输入的特征,添加一个Dropout层,以及一个或多个全连接层来创建一个文本回归任务用于finetune,度量指标为准确率,损失函数为均方差损失函数。
```python
hub.RegressionTask(
feature,
feed_list,
data_reader,
startup_program=None,
config=None,
hidden_units=None,
metrics_choices="default"):
```
**参数**
* feature (fluid.Variable): 输入的特征矩阵。
* feed_list (list): 待feed变量的名字列表。
* data_reader: 提供数据的Reader。
* startup_program (fluid.Program): 存储了模型参数初始化op的Program,如果未提供,则使用fluid.default_startup_program()。
* config ([RunConfig](../config.md)): 运行配置。
* hidden_units (list): RegressionTask最终的全连接层输出维度为1,是一个回归值。在这个全连接层之前可以设置额外的全连接层,并指定它们的输出维度,例如hidden_units=[4,2]表示先经过一层输出维度为4的全连接层,再输入一层输出维度为2的全连接层,最后再输入输出维度为1的全连接层。
* metrics_choices("default" or list ⊂ ["spearman"]): 任务训练过程中需要计算的评估指标,默认为“default”,此时等效于["spearman"]。metrics_choices支持训练过程中同时评估多个指标,其中指定的第一个指标将被作为主指标用于判断当前得分是否为最佳分值,例如["spearman", "acc"],"spearman"将作为主指标,参与最佳模型的判断中;“acc”只计算并输出,不参与最佳模型的判断。
**返回**
`RegressionTask`
**示例**
[文本回归](https://github.com/PaddlePaddle/PaddleHub/blob/release/v1.4/demo/regression/regression.py)
# Class `hub.task.RunEnv`
PaddleHub的Task通过phase来切换不同的状态(训练/评估/预测等),每个phase都有对应的一个RunEnv对象用于保存对应状态下的重要属性。对于不需要自定义Task的用户来说,本文档并不是必须的
## Property `current_step`
该环境所执行过的step数
## Property `current_epoch`
该环境所执行过的epoch数量
## Property `main_program`
该环境对应的主Program,包含训练/评估/预测所需的计算图
## Property `startup_program`
该环境对应的初始化Program,包含初始化操作的计算图
## Property `py_reader`
该环境中的PyReader对象
## Property `reader`
该环境下对应的数据Reader
## Property `loss`
该环境下对应的loss Variable
## Property `label`
该环境下对应的label Variable
## Property `outputs`
该环境下对应的outputs Variable
## Property `metrics`
该环境下对应的metrics Variable,只在test和train phase有效
## Property `is_inititalized `
该环境是否已经完成初始化
# Class `hub.task.RunState`
PaddleHub的Task在进行训练/评估/预测时,会将运行过程中的状态和输出保存到RunState对象中。用户可以从RunState对象中获取所需数据
## Property `run_time_begin`
运行的开始时间
## Property `run_step`
运行的step数
## Property `run_examples`
运行的样本数量
## Property `run_results`
运行的结果列表,数据和task中的fetch_list一一对应
## Property `run_time_used`
运行所用时间
## Property `run_speed`
运行速度
# Class `hub.SequenceLabelTask`
序列标注Task,继承自[BaseTask](base_task.md),该Task基于输入的特征,添加一个全连接层或者一个全连接层和CRF层来创建一个序列标注任务用于Fine-tune,度量指标为F1,损失函数为交叉熵Loss。
```python
hub.SequenceLabelTask(
feature,
max_seq_len,
num_classes,
feed_list,
data_reader,
startup_program=None,
config=None,
metrics_choices="default",
add_crf=False):
```
**参数**
* feature (fluid.Variable): 输入的特征矩阵
* num_classes (int): 分类任务的类别数量
* feed_list (list): 待feed变量的名字列表
* data_reader: 提供数据的Reader
* startup_program (fluid.Program): 存储了模型参数初始化op的Program,如果未提供,则使用fluid.default_startup_program()
* config ([RunConfig](../config.md)): 运行配置
* metrics_choices("default" or list ⊂ ["precision","recall","f1"]): 任务训练过程中需要计算的评估指标,默认为“default”,此时等效于["f1", "precision", "recall"]。metrics_choices支持训练过程中同时评估多个指标,其中指定的第一个指标将被作为主指标用于判断当前得分是否为最佳分值,例如["f1", "precision"],"f1"将作为主指标,参与最佳模型的判断中;"precision"只计算并输出,不参与最佳模型的判断
* add_crf (bool): 是否选择crf作为decoder,默认为false,如果add_crf=True,则网络加入crf层作为decoder
**返回**
`SequenceLabelTask`
**示例**
[序列标注](https://github.com/PaddlePaddle/PaddleHub/blob/release/v1.4/demo/sequence_labeling/sequence_label.py)
# hub.task
在PaddleHub中,Task代表了一个Fine-tune的任务。任务中包含了执行该任务相关的Program、数据Reader、运行配置等内容。
## 基本概念
在了解Task之前,首先需要认识[RunEnv](runenv.md)[RunState](runstate.md)
Task的基本方法和属性参见[BaseTask](base_task.md)
## 预置Task
PaddleHub预置了常见任务的Task,每种Task都有自己特有的应用场景以及提供了对应的度量指标,用于适应用户的不同需求。预置的任务类型如下:
* 图像分类任务
[ImageClassifierTask]()
* 文本分类任务
[TextClassifierTask]()
* 序列标注任务
[SequenceLabelTask]()
* 多标签分类任务
[MultiLabelClassifierTask]()
* 回归任务
[RegressionTask]()
* 阅读理解任务
[ReadingComprehensionTask]()
## 自定义Task
如果这些Task不支持您的特定需求,您也可以通过继承BasicTask来实现自己的任务,具体实现细节参见[自定义Task]()
## 修改Task内置方法
如果Task内置方法不满足您的需求,您可以通过Task支持的Hook机制修改方法实现,详细信息参见[修改Task内置方法]()
# Class `hub.TextClassifierTask`
文本分类任务Task,继承自[BaseTask](base_task.md),该Task基于输入的特征,添加一个Dropout层,以及一个或多个全连接层来创建一个文本分类任务用于finetune,度量指标为准确率,损失函数为交叉熵Loss。
```python
hub.TextClassifierTask(
feature,
num_classes,
feed_list,
data_reader,
startup_program=None,
config=None,
hidden_units=None,
metrics_choices="default"):
```
**参数**
* feature (fluid.Variable): 输入的特征矩阵。
* num_classes (int): 分类任务的类别数量
* feed_list (list): 待feed变量的名字列表
* data_reader: 提供数据的Reader
* startup_program (fluid.Program): 存储了模型参数初始化op的Program,如果未提供,则使用fluid.default_startup_program()
* config ([RunConfig](../config.md)): 运行配置
* hidden_units (list): TextClassifierTask最终的全连接层输出维度为label_size,是每个label的概率值。在这个全连接层之前可以设置额外的全连接层,并指定它们的输出维度,例如hidden_units=[4,2]表示先经过一层输出维度为4的全连接层,再输入一层输出维度为2的全连接层,最后再输入输出维度为label_size的全连接层。
* metrics_choices("default" or list ⊂ ["acc", "f1", "matthews"]): 任务训练过程中需要计算的评估指标,默认为“default”,此时等效于["acc"]。metrics_choices支持训练过程中同时评估多个指标,其中指定的第一个指标将被作为主指标用于判断当前得分是否为最佳分值,例如["matthews", "acc"],"matthews"将作为主指标,参与最佳模型的判断中;“acc”只计算并输出,不参与最佳模型的判断。
**返回**
`TextClassifierTask`
**示例**
[文本分类](https://github.com/PaddlePaddle/PaddleHub/blob/release/v1.4/demo/text_classification/text_classifier.py)
迁移任务
==================
在PaddleHub中,Task代表了一个Fine-tune的任务。任务中包含了执行该任务相关的Program、数据Reader、运行配置等内容。
在了解Task之前,首先需要认识RunEnv和RunState。
Task的基本方法和属性参见BaseTask。
PaddleHub预置了图像分类、文本分类、序列标注、多标签分类、阅读理解、回归等迁移任务,每种任务都有自己特有的应用场景以及提供了对应的度量指标,用于适应用户的不同需求。
.. toctree::
:maxdepth: 1
:titlesonly:
hub.task.RunEnv<task/runenv>
hub.task.RunState<task/runstate>
hub.task.BaseTask<task/base_task>
hub.ImageClassifierTask<task/image_classify_task>
hub.TextClassifierTask<task/text_classify_task>
hub.SequenceLabelTask<task/sequence_label_task>
hub.MultiLabelClassifierTask<task/multi_lable_classify_task>
hub.ReadingComprehensionTask<task/reading_comprehension_task>
hub.RegressionTask<task/regression_task>
\ No newline at end of file
# 更新历史
## `v1.5.1`
* 修复加载module缺少cache目录的问题
## `v1.5.0`
* 升级PaddleHub Serving,提升性能和易用性
* 新增文本Embedding服务[Bert Service](./tutorial/bert_service.md), 轻松获取文本embedding;
* 代码精短,易于使用。服务端/客户端一行命令即可获取文本embedding;
* 更高性能,更高效率。通过Paddle AnalysisPredictor API优化计算图,提升速度减小显存占用
* 随"机"应变,灵活扩展。根据机器资源和实际需求可灵活增加服务端数量,支持多显卡多模型计算任务
* 优化并发方式,多核环境中使用多线程并发提高整体QPS
* 优化PaddleHub迁移学习组网Task功能,提升易用性
* 增加Hook机制,支持[修改Task内置方法](./tutorial/hook.md)
* 增加colorlog,支持日志彩色显示
* 改用save_inference_model接口保存模型,方便模型部署
* 优化predict接口,增加return_result参数,方便用户直接获取预测结果
* 优化PaddleHub Dataset基类,加载[自定义数据](./tutorial/how_to_load_data.md)代码更少、更简单
## `v1.4.1`
* 修复利用Transformer类模型完成序列标注任务适配paddle1.6版本的问题
* Windows下兼容性提升为python >= 3.6
## `v1.4.0`
* 新增预训练模型ERNIE tiny
* 新增数据集:INEWS、BQ、DRCD、CMRC2018、THUCNEWS,支持ChineseGLUE(CLUE)V0 所有任务
* 修复module与PaddlePaddle版本兼容性问题
* 优化Hub Serving启动过程和模型加载流程,提高服务响应速度
## `v1.3.0`
* 新增PaddleHub Serving服务部署
* 新增[hub serving](https://github.com/PaddlePaddle/PaddleHub/wiki/PaddleHub-Serving%E4%B8%80%E9%94%AE%E6%9C%8D%E5%8A%A1%E9%83%A8%E7%BD%B2)命令,支持一键启动Module预测服务部署
* 新增预训练模型:
* roberta_wwm_ext_chinese_L-24_H-1024_A-16
* roberta_wwm_ext_chinese_L-12_H-768_A-12
* bert_wwm_ext_chinese_L-12_H-768_A-12
* bert_wwm_chinese_L-12_H-768_A-12
* AutoDL Finetuner优化使用体验
* 支持通过接口方式回传模型性能
* 可视化效果优化,支持多trail效果显示
## `v1.2.1`
* 新增**超参优化Auto Fine-tune**,实现给定超参搜索空间,PaddleHub自动给出较佳的超参组合
* 支持两种超参优化算法:HAZero和PSHE2
* 支持两种评估方式:FullTrail和PopulationBased
* 新增Fine-tune**优化策略ULMFiT**,包括以下三种设置
* Slanted triangular learning rates:学习率先线性增加后缓慢降低
* Discriminative fine-tuning:将计算图划分为n段,不同的段设置不同学习率
* Gradual unfreezing:根据计算图的拓扑结构逐层unfreezing
* 新增支持用户自定义PaddleHub配置,包括
* 预训练模型管理服务器地址
* 日志记录级别
* Fine-tune API升级,灵活性与易用性提升
* 新增**阅读理解Fine-tune任务****回归Fine-tune任务**
* 新增多指标评测
* 优化predict接口
* 可视化工具支持使用tensorboard
## `v1.1.2`
* PaddleHub支持修改预训练模型存放路径${HUB_HOME}
## `v1.1.1`
* PaddleHub支持离线运行
* 修复python2安装PaddleHub失败问题
## `v1.1.0`
* PaddleHub **新增预训练模型ERNIE 2.0**
* 升级Reader, 支持自动传送数据给Ernie 1.0/2.0
* 新增数据集GLUE(MRPC、QQP、SST-2、CoLA、QNLI、RTE、MNLI)
## `v1.0.1`
* 安装模型时自动选择与paddlepaddle版本适配的模型
## `v1.0.0`
* 全新发布PaddleHub官网,易用性全面提升
* 新增网站 https://www.paddlepaddle.org.cn/hub 包含PaddlePaddle生态的预训练模型使用介绍
* 迁移学习Demo接入AI Studio与AI Book,无需安装即可快速体验
* 新增29个预训练模型,覆盖文本、图像、视频三大领域;目前官方提供40个预训练模型
* CV预训练模型:
* 新增图像分类预训练模型11个:SE_ResNeXt, GoogleNet, ShuffleNet等
* 新增目标检测模型Faster-RCNN和YOLOv3
* 新增图像生成模型CycleGAN
* 新增人脸检测模型Pyramidbox
* 新增视频分类模型4个: TSN, TSM, StNet, Non-Local
* NLP预训练模型
* 新增语义模型ELMo
* 新增情感分析模型5个: Senta-BOW, Senta-CNN, Senta-GRNN, , Senta-LSTM, EmoTect
* 新增中文语义相似度分析模型SimNet
* 升级LAC词法分析模型,新增词典干预功能,支持用户自定义分词
* Fine-tune API升级,灵活性与性能全面提升
* 支持多卡并行、PyReader多线程IO,Fine-tune速度提升60%
* 简化finetune、evaluate、predict等使用逻辑,提升易用性
* 增加事件回调功能,方便用户快速实现自定义迁移学习任务
* 新增多标签分类Fine-tune任务
## `v0.5.0`
正式发布PaddleHub预训练模型管理工具,旨在帮助用户更高效的管理模型并开展迁移学习的工作。
**预训练模型管理**: 通过hub命令行可完成PaddlePaddle生态的预训练模型下载、搜索、版本管理等功能。
**命令行一键使用**: 无需代码,通过命令行即可直接使用预训练模型进行预测,快速调研训练模型效果。目前版本支持以下模型:词法分析LAC;情感分析Senta;目标检测SSD;图像分类ResNet, MobileNet, NASNet等。
**迁移学习**: 提供了基于预训练模型的Fine-tune API,用户通过少量代码即可完成迁移学习,包括BERT/ERNIE文本分类、序列标注、图像分类迁移等。
......@@ -82,9 +82,9 @@ train.py用于接受PaddleHub搜索到的超参进行一次优化过程,将优
### 示例
[PaddleHub AutoDL Finetuner超参优化--NLP情感分类任务](../demo/autofinetune_text_classification)
[PaddleHub AutoDL Finetuner超参优化--NLP情感分类任务](https://github.com/PaddlePaddle/PaddleHub/tree/release/v1.5/demo/autofinetune_text_classification)
[PaddleHub AutoDL Finetuner超参优化--CV图像分类任务](../demo/autofinetune_image_classification)
[PaddleHub AutoDL Finetuner超参优化--CV图像分类任务](https://github.com/PaddlePaddle/PaddleHub/tree/release/v1.5/demo/autofinetune_image_classification)
## 三、启动方式
......
# PaddleHub命令行工具
PaddleHub为预训练模型的管理和使用提供了命令行工具。
PaddleHub支持修改预训练模型存放路径:
* 如已设置`${HUB_HOME}`环境变量,则预训练模型、配置等文件都存放在`${HUB_HOME}`指示的路径下
* 如未设置`${HUB_HOME}`环境变量,则存放在`$HOME`指示的路径下
目前命令行支持以下12个命令:
## `install`
用于将Module安装到本地,默认安装在`${HUB_HOME}/.paddlehub/modules`目录下,当一个Module安装到本地后,用户可以通过其他命令操作该Module(例如,使用该Module进行预测),也可以使用PaddleHub提供的python API,将Module应用到自己的任务中,实现迁移学习
## `uninstall`
用于卸载本地Module
## `show`
用于查看本地已安装Module的属性或者指定目录下确定的Module的属性,包括其名字、版本、描述、作者等信息
## `download`
用于下载百度提供的Module
`选项`
* `--output_path`:用于指定存放下载文件的目录,默认为当前目录
* `--uncompress`:是否对下载的压缩包进行解压,默认不解压
* `--type`:指定下载的资源类型,当指定Model时,download只会下载Model的资源。默认为All,此时会优先搜索Module资源,如果没有相关的Module资源,则搜索Model
## `search`
通过关键字在服务端检索匹配的Module,当想要查找某个特定模型的Module时,使用search命令可以快速得到结果,例如`hub search ssd`命令,会查找所有包含了ssd字样的Module,命令支持正则表达式,例如`hub search ^s.*`搜索所有以s开头的资源。
`注意`
如果想要搜索全部的Module,使用`hub search *`并不生效,这是因为shell会自行进行通配符展开,将*替换为当前目录下的文件名。为了进行全局搜索,用户可以直接键入`hub search`
## `list`
列出本地已经安装的Module
## `run`
用于执行Module的预测,需要注意的是,并不是所有的模型都支持预测(同样,也不是所有的模型都支持迁移学习),更多关于run命令的细节,请查看下方的`关于预测`
## `help`
显示帮助信息
## `version`
显示PaddleHub版本信息
## `clear`
PaddleHub在使用过程中会产生一些缓存数据,这部分数据默认存放在${HUB_HOME}/.paddlehub/cache目录下,用户可以通过clear命令来清空缓存
## `autofinetune`
用于自动调整Fine-tune任务的超参数,具体使用详情参考[PaddleHub AutoDL Finetuner使用教程](https://github.com/PaddlePaddle/PaddleHub/blob/release/v1.4/tutorial/autofinetune.md)
`选项`
* `--param_file`: 需要搜索的超参数信息yaml文件
* `--gpu`: 设置运行程序的可用GPU卡号,中间以逗号隔开,不能有空格
* `--popsize`: 设置程序运行每轮产生的超参组合数,默认为5
* `--round`: 设置程序运行的轮数,默认是10
* `--output_dir`: 设置程序运行输出结果存放目录,可选,不指定该选项参数时,在当前运行路径下生成存放程序运行输出信息的文件夹
* `--evaluator`: 设置自动搜索超参的评价效果方式,可选fulltrail和populationbased, 默认为populationbased
* `--strategy`: 设置自动搜索超参算法,可选hazero和pshe2,默认为hazero
## `config`
用于查看和设置paddlehub相关设置,包括对server地址、日志级别的设置
`示例`
* `hub config`: 显示当前paddlehub的设置
* `hub config reset`: 恢复当前paddlehub的设置为默认设置
* `hub config server==[address]`: 设置当前server地址为[address]
* `hub config log==[level]`: 设置当前日志级别为[level], 可选值为critical, error, warning, info, debug, nolog, 从走到右优先级从高到低,nolog表示不显示日志信息
## `serving`
用于一键部署Module预测服务,详细用法见[PaddleHub Serving一键服务部署](serving.md)
**NOTE:**
1. 在PaddleHub中,Module表示一个`可执行的神经网络模型`,一个Module可以支持直接命令行预测,也可以配合PaddleHub Finetune API,通过少量代码实现迁移学习。不是所有的Module都支持命令行预测 (例如BERT/ERNIE Transformer类模型,一般需要搭配任务进行finetune),也不是所有的Module都可用于finetune(例如LAC词法分析模型,我们不建议用户用于finetune)。
PaddleHub尽量简化了用户在使用命令行预测时的理解成本,一般来讲,我们将预测分为NLP和CV两大类
## NLP类的任务
输入数据通过--input_text或者--input_file指定。以百度LAC模型(中文词法分析)为例,可以通过以下两个命令实现单行文本和多行文本的分析。
```shell
# 单文本预测
$ hub run lac --input_text "今天是个好日子"
```
```shell
# 多文本分析
$ hub run lac --input_file test.txt
```
其中test.txt的样例格式如下,每行是一个需要词法分析句子
```
今天是个好日子
天气预报说今天要下雨
下一班地铁马上就要到了
……更多行……
```
## CV类的任务
输入数据通过`--input_path`或者`--input_file`指定。以SSD模型(单阶段目标检测)为例子,可以通过以下两个命令实现单张图片和多张图片的预测
```shell
# 单张照片预测
$ hub run ssd_mobilenet_v1_pascal --input_path test.jpg
```
```shell
# 多张照片预测
$ hub run ssd_mobilenet_v1_pascal --input_file test.txt
```
其中test.txt的格式为
```
cat.jpg
dog.jpg
person.jpg
……更多行……
```
# 如何修改Task内置方法?
了解如何修改Task内置方法,我们首先了解下Task中的事件。
Task定义了[组网事件]()和[运行事件]()。其中运行事件的工作流程如下图。
<p align="center">
<img src="https://github.com/PaddlePaddle/PaddleHub/blob/develop/docs/imgs/task_event_workflow.png" hspace='10'/> <br />
</p>
**NOTE:**
* 图中提到的运行设置config参见[RunConfig说明]()
* "finetune_start_event","finetune_end_event","predict_start_event","predict_end_event","eval_start_event","eval_end_event"等事件是用于打印相应阶段的日志信息。"save_ckpt_interval_event"事件用于保存当前训练的模型参数。"log_interval_event"事件用于计算模型评价指标以及可视化这些指标。
如果您需要对图中提到的事件的具体实现进行修改,可以通过Task提供的事件回调hook机制进行改写。
如你想要改变任务评价指标,如下示例中将PaddleHub默认的accuracy评价指标改为F1评价指标。同时还想用自定义的可视化工具可视化模型训练过程,如下示例将可视化工具改写为tb-paddle。则你需要改写评估方法[log_interval_event]()。这时候你可以用Hook实现。具体使用方法如下:
```python
import numpy as np
def calculate_f1_np(preds, labels):
# 计算F1分数
# preds:预测label
# labels: 真实labels
# 返回F1分数
preds = np.array(preds)
labels = np.array(labels)
tp = np.sum((labels == 1) & (preds == 1))
tn = np.sum((labels == 0) & (preds == 0))
fp = np.sum((labels == 0) & (preds == 1))
fn = np.sum((labels == 1) & (preds == 0))
p = tp / (tp + fp) if (tp + fp) else 0
r = tp / (tp + fn) if (tp + fn) else 0
f1 = (2 * p * r) / (p + r) if p + r else 0
return f1
# 自定义评估方法实现
def calculate_metrics(self, run_states):
# run_states: list类型,每个元素是一个RunState对象,指明了该step的运行状态
# 返回评估得分,平均损失值和平局运行速度
loss_sum = acc_sum = run_examples = 0
run_step = run_time_used = 0
all_labels = np.array([])
all_infers = np.array([])
for run_state in run_states:
run_examples += run_state.run_examples
run_step += run_state.run_step
loss_sum += np.mean(
run_state.run_results[-1]) * run_state.run_examples
acc_sum += np.mean(
run_state.run_results[2]) * run_state.run_examples
np_labels = run_state.run_results[0]
np_infers = run_state.run_results[1]
all_labels = np.hstack((all_labels, np_labels.reshape([-1])))
all_infers = np.hstack((all_infers, np_infers.reshape([-1])))
run_time_used = time.time() - run_states[0].run_time_begin
avg_loss = loss_sum / run_examples
run_speed = run_step / run_time_used
scores = OrderedDict()
f1 = calculate_f1_np(all_infers, all_labels)
scores["f1"] = f1
return scores, avg_loss, run_speed
# 利用自定义可视化工具tb-paddle记录训练过程中的损失值,评估指标等
from tb_paddle import SummaryWriter
tb_writer = SummaryWriter("PATH/TO/LOG")
def record_value(evaluation_scores, loss, s)
tb_writer.add_scalar(
tag="Loss_{}".format(self.phase),
scalar_value=loss,
global_step=self._envs['train'].current_step)
log_scores = ""
for metric in evaluation_scores:
self.tb_writer.add_scalar(
tag="{}_{}".format(metric, self.phase),
scalar_value=scores[metric],
global_step=self._envs['train'].current_step)
log_scores += "%s=%.5f " % (metric, scores[metric])
print("step %d / %d: loss=%.5f %s[step/sec: %.2f]" %
(self.current_step, self.max_train_steps, avg_loss,
log_scores, run_speed))
# 改写_log_interval_event实现
def new_log_interval_event(self, run_states):
# 改写的事件方法,参数列表务必与PaddleHub内置的相应方法保持一致
print("This is the new log_interval_event!")
scores, avg_loss, run_speed = calculate_metrics(run_states)
record_value(scores, avg_loss, run_speed)
# 利用Hook改写PaddleHub内置_log_interval_event实现,需要2步(假设task已经创建好)
# 1.删除PaddleHub内置_log_interval_event实现
# hook_type:你想要改写的事件hook类型
# name:hook名字,“default”表示PaddleHub内置_log_interval_event实现
task.delete_hook(hook_type="log_interval_event", name="default")
# 2.增加自定义_log_interval_event实现(new_log_interval_event)
# hook_type:你想要改写的事件hook类型
# name: hook名字
# func:自定义改写的方法
task.add_hook(hook_type="log_interval_event", name="new_log_interval_event", func=new_log_interval_event)
# 输出hook信息
task.hook_info()
```
**NOTE:**
* 关于上述提到的run_states参见[RunEnv说明]()
* tb-paddle详细信息参见[官方文档](https://github.com/linshuliang/tb-paddle)
* 改写的事件方法,参数列表务必与PaddleHub内置的相应方法保持一致。
* 只支持改写/删除以下事件hook类型:
"build_env_start_event","build_env_end_event","finetune_start_event","finetune_end_event","predict_start_event","predict_end_event","eval_start_event","eval_end_event","log_interval_event","save_ckpt_interval_event","eval_interval_event","run_step_event"。
* 如果想要改写组网事件,Hook不支持。改写组网事件参见[自定义Task]()。
* 如何创建Task,参见[PaddleHub迁移学习示例](https://github.com/PaddlePaddle/PaddleHub/tree/develop/demo)
# 自定义Task
本节内容讲述如何实现自定义Task。在了解本节内容之前,您需要先了解以下内容:
* 任务基类[BasicTask]()
* 运行状态[RunState]()
* 运行环境[RunEnv]()
当自定义一个Task时,我们并不需要重新实现eval、finetune等通用接口。一般来讲,新的Task与其他Task的区别在于
* 网络结构
* 评估指标
这两者的差异可以通过重载BasicTask的组网事件和运行事件来实现
## 组网事件
BasicTask定义了一系列的组网事件,当需要构建对应的Fluid Program时,相应的事件会被调用。通过重载实现对应的组网函数,用户可以实现自定义网络
### `_build_net`
进行前向网络组网的函数,用户需要自定义实现该函数,函数需要返回对应预测结果的Variable list
```python
# 代码示例
def _build_net(self):
cls_feats = self.feature
if self.hidden_units is not None:
for n_hidden in self.hidden_units:
cls_feats = fluid.layers.fc(
input=cls_feats, size=n_hidden, act="relu")
logits = fluid.layers.fc(
input=cls_feats,
size=self.num_classes,
param_attr=fluid.ParamAttr(
name="cls_out_w",
initializer=fluid.initializer.TruncatedNormal(scale=0.02)),
bias_attr=fluid.ParamAttr(
name="cls_out_b", initializer=fluid.initializer.Constant(0.)),
act="softmax")
return [logits]
```
### `_add_label`
添加label的函数,用户需要自定义实现该函数,函数需要返回对应输入label的Variable list
```python
# 代码示例
def _add_label(self):
return [fluid.layers.data(name="label", dtype="int64", shape=[1])]
```
### `_add_metrics`
添加度量指标的函数,用户需要自定义实现该函数,函数需要返回对应度量指标的Variable list
```python
# 代码示例
def _add_metrics(self):
return [fluid.layers.accuracy(input=self.outputs[0], label=self.label)]
```
## 运行事件
BasicTask定义了一系列的运行时回调事件,在特定的时机时触发对应的事件,在自定的Task中,通过重载实现对应的回调函数,用户可以实现所需的功能
### `_build_env_start_event`
当需要进行一个新的运行环境构建时,该事件被触发。通过重载实现该函数,用户可以在一个环境开始构建前进行对应操作,例如写日志
```python
# 代码示例
def _build_env_start_event(self):
logger.info("Start to build env {}".format(self.phase))
```
### `_build_env_end_event`
当一个新的运行环境构建完成时,该事件被触发。通过继承实现该函数,用户可以在一个环境构建结束后进行对应操作,例如写日志
```python
# 代码示例
def _build_env_end_event(self):
logger.info("End of build env {}".format(self.phase))
```
### `_finetune_start_event`
当开始一次finetune时,该事件被触发。通过继承实现该函数,用户可以在开始一次finetune操作前进行对应操作,例如写日志
```python
# 代码示例
def _finetune_start_event(self):
logger.info("PaddleHub finetune start")
```
### `_finetune_end_event`
当结束一次finetune时,该事件被触发。通过继承实现该函数,用户可以在结束一次finetune操作后进行对应操作,例如写日志
```python
# 代码示例
def _finetune_end_event(self):
logger.info("PaddleHub finetune finished.")
```
### `_eval_start_event`
当开始一次evaluate时,该事件被触发。通过继承实现该函数,用户可以在开始一次evaluate操作前进行对应操作,例如写日志
```python
# 代码示例
def _eval_start_event(self):
logger.info("Evaluation on {} dataset start".format(self.phase))
```
### `_eval_end_event`
当结束一次evaluate时,该事件被触发。通过继承实现该函数,用户可以在完成一次evaluate操作后进行对应操作,例如计算运行速度、评估指标等
```python
# 代码示例
def _eval_end_event(self, run_states):
run_step = 0
for run_state in run_states:
run_step += run_state.run_step
run_time_used = time.time() - run_states[0].run_time_begin
run_speed = run_step / run_time_used
logger.info("[%s dataset evaluation result] [step/sec: %.2f]" %
(self.phase, run_speed))
```
* `run_states`: 一个list对象,list中的每一个元素都是RunState对象,该list包含了整个评估过程的状态数据。
### `_predict_start_event`
当开始一次predict时,该事件被触发。通过继承实现该函数,用户可以在开始一次predict操作前进行对应操作,例如写日志
```python
# 代码示例
def _predict_start_event(self):
logger.info("PaddleHub predict start")
```
### `_predict_end_event`
当结束一次predict时,该事件被触发。通过继承实现该函数,用户可以在结束一次predict操作后进行对应操作,例如写日志
```python
# 代码示例
def _predict_end_event(self):
logger.info("PaddleHub predict finished.")
```
### `_log_interval_event`
调用*finetune* 或者 *finetune_and_eval*接口时,每当命中用户设置的日志打印周期时([RunConfig.log_interval](https://github.com/PaddlePaddle/PaddleHub/wiki/PaddleHub-API:-RunConfig#log_interval))。通过继承实现该函数,用户可以在finetune过程中定期打印所需数据,例如计算运行速度、loss、准确率等
```python
# 代码示例
def _log_interval_event(self, run_states):
avg_loss, avg_acc, run_speed = self._calculate_metrics(run_states)
self.env.loss_scalar.add_record(self.current_step, avg_loss)
self.env.acc_scalar.add_record(self.current_step, avg_acc)
logger.info("step %d: loss=%.5f acc=%.5f [step/sec: %.2f]" %
(self.current_step, avg_loss, avg_acc, run_speed))
```
* `run_states`: 一个list对象,list中的每一个元素都是RunState对象,该list包含了整个从上一次该事件被触发到本次被触发的状态数据
### `_save_ckpt_interval_event`
调用*finetune* 或者 *finetune_and_eval*接口时,每当命中用户设置的保存周期时([RunConfig.save_ckpt_interval](https://github.com/PaddlePaddle/PaddleHub/wiki/PaddleHub-API:-RunConfig#save_ckpt_interval)),该事件被触发。通过继承实现该函数,用户可以在定期保存checkpoint
```python
# 代码示例
def _save_ckpt_interval_event(self):
self.save_checkpoint(self.current_epoch, self.current_step)
```
### `_eval_interval_event`
调用*finetune_and_eval*接口时,每当命中用户设置的评估周期时([RunConfig.eval_interval](https://github.com/PaddlePaddle/PaddleHub/wiki/PaddleHub-API:-RunConfig#eval_interval)),该事件被触发。通过继承实现该函数,用户可以实现自定义的评估指标计算
```python
# 代码示例
def _eval_interval_event(self):
self.eval(phase="dev")
```
### `_run_step_event`
调用*eval**predict**finetune_and_eval**finetune*等接口时,每执行一次计算,该事件被触发。通过继承实现该函数,用户可以实现所需操作
```python
# 代码示例
def _run_step_event(self, run_state):
...
```
* `run_state`: 一个RunState对象,指明了该step的运行状态
# 自定义数据
训练一个新任务时,如果从零开始训练时,这将是一个耗时的过程,并且效果可能达不到理想的效果,此时您可以利用PaddleHub提供的预训练模型进行具体任务的Fine-tune。您只需要对自定义数据进行相应的预处理,随后输入预训练模型中,即可得到相应的结果。
## 一、NLP类任务如何自定义数据
本文以预训练模型ERNIE对文本分类任务进行Fine-tune为例,说明如何利用PaddleHub适配自定义数据完成Fine-tune。
### 数据准备
```
├─data: 数据目录
  ├─train.tsv 训练集
  ├─dev.tsv 验证集
  ├─test.tsv 测试集
  └─……
```
相应的数据格式为第一列是文本内容text_a,第二列为文本类别label。列与列之间以Tab键分隔。数据集文件第一行为`text_a label`(中间以Tab键分隔)。
如果您有两个输入文本text_a、text_b,则第一列为第一个输入文本text_a, 第二列应为第二个输入文本text_b,第三列文本类别label。列与列之间以Tab键分隔。数据集第一行为`text_a text_b label`(中间以Tab键分隔)。
```text
text_a label
15.4寸笔记本的键盘确实爽,基本跟台式机差不多了,蛮喜欢数字小键盘,输数字特方便,样子也很美观,做工也相当不错 1
房间太小。其他的都一般。。。。。。。。。 0
1.接电源没有几分钟,电源适配器热的不行. 2.摄像头用不起来. 3.机盖的钢琴漆,手不能摸,一摸一个印. 4.硬盘分区不好办. 0
```
### 自定义数据加载
加载文本类自定义数据集,用户仅需要继承基类BaseNLPDatast,修改数据集存放地址以及类别即可。具体使用如下:
**NOTE:**
* 数据集文件编码格式建议为utf8格式。
* 如果相应的数据集文件没有上述的列说明,如train.tsv文件没有第一行的`text_a label`,则train_file_with_header=False。
* 如果您还有预测数据(没有文本类别),可以将预测数据存放在predict.tsv文件,文件格式和train.tsv类似。去掉label一列即可。
```python
from paddlehub.dataset.base_nlp_dataset import BaseNLPDataset
class DemoDataset(BaseNLPDataset):
"""DemoDataset"""
def __init__(self):
# 数据集存放位置
self.dataset_dir = "path/to/dataset"
super(DemoDataset, self).__init__(
base_path=self.dataset_dir,
train_file="train.tsv",
dev_file="dev.tsv",
test_file="test.tsv",
# 如果还有预测数据(不需要文本类别label),可以放在predict.tsv
predict_file="predict.tsv",
train_file_with_header=True,
dev_file_with_header=True,
test_file_with_header=True,
predict_file_with_header=True,
# 数据集类别集合
label_list=["0", "1"])
dataset = DemoDataset()
```
之后,您就可以通过DemoDataset()获取自定义数据集了。进而配合ClassifyReader以及预训练模型如ERNIE完成文本分类任务。
## 二、CV类任务如何自定义数据
利用PaddleHub迁移CV类任务使用自定义数据时,用户需要自己切分数据集,将数据集且分为训练集、验证集和测试集。
### 数据准备
需要三个文本文件来记录对应的图片路径和标签,此外还需要一个标签文件用于记录标签的名称。
```
├─data: 数据目录
  ├─train_list.txt:训练集数据列表
  ├─test_list.txt:测试集数据列表
  ├─validate_list.txt:验证集数据列表
├─label_list.txt:标签列表
  └─……
```
训练/验证/测试集的数据列表文件的格式如下
```
图片1路径 图片1标签
图片2路径 图片2标签
...
```
label_list.txt的格式如下
```
分类1名称
分类2名称
...
```
示例:
[DogCat数据集](https://github.com/PaddlePaddle/PaddleHub/wiki/PaddleHub-API:-Dataset#class-hubdatasetdogcatdataset)为示例,train_list.txt/test_list.txt/validate_list.txt内容如下示例
```
cat/3270.jpg 0
cat/646.jpg 0
dog/12488.jpg 1
```
label_list.txt内容如下:
```
cat
dog
```
### 自定义数据加载
加载图像类自定义数据集,用户仅需要继承基类BaseCVDatast,修改数据集存放地址即可。具体使用如下:
**NOTE:**
* 数据集文件编码格式建议为utf8格式。
* dataset_dir为数据集实际路径,需要填写全路径,以下示例以`/test/data`为例。
* 训练/验证/测试集的数据列表文件中的图片路径需要相对于dataset_dir的相对路径,例如图片的实际位置为`/test/data/dog/dog1.jpg`。base_path为`/test/data`,则文件中填写的路径应该为`dog/dog1.jpg`
* 如果您还有预测数据(没有文本类别),可以将预测数据存放在predict_list.txt文件,文件格式和train_list.txt类似。去掉label一列即可
* 如果您的数据集类别较少,可以不用定义label_list.txt,可以选择定义label_list=["数据集所有类别"]。
```python
from paddlehub.dataset.base_cv_dataset import BaseCVDataset
class DemoDataset(BaseCVDataset):
def __init__(self):
# 数据集存放位置
self.dataset_dir = "/test/data"
super(DemoDataset, self).__init__(
base_path=self.dataset_dir,
train_list_file="train_list.txt",
validate_list_file="validate_list.txt",
test_list_file="test_list.txt",
predict_file="predict_list.txt",
label_list_file="label_list.txt",
# label_list=["数据集所有类别"])
dataset = DemoDataset()
```
教程
==================
以下是关于PaddleHub的使用教程,介绍了命令行使用、如何自定义数据完成Finetune、如何自定义迁移任务、如何服务化部署预训练模型、如何获取ERNIE/BERT Embedding、如何用word2vec完成语义相似度计算、ULMFit优化策略介绍、如何使用超参优化AutoDL Finetuner、如何用Hook机制改写Task内置方法。
详细信息,参考以下教程:
.. toctree::
:maxdepth: 1
命令行工具<cmdintro>
自定义数据<how_to_load_data>
自定义任务<how_to_define_task>
服务化部署<serving>
文本Embedding服务<bert_service>
语义相似度计算<sentence_sim>
ULMFit优化策略<strategy_exp>
超参优化<autofinetune>
Hook机制<hook>
\ No newline at end of file
......@@ -13,5 +13,5 @@
# See the License for the specific language governing permissions and
# limitations under the License.
""" PaddleHub version string """
hub_version = "1.5.0"
hub_version = "1.5.1"
module_proto_version = "1.0.0"
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册