Browse Source

修正tutorial中若干问题

tags/v0.4.10
yh 5 years ago
parent
commit
d818261219
7 changed files with 114 additions and 78 deletions
  1. +4
    -5
      docs/source/tutorials/tutorial_1_data_preprocess.rst
  2. +3
    -4
      docs/source/tutorials/tutorial_2_vocabulary.rst
  3. +9
    -9
      docs/source/tutorials/tutorial_3_embedding.rst
  4. +28
    -53
      docs/source/tutorials/tutorial_5_loss_optimizer.rst
  5. +3
    -3
      docs/source/tutorials/tutorial_6_datasetiter.rst
  6. +3
    -3
      docs/source/tutorials/tutorial_8_modules_models.rst
  7. +64
    -1
      docs/source/tutorials/tutorial_9_seq_labeling.rst

+ 4
- 5
docs/source/tutorials/tutorial_1_data_preprocess.rst View File

@@ -1,5 +1,5 @@
============================== ==============================
DataSet
fastNLP中的DataSet
============================== ==============================


:class:`~fastNLP.DataSet` 是fastNLP用于承载数据的类,一般训练集、验证集和测试集会被加载为三个单独的 :class:`~fastNLP.DataSet` 对象。 :class:`~fastNLP.DataSet` 是fastNLP用于承载数据的类,一般训练集、验证集和测试集会被加载为三个单独的 :class:`~fastNLP.DataSet` 对象。
@@ -16,8 +16,7 @@ DataSet
每一行是一个instance (在fastNLP中被称为 :mod:`~fastNLP.core.Instance` ), 每一行是一个instance (在fastNLP中被称为 :mod:`~fastNLP.core.Instance` ),
每一列是一个field (在fastNLP中称为 :mod:`~fastNLP.core.FieldArray` )。 每一列是一个field (在fastNLP中称为 :mod:`~fastNLP.core.FieldArray` )。


-----------------------------
数据集构建和删除
DataSet构建和删除
----------------------------- -----------------------------


我们使用传入字典的方式构建一个数据集,这是 :class:`~fastNLP.DataSet` 初始化的最基础的方式 我们使用传入字典的方式构建一个数据集,这是 :class:`~fastNLP.DataSet` 初始化的最基础的方式
@@ -93,7 +92,7 @@ FastNLP 同样提供了多种删除数据的方法 :func:`~fastNLP.DataSet.drop`
# 删除名为'a'的field # 删除名为'a'的field
dataset.delete_field('a') dataset.delete_field('a')


-----------------------------
简单的数据预处理 简单的数据预处理
----------------------------- -----------------------------


@@ -136,7 +135,7 @@ FastNLP 同样提供了多种删除数据的方法 :func:`~fastNLP.DataSet.drop`
除了手动处理数据集之外,你还可以使用 fastNLP 提供的各种 :class:`~fastNLP.io.Loader` 和 :class:`~fastNLP.io.Pipe` 来进行数据处理。 除了手动处理数据集之外,你还可以使用 fastNLP 提供的各种 :class:`~fastNLP.io.Loader` 和 :class:`~fastNLP.io.Pipe` 来进行数据处理。
详细请参考这篇教程 :doc:`使用Loader和Pipe处理数据 </tutorials/tutorial_4_load_dataset>` 。 详细请参考这篇教程 :doc:`使用Loader和Pipe处理数据 </tutorials/tutorial_4_load_dataset>` 。


-----------------------------
fastNLP中field的命名习惯 fastNLP中field的命名习惯
----------------------------- -----------------------------




+ 3
- 4
docs/source/tutorials/tutorial_2_vocabulary.rst View File

@@ -1,10 +1,10 @@
============================== ==============================
Vocabulary
fastNLP中的Vocabulary
============================== ==============================


:class:`~fastNLP.Vocabulary` 是包含字或词与index关系的类,用于将文本转换为index。 :class:`~fastNLP.Vocabulary` 是包含字或词与index关系的类,用于将文本转换为index。


-----------------------------
构建Vocabulary 构建Vocabulary
----------------------------- -----------------------------


