# sequence_tagging_ascend
**Repository Path**: zhanglangEB/sequence_tagging_ascend
## Basic Information
- **Project Name**: sequence_tagging_ascend
- **Description**: No description available
- **Primary Language**: Unknown
- **License**: Apache-2.0
- **Default Branch**: master
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 0
- **Forks**: 0
- **Created**: 2021-11-11
- **Last Updated**: 2022-01-07
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
- [基本信息](#基本信息.md)
- [概述](#概述.md)
- [训练环境准备](#训练环境准备.md)
- [快速上手](#快速上手.md)
- [迁移学习指导](#迁移学习指导.md)
- [高级参考](#高级参考.md)
# 基本信息
**发布者(Publisher):Huawei**
**应用领域(Application Domain): Natural Language Processing**
**版本(Version):1.0**
**修改时间(Modified) :2021.01.07**
**大小(Size):25M**
**框架(Framework):TensorFlow 1.15.0**
**模型格式(Model Format):ckpt**
**精度(Precision):Single**
**处理器(Processor):昇腾910**
**应用级别(Categories):Research**
**描述(Description):基于TensorFlow框架的Sequence_Tagging序列标注网络训练代码**
#概述
Sequence_Tagging是一种自然语言处理网络架构,该架构通过使用双向LSTM、CNN和CRF的组合,自动受益于词级和字符级表示。 整个网络是真正的端到端,不需要特征工程或数据预处理,因此适用于广泛的序列标记任务。
- 参考论文:
[Xuezhe Ma, Eduard Hovy. “End-to-end Sequence Labeling via Bi-directional LSTM-CNNs-CRF.” arXiv:1603.01354](https://arxiv.org/pdf/1603.01354.pdf)
- 参考实现:
- 适配昇腾 AI 处理器的实现:
[]()
- 通过Git获取对应commit\_id的代码方法如下:
```
git clone {repository_url} # 克隆仓库的代码
cd {repository_name} # 切换到模型的代码仓目录
git checkout {branch} # 切换到对应分支
git reset --hard {commit_id} # 代码设置到对应的commit_id
cd {code_path} # 切换到模型代码所在路径,若仓库下只有该模型,则无需切换
```
## 默认配置
- 数据集预处理(CoNLL2003语料库):
- 去除数据集中与命名实体识别无关的属性(第2、3列)和DOCSTART行
处理前:
```
-DOCSTART- -X- -X- O
EU NNP B-NP B-ORG
rejects VBZ B-VP O
German JJ B-NP B-MISC
call NN I-NP O
to TO B-VP O
boycott VB I-VP O
British JJ B-NP B-MISC
lamb NN I-NP O
. . O O
```
处理后:
```
EU B-ORG
rejects O
German B-MISC
call O
to O
boycott O
British B-MISC
lamb O
. O
```
- 数据集文件路径
训练集:./data/coNLL/eng/eng.train.iob
测试集:./data/coNLL/eng/eng.testb.iob
验证集:./data/coNLL/eng/eng.testa.iob
- 词向量库预处理:
- glove.6B下载
- 词向量库文件路径
./data/glove.6B
- 训练超参
- Batch size: 10
- Dropout: 0.5
- Learning rate(LR): 0.001
- Learning rate decay: 0.05
- Optimizer: adam
- Gradient clip: 5
- Train epoch: 50
- Max sequence length: 128
- Max word length: 64
## 支持特性
| 特性列表 | 是否支持 |
|-------|------|
| 分布式训练 | 否 |
| 混合精度 | 是 |
| 并行数据 | 否 |
## 混合精度训练
昇腾910 AI处理器提供自动混合精度功能,可以针对全网中float32数据类型的算子,按照内置的优化策略,自动将部分float32的算子降低精度到float16,从而在精度损失很小的情况下提升系统性能并减少内存使用。
## 开启混合精度
当前脚本混合精度默认为关闭状态,开启混合精度需在config.py中使能mix_precision。注意,开启混合精度会对模型的精度造成损失。使能混合精度:
```
# mixed precision
mix_precision = True
loss_scale = 0 # if loss_scale == 0 use dynamic loss scale, else use fixed loss scale.
```
混合精度配置:
```
custom_op.parameter_map["precision_mode"].s = tf.compat.as_bytes("allow_mix_precision")
```
#训练环境准备
1. 硬件环境准备请参见各硬件产品文档"[驱动和固件安装升级指南]( https://support.huawei.com/enterprise/zh/category/ai-computing-platform-pid-1557196528909)"。需要在硬件设备上安装与CANN版本配套的固件与驱动。
2. 宿主机上需要安装Docker并登录[Ascend Hub中心](https://ascendhub.huawei.com/#/detail?name=ascend-tensorflow-arm)获取镜像。
当前模型支持的镜像列表如[表1](#zh-cn_topic_0000001074498056_table1519011227314)所示。
**表 1** 镜像列表
镜像名称
|
镜像版本
|
配套CANN版本
|
|
20.2.0
|
20.2
|
#快速上手
- 数据集准备
1. 模型训练使用CoNLL2003数据集,数据集请用户自行获取。
2. 数据集训练前需要做预处理操作,请参考默认配置中的数据集预处理小结。
3. 数据集处理后,放入sequence_tagging/data目录下,可正常使用。
4. 训练前需初始化数据环境,在数据集和词向量库处理完毕后,执行以下脚本即可完成初始化。
```
python build_data.py
```
## 模型训练
- 单击“立即下载”,并选择合适的下载方式下载源码包。
- 启动训练之前,首先要配置程序运行相关环境变量。
环境变量配置信息参见:
[Ascend 910训练平台环境变量设置](https://gitee.com/ascend/modelzoo/wikis/Ascend%20910%E8%AE%AD%E7%BB%83%E5%B9%B3%E5%8F%B0%E7%8E%AF%E5%A2%83%E5%8F%98%E9%87%8F%E8%AE%BE%E7%BD%AE?sort_id=3148819)
- 训练
```
python train.py --device_target npu
```
- 验证。
```
python evaluate.py --device_target npu
```
#高级参考
## 脚本和示例代码
```
├── build_data.py //创建单词表
├── README.md //代码说明文档
├── train.py //训练模型
├── evaluate.py //评估模型
├── requirements.txt //环境依赖
├── LICENSE.txt //证书
├── data //数据集
│ ├──words.txt //单词
│ ├──tags.txt //标签
│ ├──chars.txt //字母
│ ├──glove.6B.100d.trimmed.npz //词向量
│ ├──coNLL //CoNLL2003数据集
│ │ ├──eng
│ │ │ ├──eng.testa.iob //验证集
│ │ │ ├──eng.testb.iob //测试集
│ │ │ ├──eng.train.iob //训练集
│ ├──glove.6B //词向量库
│ │ ├──glove.6B.50d.txt //50维词向量
│ │ ├──glove.6B.100d.txt //100维词向量
│ │ ├──glove.6B.200d.txt //200维词向量
│ │ ├──glove.6B.300d.txt //300维词向量
├── model //模型
│ ├──__init__.py
│ ├──base_model.py //基础模型
│ ├──ner_model.py //网络结构
│ ├──config.py //参数设置
│ ├──data_utils.py //数据集处理
│ ├──general_utils.py //通用工具
├── results //训练结果
│ ├──test
│ │ ├──events.out.tfevents.XXX //summary文件
│ │ ├──log.txt //日志文件
│ │ ├──model.weights //checkpoint文件
```
## 脚本参数
```
--dir_dataset 数据集路径,默认:./data
--dir_result 训练结果保存路径,默认:./results
--resume 恢复训练的起始epoch,默认:0
--dir_ckpt 评估模型checkpoint路径,默认:./results/model.weights
--dim_word 单词向量纬度,默认:100
--dim_char 字符向量纬度,默认:30
--max_sequence_length 句子中最大单词数量,默认:128
--max_word_length 单词中最大字符数量,默认:64
--dir_glove 词向量库路径,默认:./data
--train_embeddings 是否训练词嵌入向量,默认:False
--epochs 训练epoch数,默认:100
--dropout dropout率,默认:0.5
--batchsize batch size,默认:10
--optimizer 优化算法,默认adam;可选:sgd,momentum,adagrad,rmsprop
--lr 初始学习率,默认:0.001
--lr_decay 学习率衰减率,默认:0.005
--grad_clip 梯度截断,默认:-1(无截断)
--early_stop early stop,默认:10
--mix_precision 是否启用混合精度,默认:False
--loss_scale loss scale,默认:0
--hidden_size_lstm lstm隐含层大小,默认:200
--use_crf 是否启用crf,默认:True
--use_chars 是否使用字符向量,默认:True
--conv_kernel_size cnn卷积核大小,默认:3
--conv_filter_num cnn卷积核数量,默认:30
```
## 训练过程
1. 通过“模型训练”中的训练指令启动训练。
2. 参考脚本的模型存储路径为./results/test,训练脚本log.txt中包括如下信息。
```
2021-12-23 09:46:02,633:INFO: Initializing tf session
2021-12-23 09:46:03,162:INFO: Epoch 1 out of 100
2021-12-23 09:48:05,065:INFO: precision 81.25 - recall 81.51 - f1 81.38
2021-12-23 09:48:05,288:INFO: - new best score!
2021-12-23 09:48:05,288:INFO: Epoch 2 out of 100
2021-12-23 09:50:10,927:INFO: precision 84.37 - recall 84.56 - f1 84.47
2021-12-23 09:50:11,110:INFO: - new best score!
2021-12-23 09:50:11,110:INFO: Epoch 3 out of 100
2021-12-23 09:52:18,773:INFO: precision 86.09 - recall 85.65 - f1 85.87
2021-12-23 09:52:18,955:INFO: - new best score!
2021-12-23 09:52:18,955:INFO: Epoch 4 out of 100
2021-12-23 09:54:22,882:INFO: precision 87.02 - recall 86.00 - f1 86.51
2021-12-23 09:54:23,095:INFO: - new best score!
2021-12-23 09:54:23,096:INFO: Epoch 5 out of 100
2021-12-23 09:56:22,388:INFO: precision 87.50 - recall 87.30 - f1 87.40
2021-12-23 09:56:22,572:INFO: - new best score!
```
## 推理/验证过程
1. 通过“模型训练”中的测试指令启动测试。
2. 当前只能针对该工程训练出的checkpoint进行推理测试。
3. 推理脚本的参数eval_dir可以配置为checkpoint所在的文件夹路径,则该路径下所有.ckpt文件都会根据进行推理。
4. 测试结束后会打印测试集的precision,recall和f1-score,如下所示。
```
Reloading the latest trained model...
Testing model over test set
precision 90.95 - recall 91.09 - f1 91.02
```