diff --git a/demo/text_classification/README.md b/demo/text_classification/README.md index 65c064eb2fcaa075de5e5102ba2dea2c42150ebe..89ee448cb3ea136b2d18e2e06c0072f58c95cab3 100644 --- a/demo/text_classification/README.md +++ b/demo/text_classification/README.md @@ -2,9 +2,29 @@ 本示例将展示如何使用PaddleHub Fine-tune API以及Transformer类预训练模型(ERNIE/BERT/RoBERTa)完成分类任务。 +**PaddleHub 1.7.0以上版本支持在Transformer类预训练模型之后拼接预置网络(bow, bilstm, cnn, dpcnn, gru, lstm)完成文本分类任务** + +## 目录结构 +. +├── finetuned_model_to_module # PaddleHub Fine-tune得到模型如何转化为module,从而利用PaddleHub Serving部署 +│   ├── __init__.py +│   └── module.py +├── predict_predefine_net.py # 加入预置网络预测脚本 +├── predict.py # 不使用预置网络(使用fc网络)的预测脚本 +├── README.md # 文本分类迁移学习文档说明 +├── run_cls_predefine_net.sh # 加入预置网络的文本分类任务训练启动脚本 +├── run_cls.sh # 不使用预置网络(使用fc网络)的训练启动脚本 +├── run_predict_predefine_net.sh # 使用预置网络(使用fc网络)的预测启动脚本 +├── run_predict.sh # # 不使用预置网络(使用fc网络)的预测启动脚本 +├── text_classifier_dygraph.py # 动态图训练脚本 +├── text_cls_predefine_net.py # 加入预置网络训练脚本 +└── text_cls.py # 不使用预置网络(使用fc网络)的训练脚本 + ## 如何开始Fine-tune -在完成安装PaddlePaddle与PaddleHub后,通过执行脚本`sh run_classifier.sh`即可开始使用ERNIE对ChnSentiCorp数据集进行Fine-tune。 +以下例子已不使用预置网络完成文本分类任务,说明PaddleHub如何完成迁移学习。使用预置网络完成文本分类任务,步骤类似。 + +在完成安装PaddlePaddle与PaddleHub后,通过执行脚本`sh run_cls.sh`即可开始使用ERNIE对ChnSentiCorp数据集进行Fine-tune。 其中脚本参数说明如下: @@ -164,9 +184,26 @@ cls_task = hub.TextClassifierTask( cls_task.finetune_and_eval() ``` **NOTE:** -1. `outputs["pooled_output"]`返回了ERNIE/BERT模型对应的[CLS]向量,可以用于句子或句对的特征表达。 -2. `feed_list`中的inputs参数指名了ERNIE/BERT中的输入tensor的顺序,与ClassifyReader返回的结果一致。 +1. `outputs["pooled_output"]`返回了Transformer类预训练模型对应的[CLS]向量,可以用于句子或句对的特征表达。 +2. `feed_list`中的inputs参数指名了Transformer类预训练模型中的输入tensor的顺序,与ClassifyReader返回的结果一致。 3. `hub.TextClassifierTask`通过输入特征,label与迁移的类别数,可以生成适用于文本分类的迁移任务`TextClassifierTask`。 +4. 使用预置网络与否,传入`hub.TextClassifierTask`的特征不相同。`hub.TextClassifierTask`通过参数`feature`和`token_feature`区分。 + `feature`应是sentence-level特征,shape应为[-1, emb_size];`token_feature`是token-levle特征,shape应为[-1, max_seq_len, emb_size]。 + 如果使用预置网络,则应取Transformer类预训练模型的sequence_output特征(`outputs["sequence_output"]`)。并且`hub.TextClassifierTask(token_feature=outputs["sequence_output"])`。 + 如果不使用预置网络,直接通过fc网络进行分类,则应取Transformer类预训练模型的pooled_output特征(`outputs["pooled_output"]`)。并且`hub.TextClassifierTask(feature=outputs["pooled_output"])`。 +5. 使用预置网络,可以通过`hub.TextClassifierTask`参数network进行指定不同的网络结构。如下代码表示选择bilstm网络拼接在Transformer类预训练模型之后。 + PaddleHub文本分类任务预置网络支持bow,bilstm,cnn,dpcnn,gru,lstm。指定network应是其中之一。 +```python +cls_task = hub.TextClassifierTask( + data_reader=reader, + token_feature=outputs["pooled_output"], + feed_list=feed_list, + network='bilstm', + num_classes=dataset.num_labels, + config=config, + metrics_choices=metrics_choices) +``` + #### 自定义迁移任务 @@ -190,29 +227,9 @@ python predict.py --checkpoint_dir $CKPT_DIR --max_seq_len 128 ``` 其中CKPT_DIR为Fine-tune API保存最佳模型的路径, max_seq_len是ERNIE模型的最大序列长度,*请与训练时配置的参数保持一致* -参数配置正确后,请执行脚本`sh run_predict.sh`,即可看到以下文本分类预测结果, 以及最终准确率。 -如需了解更多预测步骤,请参考`predict.py`。 - -``` -这个宾馆比较陈旧了,特价的房间也很一般。总体来说一般 predict=0 -交通方便;环境很好;服务态度很好 房间较小 predict=1 -19天硬盘就罢工了~~~算上运来的一周都没用上15天~~~可就是不能换了~~~唉~~~~你说这算什么事呀~~~ predict=0 -``` +参数配置正确后,请执行脚本`sh run_predict.sh`,即可看到文本分类预测结果。 -我们在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)|| +我们在AI Studio上提供了IPython NoteBook形式的demo,点击[PaddleHub教程合集](https://aistudio.baidu.com/aistudio/projectdetail/231146),可使用AI Studio平台提供的GPU算力进行快速尝试。 ## 超参优化AutoDL Finetuner diff --git a/docs/reference/task/task.md b/docs/reference/task/task.md index a1286b25a19fff6d3f881c95ad2ac76690f95cc7..216f035667ba57613399cdd495faca14f0cf3f96 100644 --- a/docs/reference/task/task.md +++ b/docs/reference/task/task.md @@ -13,22 +13,22 @@ Task的基本方法和属性参见[BaseTask](base_task.md)。 PaddleHub预置了常见任务的Task,每种Task都有自己特有的应用场景以及提供了对应的度量指标,用于适应用户的不同需求。预置的任务类型如下: * 图像分类任务 -[ImageClassifierTask]() +[ImageClassifierTask](image_classify_task.md) * 文本分类任务 -[TextClassifierTask]() +[TextClassifierTask](text_classify_task.md) * 序列标注任务 -[SequenceLabelTask]() +[SequenceLabelTask](sequence_label_task.md) * 多标签分类任务 -[MultiLabelClassifierTask]() +[MultiLabelClassifierTask](multi_lable_classify_task.md) * 回归任务 -[RegressionTask]() +[RegressionTask](regression_task.md) * 阅读理解任务 -[ReadingComprehensionTask]() +[ReadingComprehensionTask](reading_comprehension_task.md) ## 自定义Task -如果这些Task不支持您的特定需求,您也可以通过继承BasicTask来实现自己的任务,具体实现细节参见[自定义Task]() +如果这些Task不支持您的特定需求,您也可以通过继承BasicTask来实现自己的任务,具体实现细节参见[自定义Task](../../tutorial/how_to_define_task.md)以及[修改Task中的模型网络](../../tutorial/define_task_example.md) ## 修改Task内置方法 -如果Task内置方法不满足您的需求,您可以通过Task支持的Hook机制修改方法实现,详细信息参见[修改Task内置方法]() +如果Task内置方法不满足您的需求,您可以通过Task支持的Hook机制修改方法实现,详细信息参见[修改Task内置方法](../../tutorial/hook.md) diff --git a/docs/reference/task/text_classify_task.md b/docs/reference/task/text_classify_task.md index 560977fd5134bbc74ee3d74b9f7288a02e5131a2..0f4baf6d9bbc03b2d1e1c5fc6622576b801d1398 100644 --- a/docs/reference/task/text_classify_task.md +++ b/docs/reference/task/text_classify_task.md @@ -2,23 +2,28 @@ 文本分类任务Task,继承自[BaseTask](base_task.md),该Task基于输入的特征,添加一个Dropout层,以及一个或多个全连接层来创建一个文本分类任务用于finetune,度量指标为准确率,损失函数为交叉熵Loss。 ```python hub.TextClassifierTask( - feature, num_classes, feed_list, data_reader, + feature=None, + token_feature=None, startup_program=None, config=None, hidden_units=None, + network=None, metrics_choices="default"): ``` **参数** -* feature (fluid.Variable): 输入的特征矩阵。 + * num_classes (int): 分类任务的类别数量 * feed_list (list): 待feed变量的名字列表 -* data_reader: 提供数据的Reader +* data_reader: 提供数据的Reader,可选为ClassifyReader和LACClassifyReader。 +* feature(fluid.Variable): 输入的sentence-level特征矩阵,shape应为[-1, emb_size]。默认为None。 +* token_feature(fluid.Variable): 输入的token-level特征矩阵,shape应为[-1, seq_len, emb_size]。默认为None。feature和token_feature须指定其中一个。 +* network(str): 文本分类任务PaddleHub预置网络,支持bow,bilstm,cnn,dpcnn,gru,lstm。如果指定network,则应使用token_feature作为输入特征。 * startup_program (fluid.Program): 存储了模型参数初始化op的Program,如果未提供,则使用fluid.default_startup_program() -* config ([RunConfig](../config.md)): 运行配置 +* config ([RunConfig](../config.md)): 运行配置,如设置batch_size,epoch,learning_rate等。 * 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”只计算并输出,不参与最佳模型的判断。 @@ -28,4 +33,4 @@ hub.TextClassifierTask( **示例** -[文本分类](https://github.com/PaddlePaddle/PaddleHub/blob/release/v1.4/demo/text_classification/text_classifier.py) +[文本分类](../../../demo/text_classification/text_cls.py) diff --git a/docs/tutorial/how_to_load_data.md b/docs/tutorial/how_to_load_data.md index b56b0e8eb0b624fe458b9ad6ab81868778a98d30..ac3694e005e0730d7abc8ce2d2fe21215ba7ec6a 100644 --- a/docs/tutorial/how_to_load_data.md +++ b/docs/tutorial/how_to_load_data.md @@ -95,7 +95,7 @@ label_list.txt的格式如下 ``` 示例: -以[DogCat数据集](https://github.com/PaddlePaddle/PaddleHub/wiki/PaddleHub-API:-Dataset#class-hubdatasetdogcatdataset)为示例,train_list.txt/test_list.txt/validate_list.txt内容如下示例 +以[DogCat数据集](../reference/dataset.md#class-hubdatasetdogcatdataset)为示例,train_list.txt/test_list.txt/validate_list.txt内容如下示例 ``` cat/3270.jpg 0 cat/646.jpg 0 diff --git a/paddlehub/network/classification.py b/paddlehub/network/classification.py index 8543d0f091bb21279d8e7fbd396f81f44f5244f7..498f29d3e05268408f72473d5194768f5d884b02 100644 --- a/paddlehub/network/classification.py +++ b/paddlehub/network/classification.py @@ -77,7 +77,8 @@ def dpcnn(token_embeddings, emb_dim=1024, blocks=6): """ - deepcnn net + deepcnn net implemented as ACL2017 'Deep Pyramid Convolutional Neural Networks for Text Categorization' + For more information, please refer to https://www.aclweb.org/anthology/P17-1052.pdf. """ def _block(x):