@@ -57,7 +57,6 @@ Vocabulary
+---------------------------------------------------+--------+ +---------------------------------------------------+--------+




-----------------------------
一些使用tips 一些使用tips
----------------------------- -----------------------------


@@ -86,7 +85,7 @@ Vocabulary
vocab.from_dataset(tr_data, field_name='chars', no_create_entry_dataset=[dev_data]) vocab.from_dataset(tr_data, field_name='chars', no_create_entry_dataset=[dev_data])




:class:`~fastNLP.Vocabulary` 中的 `no_create_entry` , 建议在添加来自于测试集和验证集的词的时候将该参数置为True, 或将验证集和测试集
:class:`~fastNLP.Vocabulary` 中的 `no_create_entry` , 建议在添加来自于测试集和验证集的词的时候将该参数置为True, 或将验证集和测试集
传入 `no_create_entry_dataset` 参数。它们的意义是在接下来的模型会使用pretrain的embedding(包括glove, word2vec, elmo与bert)且会finetune的 传入 `no_create_entry_dataset` 参数。它们的意义是在接下来的模型会使用pretrain的embedding(包括glove, word2vec, elmo与bert)且会finetune的
情况下,如果仅使用来自于train的数据建立vocabulary,会导致只出现在test与dev中的词语无法充分利用到来自于预训练embedding的信息(因为他们 情况下,如果仅使用来自于train的数据建立vocabulary,会导致只出现在test与dev中的词语无法充分利用到来自于预训练embedding的信息(因为他们
会被认为是unk),所以在建立词表的时候将test与dev考虑进来会使得最终的结果更好。通过与fastNLP中的各种Embedding配合使用,会有如下的效果, 会被认为是unk),所以在建立词表的时候将test与dev考虑进来会使得最终的结果更好。通过与fastNLP中的各种Embedding配合使用,会有如下的效果,


+ 9
- 9
docs/source/tutorials/tutorial_3_embedding.rst View File

@@ -17,7 +17,7 @@
- `Part IX: StaticEmbedding的使用建议`_ - `Part IX: StaticEmbedding的使用建议`_




---------------------------------------
Part I: embedding介绍 Part I: embedding介绍
--------------------------------------- ---------------------------------------


@@ -29,7 +29,7 @@ elmo和character embedding, 需要将word拆分成character才能使用;Bert
大家的使用,fastNLP通过 :class:`~fastNLP.Vocabulary` 统一了不同embedding的使用。下面我们将讲述一些例子来说明一下 大家的使用,fastNLP通过 :class:`~fastNLP.Vocabulary` 统一了不同embedding的使用。下面我们将讲述一些例子来说明一下




---------------------------------------
Part II: 使用预训练的静态embedding Part II: 使用预训练的静态embedding
--------------------------------------- ---------------------------------------


@@ -61,7 +61,7 @@ fastNLP的StaticEmbedding在初始化之后,就和pytorch中的Embedding是类
除了可以通过使用预先提供的Embedding, :class:`~fastNLP.embeddings.StaticEmbedding` 也支持加载本地的预训练词向量,glove, word2vec以及 除了可以通过使用预先提供的Embedding, :class:`~fastNLP.embeddings.StaticEmbedding` 也支持加载本地的预训练词向量,glove, word2vec以及
fasttext格式的。通过将model_dir_or_name修改为本地的embedding文件路径,即可使用本地的embedding。 fasttext格式的。通过将model_dir_or_name修改为本地的embedding文件路径,即可使用本地的embedding。


---------------------------------------
Part III: 使用随机初始化的embedding Part III: 使用随机初始化的embedding
--------------------------------------- ---------------------------------------


@@ -86,7 +86,7 @@ Part III: 使用随机初始化的embedding
torch.Size([1, 5, 30]) torch.Size([1, 5, 30])




-----------------------------------------------------------
Part IV: ELMo Embedding Part IV: ELMo Embedding
----------------------------------------------------------- -----------------------------------------------------------


@@ -136,7 +136,7 @@ Part IV: ELMo Embedding
torch.Size([1, 5, 256]) torch.Size([1, 5, 256])




-----------------------------------------------------------
Part V: Bert Embedding Part V: Bert Embedding
----------------------------------------------------------- -----------------------------------------------------------


@@ -225,7 +225,7 @@ token_type_id将是[0, 0, 0, 1, 1, 1, 0, 0]。但请注意[SEP]一定要大写
.. todo:: .. todo::
找人写一篇BertEmbedding的使用教程 找人写一篇BertEmbedding的使用教程


-----------------------------------------------------
Part VI: 使用character-level的embedding Part VI: 使用character-level的embedding
----------------------------------------------------- -----------------------------------------------------


@@ -272,7 +272,7 @@ CNNCharEmbedding的使用例子如下:


torch.Size([1, 5, 64]) torch.Size([1, 5, 64])


-----------------------------------------------------
Part VII: 叠加使用多个embedding Part VII: 叠加使用多个embedding
----------------------------------------------------- -----------------------------------------------------


@@ -304,7 +304,7 @@ Part VII: 叠加使用多个embedding
必须使用同样的 :class:`~fastNLP.Vocabulary` ,因为只有使用同样的 :class:`~fastNLP.Vocabulary` 才能保证同一个index指向的是同一个词或字 必须使用同样的 :class:`~fastNLP.Vocabulary` ,因为只有使用同样的 :class:`~fastNLP.Vocabulary` 才能保证同一个index指向的是同一个词或字




-----------------------------------------------------------
Part VIII: Embedding的其它说明 Part VIII: Embedding的其它说明
----------------------------------------------------------- -----------------------------------------------------------


@@ -352,7 +352,7 @@ fastNLP中所有的Embedding都支持传入word_dropout和dropout参数,word_d
如果使用 :class:`~fastNLP.embeddings.StackEmbedding` 且需要用到word_dropout,建议将word_dropout设置在 :class:`~fastNLP.embeddings.StackEmbedding` 上。 如果使用 :class:`~fastNLP.embeddings.StackEmbedding` 且需要用到word_dropout,建议将word_dropout设置在 :class:`~fastNLP.embeddings.StackEmbedding` 上。




-----------------------------------------------------------
Part IX: StaticEmbedding的使用建议 Part IX: StaticEmbedding的使用建议
----------------------------------------------------------- -----------------------------------------------------------




+ 28
- 53
docs/source/tutorials/tutorial_5_loss_optimizer.rst View File

@@ -5,7 +5,6 @@
我们使用和 :doc:`/user/quickstart` 中一样的任务来进行详细的介绍。给出一段评价性文字,预测其情感倾向是积极的(label=0)、 我们使用和 :doc:`/user/quickstart` 中一样的任务来进行详细的介绍。给出一段评价性文字,预测其情感倾向是积极的(label=0)、
还是消极的(label=1),使用 :class:`~fastNLP.Trainer` 和 :class:`~fastNLP.Tester` 来进行快速训练和测试。 还是消极的(label=1),使用 :class:`~fastNLP.Trainer` 和 :class:`~fastNLP.Tester` 来进行快速训练和测试。


-----------------
数据读入和处理 数据读入和处理
----------------- -----------------


@@ -27,21 +26,21 @@
pipe = SST2Pipe() pipe = SST2Pipe()
databundle = pipe.process_from_file() databundle = pipe.process_from_file()
vocab = databundle.vocabs['words']
vocab = databundle.get_vocab('words')
print(databundle) print(databundle)
print(databundle.datasets['train'][0])
print(databundle.vocabs['words'])
print(databundle.get_dataset('train')[0])
print(databundle.get_vocab('words'))




输出数据如下:: 输出数据如下::
In total 3 datasets: In total 3 datasets:
test has 1821 instances.
train has 67349 instances.
dev has 872 instances.
test has 1821 instances.
train has 67349 instances.
dev has 872 instances.
In total 2 vocabs: In total 2 vocabs:
words has 16293 entries.
target has 2 entries.
words has 16293 entries.
target has 2 entries.


+-------------------------------------------+--------+--------------------------------------+---------+ +-------------------------------------------+--------+--------------------------------------+---------+
| raw_words | target | words | seq_len | | raw_words | target | words | seq_len |
@@ -51,16 +50,16 @@
Vocabulary(['hide', 'new', 'secretions', 'from', 'the']...) Vocabulary(['hide', 'new', 'secretions', 'from', 'the']...)


除了可以对数据进行读入的Pipe类,fastNLP还提供了读入和下载数据的Loader类,不同数据集的Pipe和Loader及其用法详见 :doc:`/tutorials/tutorial_4_load_dataset` 。
除了可以对数据进行读入的Pipe类,fastNLP还提供了读入和下载数据的Loader类,不同数据集的Pipe和Loader及其用法详见 :doc:` </tutorials/tutorial_4_load_dataset>` 。
数据集分割 数据集分割
由于SST2数据集的测试集并不带有标签数值,故我们分割出一部分训练集作为测试集。下面这段代码展示了 :meth:`~fastNLP.DataSet.split` 的使用方法 由于SST2数据集的测试集并不带有标签数值,故我们分割出一部分训练集作为测试集。下面这段代码展示了 :meth:`~fastNLP.DataSet.split` 的使用方法


.. code-block:: python .. code-block:: python


train_data = databundle.datasets['train']
train_data = databundle.get_dataset('train')
train_data, test_data = train_data.split(0.015) train_data, test_data = train_data.split(0.015)
dev_data = databundle.datasets['dev']
dev_data = databundle.get_dataset('dev')
print(len(train_data),len(dev_data),len(test_data)) print(len(train_data),len(dev_data),len(test_data))


输出结果为:: 输出结果为::
@@ -68,14 +67,17 @@
66339 872 1010 66339 872 1010


数据集 :meth:`~fastNLP.DataSet.set_input` 和 :meth:`~fastNLP.DataSet.set_target` 函数 数据集 :meth:`~fastNLP.DataSet.set_input` 和 :meth:`~fastNLP.DataSet.set_target` 函数
:class:`~fastNLP.io.SST2Pipe` 类的 :meth:`~fastNLP.io.SST2Pipe.process_from_file` 方法在预处理过程中还将训练、测试、验证集的 `words` 、`seq_len` :mod:`~fastNLP.core.field` 设定为input,同时将 `target` :mod:`~fastNLP.core.field` 设定为target。我们可以通过 :class:`~fastNLP.core.Dataset` 类的 :meth:`~fastNLP.core.Dataset.print_field_meta` 方法查看各个 :mod:`~fastNLP.core.field` 的设定情况,代码如下:
:class:`~fastNLP.io.SST2Pipe` 类的 :meth:`~fastNLP.io.SST2Pipe.process_from_file` 方法在预处理过程中还将训练、测试、验证
集的 `words` 、`seq_len` :mod:`~fastNLP.core.field` 设定为input,同时将 `target` :mod:`~fastNLP.core.field` 设定
为target。我们可以通过 :class:`~fastNLP.core.Dataset` 类的 :meth:`~fastNLP.core.Dataset.print_field_meta` 方法查看各个
:mod:`~fastNLP.core.field` 的设定情况,代码如下:


.. code-block:: python .. code-block:: python


train_data.print_field_meta() train_data.print_field_meta()


输出结果为:: 输出结果为::
+-------------+-----------+--------+-------+---------+ +-------------+-----------+--------+-------+---------+
| field_names | raw_words | target | words | seq_len | | field_names | raw_words | target | words | seq_len |
+-------------+-----------+--------+-------+---------+ +-------------+-----------+--------+-------+---------+
@@ -85,11 +87,14 @@
| pad_value | | 0 | 0 | 0 | | pad_value | | 0 | 0 | 0 |
+-------------+-----------+--------+-------+---------+ +-------------+-----------+--------+-------+---------+


其中is_input和is_target分别表示是否为input和target。ignore_type为true时指使用 :class:`~fastNLP.DataSetIter` 取出batch数据时fastNLP不会进行自动padding,pad_value指对应 :mod:`~fastNLP.core.field` padding所用的值,这两者只有当 :mod:`~fastNLP.core.field` 设定为input或者target的时候才有存在的意义。
其中is_input和is_target分别表示是否为input和target。ignore_type为true时指使用 :class:`~fastNLP.DataSetIter` 取出batch数
据时fastNLP不会进行自动padding,pad_value指对应 :mod:`~fastNLP.core.field` padding所用的值,这两者只有
当 :mod:`~fastNLP.core.field` 设定为input或者target的时候才有存在的意义。


is_input为true的 :mod:`~fastNLP.core.field` 在 :class:`~fastNLP.DataSetIter` 迭代取出的 batch_x 中,而 is_target为true的 :mod:`~fastNLP.core.field` 在 :class:`~fastNLP.DataSetIter` 迭代取出的 batch_y 中。具体分析见 :doc:`/tutorials/tutorial_6_datasetiter` 的DataSetIter初探。
is_input为true的 :mod:`~fastNLP.core.field` 在 :class:`~fastNLP.DataSetIter` 迭代取出的batch_x 中,而is_target为true
的 :mod:`~fastNLP.core.field` 在:class:`~fastNLP.DataSetIter` 迭代取出的 batch_y 中。
具体分析见 :doc:`使用DataSetIter实现自定义训练过程 </tutorials/tutorial_6_datasetiter>` 。


---------------------
使用内置模型训练 使用内置模型训练
--------------------- ---------------------
模型定义和初始化 模型定义和初始化
@@ -106,7 +111,7 @@
#还可以传入 kernel_nums, kernel_sizes, padding, dropout的自定义值 #还可以传入 kernel_nums, kernel_sizes, padding, dropout的自定义值
model_cnn = CNNText((len(vocab),EMBED_DIM), num_classes=2, dropout=0.1) model_cnn = CNNText((len(vocab),EMBED_DIM), num_classes=2, dropout=0.1)


使用fastNLP快速搭建自己的模型详见 :doc:`/tutorials/tutorial_8_modules_models` 。
使用fastNLP快速搭建自己的模型详见 :doc:`</tutorials/tutorial_8_modules_models>` 。


评价指标 评价指标
训练模型需要提供一个评价指标。这里使用准确率做为评价指标。 训练模型需要提供一个评价指标。这里使用准确率做为评价指标。
@@ -194,10 +199,10 @@
训练过程的输出如下:: 训练过程的输出如下::


input fields after batch(if batch size is 2): input fields after batch(if batch size is 2):
words: (1)type:torch.Tensor (2)dtype:torch.int64, (3)shape:torch.Size([2, 16])
seq_len: (1)type:torch.Tensor (2)dtype:torch.int64, (3)shape:torch.Size([2])
words: (1)type:torch.Tensor (2)dtype:torch.int64, (3)shape:torch.Size([2, 16])
seq_len: (1)type:torch.Tensor (2)dtype:torch.int64, (3)shape:torch.Size([2])
target fields after batch(if batch size is 2): target fields after batch(if batch size is 2):
target: (1)type:torch.Tensor (2)dtype:torch.int64, (3)shape:torch.Size([2])
target: (1)type:torch.Tensor (2)dtype:torch.int64, (3)shape:torch.Size([2])


training epochs started 2019-09-17-14-29-00 training epochs started 2019-09-17-14-29-00


@@ -205,37 +210,7 @@
Evaluation on dev at Epoch 1/10. Step:4147/41470: Evaluation on dev at Epoch 1/10. Step:4147/41470:
AccuracyMetric: acc=0.762615 AccuracyMetric: acc=0.762615


Evaluate data in 0.19 seconds!
Evaluation on dev at Epoch 2/10. Step:8294/41470:
AccuracyMetric: acc=0.800459

Evaluate data in 0.16 seconds!
Evaluation on dev at Epoch 3/10. Step:12441/41470:
AccuracyMetric: acc=0.777523

Evaluate data in 0.11 seconds!
Evaluation on dev at Epoch 4/10. Step:16588/41470:
AccuracyMetric: acc=0.634174

Evaluate data in 0.11 seconds!
Evaluation on dev at Epoch 5/10. Step:20735/41470:
AccuracyMetric: acc=0.791284

Evaluate data in 0.15 seconds!
Evaluation on dev at Epoch 6/10. Step:24882/41470:
AccuracyMetric: acc=0.573394

Evaluate data in 0.18 seconds!
Evaluation on dev at Epoch 7/10. Step:29029/41470:
AccuracyMetric: acc=0.759174

Evaluate data in 0.17 seconds!
Evaluation on dev at Epoch 8/10. Step:33176/41470:
AccuracyMetric: acc=0.776376

Evaluate data in 0.18 seconds!
Evaluation on dev at Epoch 9/10. Step:37323/41470:
AccuracyMetric: acc=0.740826
...


Evaluate data in 0.2 seconds! Evaluate data in 0.2 seconds!
Evaluation on dev at Epoch 10/10. Step:41470/41470: Evaluation on dev at Epoch 10/10. Step:41470/41470:


+ 3
- 3
docs/source/tutorials/tutorial_6_datasetiter.rst View File

@@ -6,7 +6,7 @@
还是消极的(label=1),使用 :class:`~fastNLP.DataSetIter` 类来编写自己的训练过程。 还是消极的(label=1),使用 :class:`~fastNLP.DataSetIter` 类来编写自己的训练过程。
DataSetIter初探之前的内容与 :doc:`/tutorials/tutorial_5_loss_optimizer` 中的完全一样,如已经阅读过可以跳过。 DataSetIter初探之前的内容与 :doc:`/tutorials/tutorial_5_loss_optimizer` 中的完全一样,如已经阅读过可以跳过。


--------------------
数据读入和预处理 数据读入和预处理
-------------------- --------------------


@@ -115,7 +115,7 @@ DataSetIter初探之前的内容与 :doc:`/tutorials/tutorial_5_loss_optimizer`
# metrics=AccuracyMetric() 在本例中与下面这行代码等价 # metrics=AccuracyMetric() 在本例中与下面这行代码等价
metrics=AccuracyMetric(pred=Const.OUTPUT, target=Const.TARGET) metrics=AccuracyMetric(pred=Const.OUTPUT, target=Const.TARGET)


--------------------------
DataSetIter初探 DataSetIter初探
-------------------------- --------------------------


@@ -313,7 +313,7 @@ Dataset个性化padding


在这里所有的`words`都被pad成了长度为40的list。 在这里所有的`words`都被pad成了长度为40的list。


------------------------------------
使用DataSetIter自己编写训练过程 使用DataSetIter自己编写训练过程
------------------------------------ ------------------------------------
如果你想用类似 PyTorch 的使用方法,自己编写训练过程,可以参考下面这段代码。 如果你想用类似 PyTorch 的使用方法,自己编写训练过程,可以参考下面这段代码。


+ 3
- 3
docs/source/tutorials/tutorial_8_modules_models.rst View File

@@ -6,7 +6,6 @@
下面我们会分三节介绍编写构建模型的具体方法。 下面我们会分三节介绍编写构建模型的具体方法。




----------------------
使用 models 中的模型 使用 models 中的模型
---------------------- ----------------------


@@ -81,8 +80,9 @@ FastNLP 中内置的 models 如下表所示,您可以点击具体的名称查
:class:`~fastNLP.models.STNLICls` ,用于自然语言推断 (NLI) 的 Star-Transformer 模型 :class:`~fastNLP.models.STNLICls` ,用于自然语言推断 (NLI) 的 Star-Transformer 模型
:class:`~fastNLP.models.STSeqCls` , 用于分类任务的 Star-Transformer 模型 :class:`~fastNLP.models.STSeqCls` , 用于分类任务的 Star-Transformer 模型
:class:`~fastNLP.models.BiaffineParser` , Biaffine 依存句法分析网络的实现 :class:`~fastNLP.models.BiaffineParser` , Biaffine 依存句法分析网络的实现
:class:`~fastNLP.models.BiLSTMCRF`, 使用BiLSTM与CRF进行序列标注



----------------------------
使用 nn.torch 编写模型 使用 nn.torch 编写模型
---------------------------- ----------------------------


@@ -137,7 +137,7 @@ FastNLP 完全支持使用 pyTorch 编写的模型,但与 pyTorch 中编写模
(dropout): Dropout(p=0.5) (dropout): Dropout(p=0.5)
) )


----------------------------
使用 modules 编写模型 使用 modules 编写模型
---------------------------- ----------------------------




+ 64
- 1
docs/source/tutorials/tutorial_9_seq_labeling.rst View File

@@ -73,7 +73,7 @@ fastNLP的数据载入主要是由Loader与Pipe两个基类衔接完成的,您
from fastNLP import LossInForward from fastNLP import LossInForward


metric = SpanFPreRecMetric(tag_vocab=data_bundle.get_vocab('target')) metric = SpanFPreRecMetric(tag_vocab=data_bundle.get_vocab('target'))
optimizer = Adam(model.parameters(), lr=1e-4)
optimizer = Adam(model.parameters(), lr=1e-2)
loss = LossInForward() loss = LossInForward()


使用Trainer进行训练 使用Trainer进行训练
@@ -122,3 +122,66 @@ fastNLP的数据载入主要是由Loader与Pipe两个基类衔接完成的,您


tester = Tester(data_bundle.get_dataset('test'), model, metrics=metric) tester = Tester(data_bundle.get_dataset('test'), model, metrics=metric)
tester.test() tester.test()

输出为::

[tester]
SpanFPreRecMetric: f=0.482399, pre=0.530086, rec=0.442584


使用更强的Bert做序列标注
--------------------------------

在fastNLP使用Bert进行任务,您只需要切换为 :class:`fastNLP.embeddings.BertEmbedding` 即可。

.. code-block:: python

from fastNLP.io import WeiboNERPipe
data_bundle = WeiboNERPipe().process_from_file()
data_bundle.rename_field('chars', 'words')

from fastNLP.embeddings import BertEmbedding
embed = BertEmbedding(vocab=data_bundle.get_vocab('words'), model_dir_or_name='cn')
model = BiLSTMCRF(embed=embed, num_classes=len(data_bundle.get_vocab('target')), num_layers=1, hidden_size=200, dropout=0.5,
target_vocab=data_bundle.get_vocab('target'))

from fastNLP import SpanFPreRecMetric
from torch import Adam
from fastNLP import LossInForward
metric = SpanFPreRecMetric(tag_vocab=data_bundle.get_vocab('target'))
optimizer = Adam(model.parameters(), lr=2e-5)
loss = LossInForward()

from fastNLP import Trainer
import torch
device= 0 if torch.cuda.is_available() else 'cpu'
trainer = Trainer(data_bundle.get_dataset('train'), model, loss=loss, optimizer=optimizer, batch_size=12,
dev_data=data_bundle.get_dataset('dev'), metrics=metric, device=device)
trainer.train()

from fastNLP import Tester
tester = Tester(data_bundle.get_dataset('test'), model, metrics=metric)
tester.test()

输出为::

training epochs started 2019-09-25-07-15-43
Evaluate data in 2.02 seconds!
Evaluation on dev at Epoch 1/10. Step:113/1130:
SpanFPreRecMetric: f=0.0, pre=0.0, rec=0.0

...

Evaluate data in 2.17 seconds!
Evaluation on dev at Epoch 10/10. Step:1130/1130:
SpanFPreRecMetric: f=0.647332, pre=0.589852, rec=0.717224

In Epoch:6/Step:678, got best dev performance:
SpanFPreRecMetric: f=0.669963, pre=0.645238, rec=0.696658
Reloaded the best model.

Evaluate data in 1.82 seconds!
[tester]
SpanFPreRecMetric: f=0.641774, pre=0.626424, rec=0.657895

可以看出通过使用Bert,效果有明显的提升,从48.2提升到了64.1。

Loading…
Cancel
Save