fastNLP 中文文档

fastNLP 是一款轻量级的自然语言处理(NLP)工具包。你既可以用它来快速地完成一个NLP任务, 也可以用它在研究中快速构建更复杂的模型。

fastNLP具有如下的特性:

  • 统一的Tabular式数据容器,简化数据预处理过程;
  • 内置多种数据集的 LoaderPipe ,省去预处理代码;
  • 各种方便的NLP工具,例如Embedding加载(包括 ElmoEmbeddingBertEmbedding )、中间数据cache等;
  • 部分 数据集与预训练模型 的自动下载;
  • 提供多种神经网络组件以及复现模型(涵盖中文分词、命名实体识别、句法分析、文本分类、文本匹配、指代消解、摘要等任务);
  • Trainer 提供多种内置 callback 函数,方便实验记录、异常捕获等.

用户手册

安装指南

fastNLP 依赖如下包:

numpy>=1.14.2
torch>=1.0.0
tqdm>=4.28.1
nltk>=3.4.1
requests
spacy
prettytable>=0.7.2

其中torch的安装可能与操作系统及 CUDA 的版本相关,请参见 PyTorch 官网 。 在依赖包安装完成的情况,您可以在命令行执行如下指令完成安装

>>> pip install fastNLP
>>> python -m spacy download en

快速入门

如果你想用 fastNLP 来快速地解决某类 NLP 问题,你可以参考以下教程之一:

文本分类

文本分类(Text classification)任务是将一句话或一段话划分到某个具体的类别。比如垃圾邮件识别,文本情绪分类等。这篇教程可以带你从零开始了解 fastNLP 的使用

注解

本教程推荐使用 GPU 进行实验

1, 商务大床房,房间很大,床有2M宽,整体感觉经济实惠不错!

其中开头的1是只这条评论的标签,表示是正面的情绪。我们将使用到的数据可以通过 此链接 下载并解压,当然也可以通过fastNLP自动下载该数据。

数据中的内容如下图所示。接下来,我们将用fastNLP在这个数据上训练一个分类网络。

jupyter
步骤

一共有以下的几个步骤:

  1. 读取数据
  2. 预处理数据
  3. 选择预训练词向量
  4. 创建模型
  5. 训练模型
(1) 读取数据

fastNLP提供多种数据的自动下载与自动加载功能,对于这里我们要用到的数据,我们可以用 Loader 自动下载并加载该数据。 更多有关Loader的使用可以参考 loader

from fastNLP.io import ChnSentiCorpLoader

loader = ChnSentiCorpLoader()        # 初始化一个中文情感分类的loader
data_dir = loader.download()         # 这一行代码将自动下载数据到默认的缓存地址, 并将该地址返回
data_bundle = loader.load(data_dir)  # 这一行代码将从{data_dir}处读取数据至DataBundle

DataBundle的相关介绍,可以参考 DataBundle 。我们可以打印该data_bundle的基本信息。

print(data_bundle)
In total 3 datasets:
    dev has 1200 instances.
    train has 9600 instances.
    test has 1200 instances.
In total 0 vocabs:

可以看出,该data_bundle中一个含有三个 DataSet 。通过下面的代码,我们可以查看DataSet的基本情况

print(data_bundle.get_dataset('train')[:2])  # 查看Train集前两个sample
+-----------------------------+--------+
| raw_chars                   | target |
+-----------------------------+--------+
| 选择珠江花园的原因就是方...    | 1      |
| 15.4寸笔记本的键盘确实爽...    | 1      |
+-----------------------------+--------+
(2) 预处理数据

在NLP任务中,预处理一般包括:

  1. 将一整句话切分成汉字或者词;
  2. 将文本转换为index

fastNLP中也提供了多种数据集的处理类,这里我们直接使用fastNLP的ChnSentiCorpPipe。更多关于Pipe的说明可以参考 pipe

from fastNLP.io import ChnSentiCorpPipe

pipe = ChnSentiCorpPipe()
data_bundle = pipe.process(data_bundle)  # 所有的Pipe都实现了process()方法,且输入输出都为DataBundle类型

print(data_bundle)  # 打印data_bundle,查看其变化
In total 3 datasets:
    dev has 1200 instances.
    train has 9600 instances.
    test has 1200 instances.
In total 2 vocabs:
    chars has 4409 entries.
    target has 2 entries.

可以看到除了之前已经包含的3个 DataSet ,还新增了两个 Vocabulary 。我们可以打印DataSet中的内容

print(data_bundle.get_dataset('train')[:2])
+-----------------+--------+-----------------+---------+
| raw_chars       | target | chars           | seq_len |
+-----------------+--------+-----------------+---------+
| 选择珠江花园... | 0      | [338, 464, 1... | 106     |
| 15.4寸笔记本... | 0      | [50, 133, 20... | 56      |
+-----------------+--------+-----------------+---------+

新增了一列为数字列表的chars,以及变为数字的target列。可以看出这两列的名称和刚好与data_bundle中两个Vocabulary的名称是一致的,我们可以打印一下Vocabulary看一下里面的内容。

char_vocab = data_bundle.get_vocab('chars')
print(char_vocab)
Vocabulary(['选', '择', '珠', '江', '花']...)

Vocabulary是一个记录着词语与index之间映射关系的类,比如

index = char_vocab.to_index('选')
print("'选'的index是{}".format(index))  # 这个值与上面打印出来的第一个instance的chars的第一个index是一致的
print("index:{}对应的汉字是{}".format(index, char_vocab.to_word(index)))
'选'的index是338
index:338对应的汉字是选
(3) 选择预训练词向量

由于Word2vec, Glove, Elmo, Bert等预训练模型可以增强模型的性能,所以在训练具体任务前,选择合适的预训练词向量非常重要。 在fastNLP中我们提供了多种Embedding使得加载这些预训练模型的过程变得更加便捷。 这里我们先给出一个使用word2vec的中文汉字预训练的示例,之后再给出一个使用Bert的文本分类。 这里使用的预训练词向量为'cn-fastnlp-100d',fastNLP将自动下载该embedding至本地缓存, fastNLP支持使用名字指定的Embedding以及相关说明可以参见 fastNLP.embeddings

from fastNLP.embeddings import StaticEmbedding

word2vec_embed = StaticEmbedding(char_vocab, model_dir_or_name='cn-char-fastnlp-100d')
Found 4321 out of 4409 compound in the pre-training embedding.
(4) 创建模型
from torch import nn
from fastNLP.modules import LSTM
import torch

# 定义模型
class BiLSTMMaxPoolCls(nn.Module):
    def __init__(self, embed, num_classes, hidden_size=400, num_layers=1, dropout=0.3):
        super().__init__()
        self.embed = embed

        self.lstm = LSTM(self.embed.embedding_dim, hidden_size=hidden_size//2, num_layers=num_layers,
                         batch_first=True, bidirectional=True)
        self.dropout_layer = nn.Dropout(dropout)
        self.fc = nn.Linear(hidden_size, num_classes)

    def forward(self, chars, seq_len):  # 这里的名称必须和DataSet中相应的field对应,比如之前我们DataSet中有chars,这里就必须为chars
        # chars:[batch_size, max_len]
        # seq_len: [batch_size, ]
        chars = self.embed(chars)
        outputs, _ = self.lstm(chars, seq_len)
        outputs = self.dropout_layer(outputs)
        outputs, _ = torch.max(outputs, dim=1)
        outputs = self.fc(outputs)

        return {'pred':outputs}  # [batch_size,], 返回值必须是dict类型,且预测值的key建议设为pred

# 初始化模型
model = BiLSTMMaxPoolCls(word2vec_embed, len(data_bundle.get_vocab('target')))
(5) 训练模型

fastNLP提供了Trainer对象来组织训练过程,包括完成loss计算(所以在初始化Trainer的时候需要指定loss类型),梯度更新(所以在初始化Trainer的时候需要提供优化器optimizer)以及在验证集上的性能验证(所以在初始化时需要提供一个Metric)

from fastNLP import Trainer
from fastNLP import CrossEntropyLoss
from torch.optim import Adam
from fastNLP import AccuracyMetric

loss = CrossEntropyLoss()
optimizer = Adam(model.parameters(), lr=0.001)
metric = AccuracyMetric()
device = 0 if torch.cuda.is_available() else 'cpu'  # 如果有gpu的话在gpu上运行,训练速度会更快

trainer = Trainer(train_data=data_bundle.get_dataset('train'), model=model, loss=loss,
                  optimizer=optimizer, batch_size=32, dev_data=data_bundle.get_dataset('dev'),
                  metrics=metric, device=device)
trainer.train()  # 开始训练,训练完成之后默认会加载在dev上表现最好的模型

# 在测试集上测试一下模型的性能
from fastNLP import Tester
print("Performance on test is:")
tester = Tester(data=data_bundle.get_dataset('test'), model=model, metrics=metric, batch_size=64, device=device)
tester.test()
input fields after batch(if batch size is 2):
    target: (1)type:torch.Tensor (2)dtype:torch.int64, (3)shape:torch.Size([2])
    chars: (1)type:torch.Tensor (2)dtype:torch.int64, (3)shape:torch.Size([2, 106])
    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: (1)type:torch.Tensor (2)dtype:torch.int64, (3)shape:torch.Size([2])
    seq_len: (1)type:torch.Tensor (2)dtype:torch.int64, (3)shape:torch.Size([2])

Evaluate data in 0.01 seconds!
training epochs started 2019-09-03-23-57-10

Evaluate data in 0.43 seconds!
Evaluation on dev at Epoch 1/10. Step:300/3000:
AccuracyMetric: acc=0.81

Evaluate data in 0.44 seconds!
Evaluation on dev at Epoch 2/10. Step:600/3000:
AccuracyMetric: acc=0.8675

Evaluate data in 0.44 seconds!
Evaluation on dev at Epoch 3/10. Step:900/3000:
AccuracyMetric: acc=0.878333

....

Evaluate data in 0.48 seconds!
Evaluation on dev at Epoch 9/10. Step:2700/3000:
AccuracyMetric: acc=0.8875

Evaluate data in 0.43 seconds!
Evaluation on dev at Epoch 10/10. Step:3000/3000:
AccuracyMetric: acc=0.895833

In Epoch:7/Step:2100, got best dev performance:
AccuracyMetric: acc=0.8975
Reloaded the best model.

Evaluate data in 0.34 seconds!
[tester]
AccuracyMetric: acc=0.8975

{'AccuracyMetric': {'acc': 0.8975}}
使用Bert进行文本分类
# 只需要切换一下Embedding即可
from fastNLP.embeddings import BertEmbedding

# 这里为了演示一下效果,所以默认Bert不更新权重
bert_embed = BertEmbedding(char_vocab, model_dir_or_name='cn', auto_truncate=True, requires_grad=False)
model = BiLSTMMaxPoolCls(bert_embed, len(data_bundle.get_vocab('target')))


import torch
from fastNLP import Trainer
from fastNLP import CrossEntropyLoss
from torch.optim import Adam
from fastNLP import AccuracyMetric

loss = CrossEntropyLoss()
optimizer = Adam(model.parameters(), lr=2e-5)
metric = AccuracyMetric()
device = 0 if torch.cuda.is_available() else 'cpu'  # 如果有gpu的话在gpu上运行,训练速度会更快

trainer = Trainer(train_data=data_bundle.get_dataset('train'), model=model, loss=loss,
                  optimizer=optimizer, batch_size=16, dev_data=data_bundle.get_dataset('test'),
                  metrics=metric, device=device, n_epochs=3)
trainer.train()  # 开始训练,训练完成之后默认会加载在dev上表现最好的模型

# 在测试集上测试一下模型的性能
from fastNLP import Tester
print("Performance on test is:")
tester = Tester(data=data_bundle.get_dataset('test'), model=model, metrics=metric, batch_size=64, device=device)
tester.test()
loading vocabulary file ~/.fastNLP/embedding/bert-chinese-wwm/vocab.txt
Load pre-trained BERT parameters from file ~/.fastNLP/embedding/bert-chinese-wwm/chinese_wwm_pytorch.bin.
Start to generating word pieces for word.
Found(Or segment into word pieces) 4286 words out of 4409.
input fields after batch(if batch size is 2):
    target: (1)type:torch.Tensor (2)dtype:torch.int64, (3)shape:torch.Size([2])
    chars: (1)type:torch.Tensor (2)dtype:torch.int64, (3)shape:torch.Size([2, 106])
    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: (1)type:torch.Tensor (2)dtype:torch.int64, (3)shape:torch.Size([2])
    seq_len: (1)type:torch.Tensor (2)dtype:torch.int64, (3)shape:torch.Size([2])

Evaluate data in 0.05 seconds!
training epochs started 2019-09-04-00-02-37

Evaluate data in 15.89 seconds!
Evaluation on dev at Epoch 1/3. Step:1200/3600:
AccuracyMetric: acc=0.9

Evaluate data in 15.92 seconds!
Evaluation on dev at Epoch 2/3. Step:2400/3600:
AccuracyMetric: acc=0.904167

Evaluate data in 15.91 seconds!
Evaluation on dev at Epoch 3/3. Step:3600/3600:
AccuracyMetric: acc=0.918333

In Epoch:3/Step:3600, got best dev performance:
AccuracyMetric: acc=0.918333
Reloaded the best model.
Performance on test is:

Evaluate data in 29.24 seconds!
[tester]
AccuracyMetric: acc=0.919167

{'AccuracyMetric': {'acc': 0.919167}}

序列标注

这一部分的内容主要展示如何使用fastNLP实现序列标注(Sequence labeling)任务。您可以使用fastNLP的各个组件快捷,方便地完成序列标注任务,达到出色的效果。 在阅读这篇教程前,希望您已经熟悉了fastNLP的基础使用,尤其是数据的载入以及模型的构建。通过这个小任务,能让您进一步熟悉fastNLP的使用。

注解

本教程推荐使用 GPU 进行实验

命名实体识别(name entity recognition, NER)

命名实体识别任务是从文本中抽取出具有特殊意义或者指代性非常强的实体,通常包括人名、地名、机构名和时间等。 如下面的例子中

我来自复旦大学。

其中“复旦大学”就是一个机构名,命名实体识别就是要从中识别出“复旦大学”这四个字是一个整体,且属于机构名这个类别。这个问题在实际做的时候会被 转换为序列标注问题

针对"我来自复旦大学"这句话,我们的预测目标将是[O, O, O, B-ORG, I-ORG, I-ORG, I-ORG],其中O表示out,即不是一个实体,B-ORG是ORG( organization的缩写)这个类别的开头(Begin),I-ORG是ORG类别的中间(Inside)。

在本tutorial中我们将通过fastNLP尝试写出一个能够执行以上任务的模型。

载入数据

fastNLP的数据载入主要是由Loader与Pipe两个基类衔接完成的,您可以通过 使用Loader和Pipe处理数据 了解如何使用fastNLP提供的数据加载函数。下面我们以微博命名实体任务来演示一下在fastNLP进行序列标注任务。

from fastNLP.io import WeiboNERPipe
data_bundle = WeiboNERPipe().process_from_file()
print(data_bundle.get_dataset('train')[:2])

打印的数据如下

+-------------------------------------------------+------------------------------------------+------------------------------------------+---------+
|                    raw_chars                    |                  target                  |                  chars                   | seq_len |
+-------------------------------------------------+------------------------------------------+------------------------------------------+---------+
| ['一', '节', '课', '的', '时', '间', '真', '... | [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, ... | [8, 211, 775, 3, 49, 245, 89, 26, 101... |    16   |
| ['回', '复', '支', '持', ',', '赞', '成', '... | [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, ... | [116, 480, 127, 109, 2, 446, 134, 2, ... |    59   |
+-------------------------------------------------+------------------------------------------+------------------------------------------+---------+
模型构建

首先选择需要使用的Embedding类型。关于Embedding的相关说明可以参见 使用Embedding模块将文本转成向量 。 在这里我们使用通过word2vec预训练的中文汉字embedding。

from fastNLP.embeddings import StaticEmbedding

embed = StaticEmbedding(vocab=data_bundle.get_vocab('chars'), model_dir_or_name='cn-char-fastnlp-100d')

选择好Embedding之后,我们可以使用fastNLP中自带的 fastNLP.models.BiLSTMCRF 作为模型。

from fastNLP.models import BiLSTMCRF

data_bundle.rename_field('chars', 'words')  # 这是由于BiLSTMCRF模型的forward函数接受的words,而不是chars,所以需要把这一列重新命名
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'))
进行训练

下面我们选择用来评估模型的metric,以及优化用到的优化函数。

from fastNLP import SpanFPreRecMetric
from torch.optim import Adam
from fastNLP import LossInForward

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

使用Trainer进行训练, 您可以通过修改 device 的值来选择显卡。

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,
                    dev_data=data_bundle.get_dataset('dev'), metrics=metric, device=device)
trainer.train()

训练过程输出为:

input fields after batch(if batch size is 2):
    target: (1)type:torch.Tensor (2)dtype:torch.int64, (3)shape:torch.Size([2, 26])
    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, 26])
target fields after batch(if batch size is 2):
    target: (1)type:torch.Tensor (2)dtype:torch.int64, (3)shape:torch.Size([2, 26])
    seq_len: (1)type:torch.Tensor (2)dtype:torch.int64, (3)shape:torch.Size([2])

training epochs started 2019-09-25-10-43-09
Evaluate data in 0.62 seconds!
Evaluation on dev at Epoch 1/10. Step:43/430:
SpanFPreRecMetric: f=0.070352, pre=0.100962, rec=0.053985

...

Evaluate data in 0.61 seconds!
Evaluation on dev at Epoch 10/10. Step:430/430:
SpanFPreRecMetric: f=0.51223, pre=0.581699, rec=0.457584


In Epoch:7/Step:301, got best dev performance:
SpanFPreRecMetric: f=0.515528, pre=0.65098, rec=0.426735
Reloaded the best model.
进行测试

训练结束之后过,可以通过 Tester 测试其在测试集上的性能

from fastNLP import Tester

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

输出为:

[tester]
SpanFPreRecMetric: f=0.482399, pre=0.530086, rec=0.442584
使用更强的Bert做序列标注

在fastNLP使用Bert进行任务,您只需要把 fastNLP.embeddings.StaticEmbedding 切换为 fastNLP.embeddings.BertEmbedding (可修改 device 选择显卡)。

from fastNLP.io import WeiboNERPipe
from fastNLP.models import BiLSTMCRF

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.optim 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。

这些教程是简单地介绍了 fastNLP 的使用流程,其中文本分类相对简单,序列标注则较为复杂。更多的教程分析见 fastNLP 详细使用教程

fastNLP 详细使用教程

这里是更详细的使用教程。对于大部分的用户,我们建议你从第一篇开始顺序阅读;如果你只想了解其中的一部分,也可以进行选读。

fastNLP中的DataSet

DataSet 是fastNLP用于承载数据的类,一般训练集、验证集和测试集会被加载为三个单独的 DataSet 对象。

DataSet 中的数据组织形式类似一个表格,比如下面 DataSet 一共有3列,列在fastNLP中被称为field。

raw_chars chars seq_len
历任公司副总经理、总工程师, [历 任 公 司 副 总 经 理 、 总 工 程 师 ,] 6
Third instance . [Third, instance, .] 3
... [...] ...

每一行是一个instance (在fastNLP中被称为 Instance ), 每一列是一个field (在fastNLP中称为 FieldArray )。

DataSet的构建

我们使用传入字典的方式初始化一个DataSet,这是 DataSet 初始化的最基础的方式

from fastNLP import DataSet
data = {'raw_words':["This is the first instance .", "Second instance .", "Third instance ."],
        'words': [['this', 'is', 'the', 'first', 'instance', '.'], ['Second', 'instance', '.'], ['Third', 'instance', '.']],
        'seq_len': [6, 3, 3]}
dataset = DataSet(data)
# 传入的dict的每个key的value应该为具有相同长度的list
print(dataset)

输出为:

+------------------------------+------------------------------------------------+---------+
|           raw_words          |                     words                      | seq_len |
+------------------------------+------------------------------------------------+---------+
| This is the first instance . | ['this', 'is', 'the', 'first', 'instance', ... |    6    |
|      Second instance .       |          ['Second', 'instance', '.']           |    3    |
|       Third instance .       |           ['Third', 'instance', '.']           |    3    |
+------------------------------+------------------------------------------------+---------+

我们还可以使用 append() 方法向DataSet增加数据

from fastNLP import DataSet
from fastNLP import Instance
dataset = DataSet()
instance = Instance(raw_words="This is the first instance",
                    words=['this', 'is', 'the', 'first', 'instance', '.'],
                    seq_len=6)
dataset.append(instance)
# 可以继续append更多内容,但是append的instance应该和前面的instance拥有完全相同的field

另外,我们还可以用 Instance 数组的方式构建DataSet

from fastNLP import DataSet
from fastNLP import Instance
dataset = DataSet([
    Instance(raw_words="This is the first instance",
        words=['this', 'is', 'the', 'first', 'instance', '.'],
        seq_len=6),
    Instance(raw_words="Second instance .",
        words=['Second', 'instance', '.'],
        seq_len=3)
    ])

在初步构建完DataSet之后,我们可以通过 for 循环遍历 DataSet 中的内容。

for instance in dataset:
    # do something
DataSet的删除

FastNLP 同样提供了多种删除数据的方法 drop()delete_instance()delete_field() 我们先用下面的代码生成一个只有两列的样例DataSet,第一列的值分别为 -5 ~ 4,第二列的值均为 0.

from fastNLP import DataSet
dataset = DataSet({'a': range(-5, 5), 'c': [0]*10})

然后我们使用三种方法进行删除,删除后的DataSet仅包含名为 c 的一列,包含4个值为0 的数据。

# 不改变dataset,生成一个删除了满足条件的instance的新 DataSet
dropped_dataset = dataset.drop(lambda ins:ins['a']<0, inplace=False)
# 在dataset中删除满足条件的instance
dataset.drop(lambda ins:ins['a']<0)
#  删除第3个instance
dataset.delete_instance(2)
#  删除名为'a'的field
dataset.delete_field('a')
简单的数据预处理

因为 fastNLP 中的数据是按列存储的,所以大部分的数据预处理操作是以列( field )为操作对象的。 首先,我们可以检查特定名称的 field 是否存在,并对其进行改名。

#  检查是否存在名为'a'的field
dataset.has_field('a')  # 或 ('a' in dataset)
#  将名为'c'的field改名为'b'
dataset.rename_field('c', 'b')
#  DataSet的长度
len(dataset)

其次,我们可以使用 apply()apply_field() 进行数据预处理操作操作。 使用以上的两个方法需要传入一个函数,函数可以是 lambda 匿名函数,也可以是完整定义的函数,fastNLP将对DataSet遍历地应用该函数。 同时,你还可以用 new_field_name 参数指定函数返回值组成的新 field 的名称。

from fastNLP import DataSet
data = {'raw_words':["This is the first instance .", "Second instance .", "Third instance ."]}
dataset = DataSet(data)

# 将句子分成单词形式, 详见DataSet.apply()方法
dataset.apply(lambda ins: ins['raw_words'].split(), new_field_name='words')

# 或使用DataSet.apply_field()
dataset.apply_field(lambda sent:sent.split(), field_name='raw_words', new_field_name='words')

# 除了匿名函数,也可以定义函数传递进去
def get_words(instance):
    sentence = instance['raw_words']
    words = sentence.split()
    return words
dataset.apply(get_words, new_field_name='words')

除了手动处理数据集之外,你还可以使用 fastNLP 提供的各种 LoaderPipe 来进行数据处理。 详细请参考这篇教程 使用Loader和Pipe处理数据

fastNLP中field的命名习惯

在英文任务中,fastNLP常用的field名称有:

  • raw_words: 表示的是原始的str。例如"This is a demo sentence ."。存在多个raw_words的情况,例如matching任务,它们会被定义为raw_words0, raw_words1。但在conll格式下,raw_words列也可能为["This", "is", "a", "demo", "sentence", "."]的形式。
  • words: 表示的是已经tokenize后的词语。例如["This", "is", "a", "demo", "sentence"], 但由于str并不能直接被神经网络所使用,所以words中的内容往往被转换为int,如[3, 10, 4, 2, 7, ...]等。多列words的情况,会被命名为words0, words1
  • target: 表示目标值。分类场景下,只有一个值;序列标注场景下是一个序列。
  • seq_len: 一般用于表示words列的长度

在中文任务中,fastNLP常用的field名称有:

  • raw_words: 如果原始汉字序列中已经包含了词语的边界,则该列称为raw_words。如"上海 浦东 开发 与 法制 建设 同步"。
  • words: 表示单独的汉字词语序列。例如["上海", "", "浦东", "开发", "与", "法制", "建设", ...]或[2, 3, 4, ...]
  • raw_chars: 表示的是原始的连续汉字序列。例如"这是一个示例。"
  • chars: 表示已经切分为单独的汉字的序列。例如["这", "是", "一", "个", "示", "例", "。"]。但由于神经网络不能识别汉字,所以一般该列会被转为int形式,如[3, 4, 5, 6, ...]。
  • target: 表示目标值。分类场景下,只有一个值;序列标注场景下是一个序列
  • seq_len: 表示输入序列的长度

fastNLP中的Vocabulary

Vocabulary 是包含字或词与index关系的类,用于将文本转换为index。

构建Vocabulary
from fastNLP import Vocabulary

vocab = Vocabulary()
vocab.add_word_lst(['复', '旦', '大', '学'])  # 加入新的字
vocab.add_word('上海')  # `上海`会作为一个整体
vocab.to_index('复')  # 应该会为3
vocab.to_index('我')  # 会输出1,Vocabulary中默认pad的index为0, unk(没有找到的词)的index为1

#  在构建target的Vocabulary时,词表中应该用不上pad和unk,可以通过以下的初始化
vocab = Vocabulary(unknown=None, padding=None)
vocab.add_word_lst(['positive', 'negative'])
vocab.to_index('positive')  # 输出0
vocab.to_index('neutral')  # 会报错,因为没有unk这种情况

除了通过以上的方式建立词表,Vocabulary还可以通过使用下面的函数直接从 DataSet 中的某一列建立词表以及将该列转换为index

from fastNLP import Vocabulary
from fastNLP import DataSet

dataset = DataSet({'chars': [
                                ['今', '天', '天', '气', '很', '好', '。'],
                                ['被', '这', '部', '电', '影', '浪', '费', '了', '两', '个', '小', '时', '。']
                            ],
                    'target': ['neutral', 'negative']
})

vocab = Vocabulary()
#  从该dataset中的chars列建立词表
vocab.from_dataset(dataset, field_name='chars')
#  使用vocabulary将chars列转换为index
vocab.index_dataset(dataset, field_name='chars')

target_vocab = Vocabulary(padding=None, unknown=None)
target_vocab.from_dataset(dataset, field_name='target')
target_vocab.index_dataset(dataset, field_name='target')
print(dataset)

输出内容为:

+---------------------------------------------------+--------+
|                       chars                       | target |
+---------------------------------------------------+--------+
|               [4, 2, 2, 5, 6, 7, 3]               |   0    |
| [8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 3] |   1    |
+---------------------------------------------------+--------+
一些使用tips

在使用from_dataset()函数建立词表时,将测试集和验证集放入参数no_create_entry_dataset中,如下所示

from fastNLP import Vocabulary
from fastNLP import DataSet

tr_data = DataSet({'chars': [
                                ['今', '天', '心', '情', '很', '好', '。'],
                                ['被', '这', '部', '电', '影', '浪', '费', '了', '两', '个', '小', '时', '。']
                            ],
                    'target': ['positive', 'negative']
})
dev_data = DataSet({'chars': [
                                ['住', '宿', '条', '件', '还', '不', '错'],
                                ['糟', '糕', '的', '天', '气', ',', '无', '法', '出', '行', '。']
                            ],
                    'target': ['positive', 'negative']
})

vocab = Vocabulary()
#  将验证集或者测试集在建立词表是放入no_create_entry_dataset这个参数中。
vocab.from_dataset(tr_data, field_name='chars', no_create_entry_dataset=[dev_data])

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

通过与fastNLP中的各种Embedding配合使用,会有如下的效果, 如果一个词出现在了train中,但是没在预训练模型中,embedding会为随机初始化,且它单独的一个vector,如果finetune embedding的话, 这个词在更新之后可能会有更好的表示; 而如果这个词仅出现在了dev或test中,那么就不能为它们单独建立vector,而应该让它指向unk这个vector的 值(当unk的值更新时,这个词也使用的是更新之后的vector)。所以被认为是no_create_entry的token,将首先从预训练的词表中寻找它的表示,如 果找到了,就使用该表示; 如果没有找到,则认为该词的表示应该为unk的表示。

下面我们结合部分 StaticEmbedding 的例子来说明下该值造成的影响,如果您对 StaticEmbedding 不太了解,您可以先参考 使用Embedding模块将文本转成向量 部分再来阅读该部分

import torch
from fastNLP.embeddings import StaticEmbedding
from fastNLP import Vocabulary

vocab = Vocabulary()
vocab.add_word('train')
vocab.add_word('only_in_train')  # 仅在train出现,但肯定在预训练词表中不存在
vocab.add_word('test', no_create_entry=True)  # 该词只在dev或test中出现
vocab.add_word('only_in_test', no_create_entry=True)  # 这个词在预训练的词表中找不到

embed = StaticEmbedding(vocab, model_dir_or_name='en-glove-6b-50d')
print(embed(torch.LongTensor([vocab.to_index('train')])))
print(embed(torch.LongTensor([vocab.to_index('only_in_train')])))
print(embed(torch.LongTensor([vocab.to_index('test')])))
print(embed(torch.LongTensor([vocab.to_index('only_in_test')])))
print(embed(torch.LongTensor([vocab.unknown_idx])))

输出结果(只截取了部分vector):

tensor([[ 0.9497,  0.3433,  0.8450, -0.8852, ...]], grad_fn=<EmbeddingBackward>)  # train,en-glove-6b-50d,找到了该词
tensor([[ 0.0540, -0.0557, -0.0514, -0.1688, ...]], grad_fn=<EmbeddingBackward>)  # only_in_train,en-glove-6b-50d,使用了随机初始化
tensor([[ 0.1318, -0.2552, -0.0679,  0.2619, ...]], grad_fn=<EmbeddingBackward>)  # test,在en-glove-6b-50d中找到了这个词
tensor([[0., 0., 0., 0., 0., ...]], grad_fn=<EmbeddingBackward>)   # only_in_test, en-glove-6b-50d中找不到这个词,使用unk的vector
tensor([[0., 0., 0., 0., 0., ...]], grad_fn=<EmbeddingBackward>)   # unk,使用zero初始化

首先train和test都能够从预训练中找到对应的vector,所以它们是各自的vector表示; only_in_train在预训练中找不到,StaticEmbedding为它 新建了一个entry,所以它有一个单独的vector; 而only_in_test在预训练中找不到改词,因此被指向了unk的值(fastNLP用零向量初始化unk),与最后一行unk的 表示相同。

使用Embedding模块将文本转成向量

这一部分是一个关于在fastNLP当中使用embedding的教程。

教程目录:

Part I: embedding介绍

Embedding是一种词嵌入技术,可以将字或者词转换为实向量。目前使用较多的预训练词嵌入有word2vec, fasttext, glove, character embedding, elmo以及bert。 但使用这些词嵌入方式的时候都需要做一些加载上的处理,比如预训练的word2vec, fasttext以及glove都有着超过几十万个词语的表示,但一般任务大概 只会用到其中的几万个词,如果直接加载所有的词汇,会导致内存占用变大以及训练速度变慢,需要从预训练文件中抽取本次实验的用到的词汇;而对于英文的 elmo和character embedding, 需要将word拆分成character才能使用;Bert的使用更是涉及到了Byte pair encoding(BPE)相关的内容。为了方便 大家的使用,fastNLP通过 Vocabulary 统一了不同embedding的使用。下面我们将讲述一些例子来说明一下

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

在fastNLP中,加载预训练的word2vec, glove以及fasttext都使用的是 StaticEmbedding 。另外,为了方便大家的 使用,fastNLP提供了多种静态词向量的自动下载并缓存(默认缓存到~/.fastNLP/embeddings文件夹下)的功能,支持自动下载的预训练向量可以在 下载文档 查看。

import torch
from fastNLP.embeddings import StaticEmbedding
from fastNLP import Vocabulary

vocab = Vocabulary()
vocab.add_word_lst("this is a demo .".split())

embed = StaticEmbedding(vocab, model_dir_or_name='en-glove-6b-50d')

words = torch.LongTensor([[vocab.to_index(word) for word in "this is a demo .".split()]])  # 将文本转为index
print(embed(words).size())  # StaticEmbedding的使用和pytorch的nn.Embedding是类似的

输出为:

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

fastNLP的StaticEmbedding在初始化之后,就和pytorch中的Embedding是类似的了。 StaticEmbedding 的初始化 主要是从model_dir_or_name提供的词向量中抽取出 Vocabulary 中词语的vector。

除了可以通过使用预先提供的Embedding, StaticEmbedding 也支持加载本地的预训练词向量,glove, word2vec以及 fasttext格式的。通过将model_dir_or_name修改为本地的embedding文件路径,即可使用本地的embedding。

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

有时候需要使用随机初始化的Embedding,也可以通过使用 StaticEmbedding 获得。只需要将model_dir_or_name 置为None,且传入embedding_dim,如下例所示

from fastNLP.embeddings import StaticEmbedding
from fastNLP import Vocabulary

vocab = Vocabulary()
vocab.add_word_lst("this is a demo .".split())

embed = StaticEmbedding(vocab, model_dir_or_name=None, embedding_dim=30)

words = torch.LongTensor([[vocab.to_index(word) for word in "this is a demo .".split()]])
print(embed(words).size())

输出为:

torch.Size([1, 5, 30])
Part IV: ELMo Embedding

在fastNLP中,我们提供了ELMo和BERT的embedding: ElmoEmbeddingBertEmbedding 。可自动下载的ElmoEmbedding可以 从 下载文档 找到。

与静态embedding类似,ELMo的使用方法如下:

from fastNLP.embeddings import ElmoEmbedding
from fastNLP import Vocabulary

vocab = Vocabulary()
vocab.add_word_lst("this is a demo .".split())

embed = ElmoEmbedding(vocab, model_dir_or_name='en-small', requires_grad=False)
words = torch.LongTensor([[vocab.to_index(word) for word in "this is a demo .".split()]])
print(embed(words).size())

输出为:

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

也可以输出多层的ELMo结果,fastNLP将在不同层的结果在最后一维上拼接,下面的代码需要在上面的代码执行结束之后执行

embed = ElmoEmbedding(vocab, model_dir_or_name='en-small', requires_grad=False, layers='1,2')
print(embed(words).size())

输出为:

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

另外,根据 Deep contextualized word representations ,不同层之间使用可学习的权重可以使得ELMo的效果更好,在fastNLP中可以通过以下的初始化 实现3层输出的结果通过可学习的权重进行加法融合。

embed = ElmoEmbedding(vocab, model_dir_or_name='en-small', requires_grad=True, layers='mix')
print(embed(words).size())  # 三层输出按照权重element-wise的加起来

输出为:

torch.Size([1, 5, 256])
Part V: Bert Embedding

虽然Bert并不算严格意义上的Embedding,但通过将Bert封装成Embedding的形式将极大减轻使用的复杂程度。可自动下载的Bert Embedding可以 从 下载文档 找到。我们将使用下面的例子讲述一下 BertEmbedding的使用

from fastNLP.embeddings import BertEmbedding
from fastNLP import Vocabulary

vocab = Vocabulary()
vocab.add_word_lst("this is a demo .".split())

embed = BertEmbedding(vocab, model_dir_or_name='en-base-cased')
words = torch.LongTensor([[vocab.to_index(word) for word in "this is a demo .".split()]])
print(embed(words).size())

输出为:

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

可以通过申明使用指定层数的output也可以使用多层的output,下面的代码需要在上面的代码执行结束之后执行

#  使用后面两层的输出
embed = BertEmbedding(vocab, model_dir_or_name='en-base-cased', layers='10,11')
print(embed(words).size())  # 结果将是在最后一维做拼接

输出为:

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

在Bert中还存在两个特殊的字符[CLS]和[SEP],默认情况下这两个字符是自动加入并且在计算结束之后会自动删除,以使得输入的序列长度和输出的序列 长度是一致的,但是有些分类的情况,必须需要使用[CLS]的表示,这种情况可以通过在初始化时申明一下需要保留[CLS]的表示,如下例所示

embed = BertEmbedding(vocab, model_dir_or_name='en-base-cased', layers='-1', include_cls_sep=True)
print(embed(words).size())  # 结果将在序列维度上增加2
# 取出句子的cls表示
cls_reps = embed(words)[:, 0]  # shape: [batch_size, 768]

输出为:

torch.Size([1, 7, 768])

在英文Bert模型中,一个英文单词可能会被切分为多个subword,例如"fairness"会被拆分为 ["fair", "##ness"] ,这样一个word对应的将有两个输出, BertEmbedding 会使用pooling方法将一个word的subword的表示合并成一个vector,通过pool_method可以控制 该pooling方法,支持的有"first"(即使用fair的表示作为fairness的表示), "last"(使用##ness的表示作为fairness的表示), "max"(对fair和 ##ness在每一维上做max),"avg"(对fair和##ness每一维做average)。

embed = BertEmbedding(vocab, model_dir_or_name='en-base-cased', layers='-1', pool_method='max')
print(embed(words).size())

输出为:

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

另外,根据 BERT: Pre-training of Deep Bidirectional Transformers for Language Understanding , Bert在针对具有两句话的任务时(如matching,Q&A任务),句子之间通过[SEP]拼接起来,前一句话的token embedding为0, 后一句话的token embedding为1。BertEmbedding能够自动识别句子中间的[SEP]来正确设置对应的token_type_id的。

vocab = Vocabulary()
vocab.add_word_lst("this is a demo . [SEP] another sentence .".split())

embed = BertEmbedding(vocab, model_dir_or_name='en-base-cased', layers='-1', pool_method='max')
words = torch.LongTensor([[vocab.to_index(word) for word in "this is a demo . [SEP] another sentence .".split()]])
print(embed(words).size())

输出为:

torch.Size([1, 9, 768])

在多个[SEP]的情况下,将会使token_type_id不断0,1循环。比如"first sentence [SEP] second sentence [SEP] third sentence", 它们的 token_type_id将是[0, 0, 0, 1, 1, 1, 0, 0]。但请注意[SEP]一定要大写的,不能是[sep],否则无法识别。

更多 BertEmbedding 的使用,请参考 BertEmbedding的各种用法

Part VI: 使用character-level的embedding

除了预训练的embedding以外,fastNLP还提供了两种Character Embedding: CNNCharEmbeddingLSTMCharEmbedding 。一般在使用character embedding时,需要在预处理的时候将word拆分成character,这 会使得预处理过程变得非常繁琐。在fastNLP中,使用character embedding也只需要传入 Vocabulary 即可,而且该 Vocabulary与其它Embedding使用的Vocabulary是一致的,下面我们看两个例子。

CNNCharEmbedding的使用例子如下:

from fastNLP.embeddings import CNNCharEmbedding
from fastNLP import Vocabulary

vocab = Vocabulary()
vocab.add_word_lst("this is a demo .".split())

# character的embedding维度大小为50,返回的embedding结果维度大小为64。
embed = CNNCharEmbedding(vocab, embed_size=64, char_emb_size=50)
words = torch.LongTensor([[vocab.to_index(word) for word in "this is a demo .".split()]])
print(embed(words).size())

输出为:

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

与CNNCharEmbedding类似,LSTMCharEmbedding的使用例子如下:

from fastNLP.embeddings import LSTMCharEmbedding
from fastNLP import Vocabulary

vocab = Vocabulary()
vocab.add_word_lst("this is a demo .".split())

# character的embedding维度大小为50,返回的embedding结果维度大小为64。
embed = LSTMCharEmbedding(vocab, embed_size=64, char_emb_size=50)
words = torch.LongTensor([[vocab.to_index(word) for word in "this is a demo .".split()]])
print(embed(words).size())

输出为:

torch.Size([1, 5, 64])
Part VII: 叠加使用多个embedding

单独使用Character Embedding往往效果并不是很好,需要同时结合word embedding。在fastNLP中可以通过 StackEmbedding 来叠加embedding,具体的例子如下所示

from fastNLP.embeddings import StaticEmbedding, StackEmbedding, CNNCharEmbedding
from fastNLP import Vocabulary

vocab = Vocabulary()
vocab.add_word_lst("this is a demo .".split())

word_embed = StaticEmbedding(vocab, model_dir_or_name='en-glove-6b-50d')
char_embed = CNNCharEmbedding(vocab, embed_size=64, char_emb_size=50)
embed = StackEmbedding([word_embed, char_embed])

words = torch.LongTensor([[vocab.to_index(word) for word in "this is a demo .".split()]])
print(embed(words).size())  # 输出embedding的维度为50+64=114

输出为:

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

StaticEmbedding , ElmoEmbedding , CNNCharEmbedding , BertEmbedding 等都可以互相拼接。 StackEmbedding 的使用也是和其它Embedding是一致的,即输出index返回对应的表示。但能够拼接起来的Embedding 必须使用同样的 Vocabulary ,因为只有使用同样的 Vocabulary 才能保证同一个index指向的是同一个词或字

Part VIII: Embedding的其它说明
  1. 获取各种Embedding的dimension
from fastNLP.embeddings import *

vocab = Vocabulary()
vocab.add_word_lst("this is a demo .".split())

static_embed = StaticEmbedding(vocab, model_dir_or_name='en-glove-6b-50d')
print(static_embed.embedding_dim)  # 50
char_embed = CNNCharEmbedding(vocab, embed_size=30)
print(char_embed.embedding_dim)    # 30
elmo_embed_1 = ElmoEmbedding(vocab, model_dir_or_name='en-small', layers='2')
print(elmo_embed_1.embedding_dim)  # 256
elmo_embed_2 = ElmoEmbedding(vocab, model_dir_or_name='en-small', layers='1,2')
print(elmo_embed_2.embedding_dim)  # 512
bert_embed_1 = BertEmbedding(vocab, layers='-1', model_dir_or_name='en-base-cased')
print(bert_embed_1.embedding_dim)  # 768
bert_embed_2 = BertEmbedding(vocab, layers='2,-1', model_dir_or_name='en-base-cased')
print(bert_embed_2.embedding_dim)  # 1536
stack_embed = StackEmbedding([static_embed, char_embed])
print(stack_embed.embedding_dim)  # 80
  1. 设置Embedding的权重是否更新
from fastNLP.embeddings import *

vocab = Vocabulary()
vocab.add_word_lst("this is a demo .".split())

embed = BertEmbedding(vocab, model_dir_or_name='en-base-cased', requires_grad=True)  # 初始化时设定为需要更新
embed.requires_grad = False  # 修改BertEmbedding的权重为不更新
  1. 各种Embedding中word_dropout与dropout的说明

fastNLP中所有的Embedding都支持传入word_dropout和dropout参数,word_dropout指示的是以多大概率将输入的word置为unk的index,这样既可以 是的unk得到训练,也可以有一定的regularize效果; dropout参数是在获取到word的表示之后,以多大概率将一些维度的表示置为0。

如果使用 StackEmbedding 且需要用到word_dropout,建议将word_dropout设置在 StackEmbedding 上。

Part IX: StaticEmbedding的使用建议

在英文的命名实体识别(NER)任务中,由 Named Entity Recognition with Bidirectional LSTM-CNNs 指出,同时使用cnn character embedding和word embedding 会使得NER的效果有比较大的提升。正如你在上节中看到的那样,fastNLP支持将 CNNCharEmbeddingStaticEmbedding 拼成一个 StackEmbedding 。如果通过这种方式使用,需要 在预处理文本时,不要将词汇小写化(因为Character Embedding需要利用词语中的大小写信息)且不要将出现频次低于某个阈值的word设置为unk(因为 Character embedding需要利用字形信息);但 StaticEmbedding 使用的某些预训练词嵌入的词汇表中只有小写的词 语, 且某些低频词并未在预训练中出现需要被剔除。即(1) character embedding需要保留大小写,而预训练词向量不需要保留大小写。(2) character embedding需要保留所有的字形, 而static embedding需要设置一个最低阈值以学到更好的表示。

  1. fastNLP如何解决关于大小写的问题

fastNLP通过在 StaticEmbedding 增加了一个lower参数解决该问题。如下面的例子所示

from fastNLP.embeddings import StaticEmbedding
from fastNLP import Vocabulary

vocab = Vocabulary().add_word_lst("The the a A".split())
#  下面用随机的StaticEmbedding演示,但与使用预训练词向量时效果是一致的
embed = StaticEmbedding(vocab, model_name_or_dir=None, embedding_dim=5)
print(embed(torch.LongTensor([vocab.to_index('The')])))
print(embed(torch.LongTensor([vocab.to_index('the')])))

输出为:

tensor([[-0.4685,  0.4572,  0.5159, -0.2618, -0.6871]], grad_fn=<EmbeddingBackward>)
tensor([[ 0.2615,  0.1490, -0.2491,  0.4009, -0.3842]], grad_fn=<EmbeddingBackward>)

可以看到"The"与"the"的vector是不一致的。但如果我们在初始化 StaticEmbedding 将lower设置为True,效果将 如下所示

from fastNLP.embeddings import StaticEmbedding
from fastNLP import Vocabulary

vocab = Vocabulary().add_word_lst("The the a A".split())
#  下面用随机的StaticEmbedding演示,但与使用预训练时效果是一致的
embed = StaticEmbedding(vocab, model_name_or_dir=None, embedding_dim=5, lower=True)
print(embed(torch.LongTensor([vocab.to_index('The')])))
print(embed(torch.LongTensor([vocab.to_index('the')])))

输出为:

tensor([[-0.2237,  0.6825, -0.3459, -0.1795,  0.7516]], grad_fn=<EmbeddingBackward>)
tensor([[-0.2237,  0.6825, -0.3459, -0.1795,  0.7516]], grad_fn=<EmbeddingBackward>)

可以看到"The"与"the"的vector是一致的。他们实际上也是引用的同一个vector。通过将lower设置为True,可以在 StaticEmbedding 实现类似具备相同小写结果的词语引用同一个vector。

  1. fastNLP如何解决min_freq的问题

fastNLP通过在 StaticEmbedding 增加了一个min_freq参数解决该问题。如下面的例子所示

from fastNLP.embeddings import StaticEmbedding
from fastNLP import Vocabulary

vocab = Vocabulary().add_word_lst("the the the a".split())
#  下面用随机的StaticEmbedding演示,但与使用预训练时效果是一致的
embed = StaticEmbedding(vocab, model_name_or_dir=None, embedding_dim=5, min_freq=2)
print(embed(torch.LongTensor([vocab.to_index('the')])))
print(embed(torch.LongTensor([vocab.to_index('a')])))
print(embed(torch.LongTensor([vocab.unknown_idx])))

输出为:

tensor([[ 0.0454,  0.3375,  0.6758, -0.2026, -0.4715]], grad_fn=<EmbeddingBackward>)
tensor([[-0.7602,  0.0149,  0.2733,  0.3974,  0.7371]], grad_fn=<EmbeddingBackward>)
tensor([[-0.7602,  0.0149,  0.2733,  0.3974,  0.7371]], grad_fn=<EmbeddingBackward>)

其中最后一行为unknown值的vector,可以看到a的vector表示与unknown是一样的,这是由于a的频次低于了2,所以被指向了unknown的表示;而the由于 词频超过了2次,所以它是单独的表示。

在计算min_freq时,也会考虑到lower的作用,比如

from fastNLP.embeddings import StaticEmbedding
from fastNLP import Vocabulary

vocab = Vocabulary().add_word_lst("the the the a A".split())
#  下面用随机的StaticEmbedding演示,但与使用预训练时效果是一致的
embed = StaticEmbedding(vocab, model_name_or_dir=None, embedding_dim=5, min_freq=2, lower=True)
print(embed(torch.LongTensor([vocab.to_index('the')])))
print(embed(torch.LongTensor([vocab.to_index('a')])))
print(embed(torch.LongTensor([vocab.to_index('A')])))
print(embed(torch.LongTensor([vocab.unknown_idx])))

输出为:

tensor([[-0.7453, -0.5542,  0.5039,  0.6195, -0.4723]], grad_fn=<EmbeddingBackward>)  # the
tensor([[ 0.0170, -0.0995, -0.5743, -0.2469, -0.2095]], grad_fn=<EmbeddingBackward>)  # a
tensor([[ 0.0170, -0.0995, -0.5743, -0.2469, -0.2095]], grad_fn=<EmbeddingBackward>)  # A
tensor([[ 0.6707, -0.5786, -0.6967,  0.0111,  0.1209]], grad_fn=<EmbeddingBackward>)  # unk

可以看到a不再和最后一行的unknown共享一个表示了,这是由于a与A都算入了a的词频,且A的表示也是a的表示。

使用Loader和Pipe加载并处理数据集

这一部分是关于如何加载数据集的教程

教程目录:

Part I: 数据集容器DataBundle

而由于对于同一个任务,训练集,验证集和测试集会共用同一个词表以及具有相同的目标值,所以在fastNLP中我们使用了 DataBundle 来承载同一个任务的多个数据集 DataSet 以及它们的词表 Vocabulary 。下面会有例子介绍 DataBundle 的相关使用。

DataBundle 在fastNLP中主要在各个 LoaderPipe 中被使用。 下面我们先介绍一下 LoaderPipe

Part II: 加载的各种数据集的Loader

在fastNLP中,所有的 Loader 都可以通过其文档判断其支持读取的数据格式,以及读取之后返回的 DataSet 的格式, 例如 ChnSentiCorpLoader

  • download() 函数:自动将该数据集下载到缓存地址,默认缓存地址为~/.fastNLP/datasets/。由于版权等原因,不是所有的Loader都实现了该方法。该方法会返回下载后文件所处的缓存地址。

  • _load() 函数:从一个数据文件中读取数据,返回一个 DataSet 。返回的DataSet的格式可从Loader文档判断。

  • load() 函数:从文件或者文件夹中读取数据为 DataSet 并将它们组装成 DataBundle。支持接受的参数类型有以下的几种

    • None, 将尝试读取自动缓存的数据,仅支持提供了自动下载数据的Loader
    • 文件夹路径, 默认将尝试在该文件夹下匹配文件名中含有 train , test , dev 的文件,如果有多个文件含有相同的关键字,将无法通过该方式读取
    • dict, 例如{'train':"/path/to/tr.conll", 'dev':"/to/validate.conll", "test":"/to/te.conll"}。
from fastNLP.io import CWSLoader

loader = CWSLoader(dataset_name='pku')
data_bundle = loader.load()
print(data_bundle)

输出内容为:

In total 3 datasets:
    dev has 1831 instances.
    train has 17223 instances.
    test has 1944 instances.

这里表示一共有3个数据集。其中:

  • 3个数据集的名称分别为train、dev、test,分别有17223、1831、1944个instance

也可以取出DataSet,并打印DataSet中的具体内容

tr_data = data_bundle.get_dataset('train')
print(tr_data[:2])

输出为:

+--------------------------------------------------------------------------------------+
|                                      raw_words                                       |
+--------------------------------------------------------------------------------------+
| 迈向  充满  希望  的  新  世纪  ——  一九九八年  新年  讲话  (  附  图片  1  张  )        |
|                      中共中央  总书记  、  国家  主席  江  泽民                          |
+--------------------------------------------------------------------------------------+
Part III: 使用Pipe对数据集进行预处理

通过 Loader 可以将文本数据读入,但并不能直接被神经网络使用,还需要进行一定的预处理。

在fastNLP中,我们使用 Pipe 的子类作为数据预处理的类, LoaderPipe 一般具备一一对应的关系,该关系可以从其名称判断, 例如 CWSLoaderCWSPipe 是一一对应的。一般情况下Pipe处理包含以下的几个过程,(1)将raw_words或 raw_chars进行tokenize以切分成不同的词或字; (2) 再建立词或字的 Vocabulary , 并将词或字转换为index; (3)将target 列建立词表并将target列转为index;

所有的Pipe都可通过其文档查看该Pipe支持处理的 DataSet 以及返回的 DataBundle 中的Vocabulary的情况; 如 OntoNotesNERPipe

各种数据集的Pipe当中,都包含了以下的两个函数:

  • process() 函数:对输入的 DataBundle 进行处理, 然后返回处理之后的 DataBundle 。process函数的文档中包含了该Pipe支持处理的DataSet的格式。
  • process_from_file() 函数:输入数据集所在文件夹,使用对应的Loader读取数据(所以该函数支持的参数类型是由于其对应的Loader的load函数决定的),然后调用相对应的process函数对数据进行预处理。相当于是把Load和process放在一个函数中执行。

接着上面 CWSLoader 的例子,我们展示一下 CWSPipe 的功能:

from fastNLP.io import CWSPipe

data_bundle = CWSPipe().process(data_bundle)
print(data_bundle)

输出内容为:

In total 3 datasets:
    dev has 1831 instances.
    train has 17223 instances.
    test has 1944 instances.
In total 2 vocabs:
    chars has 4777 entries.
    target has 4 entries.

表示一共有3个数据集和2个词表。其中:

  • 3个数据集的名称分别为train、dev、test,分别有17223、1831、1944个instance
  • 2个词表分别为chars词表与target词表。其中chars词表为句子文本所构建的词表,一共有4777个不同的字;target词表为目标标签所构建的词表,一共有4种标签。

相较于之前CWSLoader读取的DataBundle,新增了两个Vocabulary。 我们可以打印一下处理之后的DataSet

tr_data = data_bundle.get_dataset('train')
print(tr_data[:2])

输出为:

+---------------------------------------------------+------------------------------------+------------------------------------+---------+
|                     raw_words                     |               chars                |               target               | seq_len |
+---------------------------------------------------+------------------------------------+------------------------------------+---------+
| 迈向  充满  希望  的  新  世纪  ——  一九九八年...     | [1224, 178, 674, 544, 573, 435,... | [0, 1, 0, 1, 0, 1, 2, 2, 0, 1, ... |    29   |
|     中共中央  总书记  、  国家  主席  江  泽民        | [11, 212, 11, 335, 124, 256, 10... | [0, 3, 3, 1, 0, 3, 1, 2, 0, 1, ... |    15   |
+---------------------------------------------------+------------------------------------+------------------------------------+---------+

可以看到有两列为int的field: chars和target。这两列的名称同时也是DataBundle中的Vocabulary的名称。可以通过下列的代码获取并查看Vocabulary的 信息

vocab = data_bundle.get_vocab('target')
print(vocab)

输出为:

Vocabulary(['B', 'E', 'S', 'M']...)
Part IV: fastNLP封装好的Loader和Pipe

fastNLP封装了多种任务/数据集的 LoaderPipe 并提供自动下载功能,具体参见文档 数据集

Part V: 不同格式类型的基础Loader

除了上面提到的针对具体任务的Loader,我们还提供了CSV格式和JSON格式的Loader

CSVLoader 读取CSV类型的数据集文件。例子如下:

from fastNLP.io.loader import CSVLoader
data_set_loader = CSVLoader(
    headers=('raw_words', 'target'), sep='\t'
)
# 表示将CSV文件中每一行的第一项将填入'raw_words' field,第二项填入'target' field。
# 其中项之间由'\t'分割开来

data_set = data_set_loader._load('path/to/your/file')

文件内容样例如下

But it does not leave you with much .   1
You could hate it for the same reason . 1
The performances are an absolute joy .  4

读取之后的DataSet具有以下的field

raw_words target
But it does not leave you with much . 1
You could hate it for the same reason . 1
The performances are an absolute joy . 4

JsonLoader 读取Json类型的数据集文件,数据必须按行存储,每行是一个包含各类属性的Json对象。例子如下:

from fastNLP.io.loader import JsonLoader
loader = JsonLoader(
    fields={'sentence1': 'raw_words1', 'sentence2': 'raw_words2', 'gold_label': 'target'}
)
# 表示将Json对象中'sentence1'、'sentence2'和'gold_label'对应的值赋给'raw_words1'、'raw_words2'、'target'这三个fields

data_set = loader._load('path/to/your/file')

数据集内容样例如下

{"annotator_labels": ["neutral"], "captionID": "3416050480.jpg#4", "gold_label": "neutral", "pairID": "3416050480.jpg#4r1n", "sentence1": "A person on a horse jumps over a broken down airplane.", "sentence1_binary_parse": "( ( ( A person ) ( on ( a horse ) ) ) ( ( jumps ( over ( a ( broken ( down airplane ) ) ) ) ) . ) )", "sentence1_parse": "(ROOT (S (NP (NP (DT A) (NN person)) (PP (IN on) (NP (DT a) (NN horse)))) (VP (VBZ jumps) (PP (IN over) (NP (DT a) (JJ broken) (JJ down) (NN airplane)))) (. .)))", "sentence2": "A person is training his horse for a competition.", "sentence2_binary_parse": "( ( A person ) ( ( is ( ( training ( his horse ) ) ( for ( a competition ) ) ) ) . ) )", "sentence2_parse": "(ROOT (S (NP (DT A) (NN person)) (VP (VBZ is) (VP (VBG training) (NP (PRP$ his) (NN horse)) (PP (IN for) (NP (DT a) (NN competition))))) (. .)))"}
{"annotator_labels": ["contradiction"], "captionID": "3416050480.jpg#4", "gold_label": "contradiction", "pairID": "3416050480.jpg#4r1c", "sentence1": "A person on a horse jumps over a broken down airplane.", "sentence1_binary_parse": "( ( ( A person ) ( on ( a horse ) ) ) ( ( jumps ( over ( a ( broken ( down airplane ) ) ) ) ) . ) )", "sentence1_parse": "(ROOT (S (NP (NP (DT A) (NN person)) (PP (IN on) (NP (DT a) (NN horse)))) (VP (VBZ jumps) (PP (IN over) (NP (DT a) (JJ broken) (JJ down) (NN airplane)))) (. .)))", "sentence2": "A person is at a diner, ordering an omelette.", "sentence2_binary_parse": "( ( A person ) ( ( ( ( is ( at ( a diner ) ) ) , ) ( ordering ( an omelette ) ) ) . ) )", "sentence2_parse": "(ROOT (S (NP (DT A) (NN person)) (VP (VBZ is) (PP (IN at) (NP (DT a) (NN diner))) (, ,) (S (VP (VBG ordering) (NP (DT an) (NN omelette))))) (. .)))"}
{"annotator_labels": ["entailment"], "captionID": "3416050480.jpg#4", "gold_label": "entailment", "pairID": "3416050480.jpg#4r1e", "sentence1": "A person on a horse jumps over a broken down airplane.", "sentence1_binary_parse": "( ( ( A person ) ( on ( a horse ) ) ) ( ( jumps ( over ( a ( broken ( down airplane ) ) ) ) ) . ) )", "sentence1_parse": "(ROOT (S (NP (NP (DT A) (NN person)) (PP (IN on) (NP (DT a) (NN horse)))) (VP (VBZ jumps) (PP (IN over) (NP (DT a) (JJ broken) (JJ down) (NN airplane)))) (. .)))", "sentence2": "A person is outdoors, on a horse.", "sentence2_binary_parse": "( ( A person ) ( ( ( ( is outdoors ) , ) ( on ( a horse ) ) ) . ) )", "sentence2_parse": "(ROOT (S (NP (DT A) (NN person)) (VP (VBZ is) (ADVP (RB outdoors)) (, ,) (PP (IN on) (NP (DT a) (NN horse)))) (. .)))"}

读取之后的DataSet具有以下的field

raw_words0 raw_words1 target
A person on a horse jumps over a broken down airplane. A person is training his horse for a competition. neutral
A person on a horse jumps over a broken down airplane. A person is at a diner, ordering an omelette. contradiction
A person on a horse jumps over a broken down airplane. A person is outdoors, on a horse. entailment

使用Trainer和Tester快速训练和测试

我们使用前面介绍过的 文本分类 任务来进行详细的介绍。这里我们把数据集换成了SST2,使用 TrainerTester 来进行快速训练和测试。

注解

本教程中的代码没有使用 GPU 。读者可以自行修改代码,扩大数据量并使用 GPU 进行训练。

数据读入和处理
数据读入

我们可以使用 fastNLP fastNLP.io 模块中的 SST2Pipe 类,轻松地读取以及预处理SST2数据集。SST2Pipe 对象的 process_from_file() 方法能够对读入的SST2数据集进行数据的预处理,方法的参数为paths, 指要处理的文件所在目录,如果paths为None,则会自动下载数据集,函数默认paths值为None。 此函数返回一个 DataBundle,包含SST2数据集的训练集、测试集、验证集以及source端和target端的字典。其训练、测试、验证数据集含有四个 field

  • raw_words: 原source句子
  • target: 标签值
  • words: index之后的raw_words
  • seq_len: 句子长度

读入数据代码如下:

from fastNLP.io import SST2Pipe

pipe = SST2Pipe()
databundle = pipe.process_from_file()
vocab = databundle.get_vocab('words')
print(databundle)
print(databundle.get_dataset('train')[0])
print(databundle.get_vocab('words'))

输出数据如下:

In total 3 datasets:
    test has 1821 instances.
    train has 67349 instances.
    dev has 872 instances.
In total 2 vocabs:
    words has 16293 entries.
    target has 2 entries.

+-------------------------------------------+--------+--------------------------------------+---------+
|                 raw_words                 | target |                words                 | seq_len |
+-------------------------------------------+--------+--------------------------------------+---------+
| hide new secretions from the parental ... |   1    | [4111, 98, 12010, 38, 2, 6844, 9042] |    7    |
+-------------------------------------------+--------+--------------------------------------+---------+

Vocabulary(['hide', 'new', 'secretions', 'from', 'the']...)

除了可以对数据进行读入的Pipe类,fastNLP还提供了读入和下载数据的Loader类,不同数据集的Pipe和Loader及其用法详见 使用Loader和Pipe加载并处理数据集

数据集分割

由于SST2数据集的测试集并不带有标签数值,故我们分割出一部分训练集作为测试集。下面这段代码展示了 split() 的使用方法, 为了能让读者快速运行完整个教程,我们只取了训练集的前5000个数据。

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

输出结果为:

4925 872 75
数据集 set_input()set_target() 函数

SST2Pipe 类的 process_from_file() 方法在预处理过程中还将训练、测试、验证 集的 wordsseq_len field 设定为input,同时将 target field 设定 为target。我们可以通过 Dataset 类的 print_field_meta() 方法查看各个 field 的设定情况,代码如下:

train_data.print_field_meta()

输出结果为:

+-------------+-----------+--------+-------+---------+
| field_names | raw_words | target | words | seq_len |
+-------------+-----------+--------+-------+---------+
|   is_input  |   False   | False  |  True |   True  |
|  is_target  |   False   |  True  | False |  False  |
| ignore_type |           | False  | False |  False  |
|  pad_value  |           |   0    |   0   |    0    |
+-------------+-----------+--------+-------+---------+

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

is_input为true的 fieldDataSetIter 迭代取出的batch_x 中,而is_target为true 的 fieldDataSetIter 迭代取出的 batch_y 中。 具体分析见 使用DataSetIter实现自定义训练过程

使用内置模型训练
模型定义和初始化

我们可以导入 fastNLP 内置的文本分类模型 CNNText 来对模型进行定义,代码如下:

from fastNLP.models import CNNText

#词嵌入的维度
EMBED_DIM = 100

#使用CNNText的时候第一个参数输入一个tuple,作为模型定义embedding的参数
#还可以传入 kernel_nums, kernel_sizes, padding, dropout的自定义值
model_cnn = CNNText((len(vocab),EMBED_DIM), num_classes=2, dropout=0.1)

使用fastNLP快速搭建自己的模型详见 使用Modules和Models快速搭建自定义模型

评价指标

训练模型需要提供一个评价指标。这里使用准确率做为评价指标。

  • pred 参数对应的是模型的 forward 方法返回的 dict 中的一个 key 的名字。
  • target 参数对应的是 DataSet 中作为标签的 field 的名字。

这里我们用 Const 来辅助命名,如果你自己编写模型中 forward 方法的返回值或 数据集中 field 的名字与本例不同, 你可以把 pred 参数和 target 参数设定符合自己代码的值。代码如下:

from fastNLP import AccuracyMetric
from fastNLP import Const

# metrics=AccuracyMetric() 在本例中与下面这行代码等价
metrics=AccuracyMetric(pred=Const.OUTPUT, target=Const.TARGET)
损失函数

训练模型需要提供一个损失函数 ,fastNLP中提供了直接可以导入使用的四种loss,分别为:

  • CrossEntropyLoss:包装了torch.nn.functional.cross_entropy()函数,返回交叉熵损失(可以运用于多分类场景)
  • BCELoss:包装了torch.nn.functional.binary_cross_entropy()函数,返回二分类的交叉熵
  • L1Loss:包装了torch.nn.functional.l1_loss()函数,返回L1 损失
  • NLLLoss:包装了torch.nn.functional.nll_loss()函数,返回负对数似然损失

下面提供了一个在分类问题中常用的交叉熵损失。注意它的 初始化参数

  • pred 参数对应的是模型的 forward 方法返回的 dict 中的一个 key 的名字。
  • target 参数对应的是 DataSet 中作为标签的 field 的名字。

这里我们用 Const 来辅助命名,如果你自己编写模型中 forward 方法的返回值或 数据集中 field 的名字与本例不同, 你可以把 pred 参数和 target 参数设定符合自己代码的值。

from fastNLP import CrossEntropyLoss

# loss = CrossEntropyLoss() 在本例中与下面这行代码等价
loss = CrossEntropyLoss(pred=Const.OUTPUT, target=Const.TARGET)

除了使用fastNLP已经包装好的了损失函数,也可以通过fastNLP中的LossFunc类来构建自己的损失函数,方法如下:

# 这表示构建了一个损失函数类,由func计算损失函数,其中将从模型返回值或者DataSet的target=True的field
# 当中找到一个参数名为`pred`的参数传入func一个参数名为`input`的参数;找到一个参数名为`label`的参数
# 传入func作为一个名为`target`的参数
#下面自己构建了一个交叉熵函数,和之后直接使用fastNLP中的交叉熵函数是一个效果
import torch
from fastNLP import LossFunc
func = torch.nn.functional.cross_entropy
loss_func = LossFunc(func, input=Const.OUTPUT, target=Const.TARGET)
优化器

定义模型运行的时候使用的优化器,可以直接使用torch.optim.Optimizer中的优化器,并在实例化 Trainer 类的时候传入优化器实参

import torch.optim as optim

#使用 torch.optim 定义优化器
optimizer=optim.RMSprop(model_cnn.parameters(), lr=0.01, alpha=0.99, eps=1e-08, weight_decay=0, momentum=0, centered=False)
快速训练

现在我们对上面定义的模型使用 Trainer 进行训练。 除了使用 DataSetIter 来编写自己的训练过程,具体见 使用DataSetIter实现自定义训练过程

from fastNLP import Trainer

#训练的轮数和batch size
N_EPOCHS = 10
BATCH_SIZE = 16

#如果在定义trainer的时候没有传入optimizer参数,模型默认的优化器为torch.optim.Adam且learning rate为lr=4e-3
#这里只使用了loss作为损失函数输入,感兴趣可以尝试其他损失函数(如之前自定义的loss_func)作为输入
trainer = Trainer(model=model_cnn, train_data=train_data, dev_data=dev_data, loss=loss, metrics=metrics,
optimizer=optimizer,n_epochs=N_EPOCHS, batch_size=BATCH_SIZE)
trainer.train()

训练过程的输出如下:

input fields after batch(if batch size is 2):
    words: (1)type:torch.Tensor (2)dtype:torch.int64, (3)shape:torch.Size([2, 13])
    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: (1)type:torch.Tensor (2)dtype:torch.int64, (3)shape:torch.Size([2])

training epochs started 2020-02-26-16-45-40
Evaluate data in 0.5 seconds!
Evaluation on dev at Epoch 1/10. Step:308/3080:
AccuracyMetric: acc=0.677752

......

Evaluate data in 0.44 seconds!
Evaluation on dev at Epoch 10/10. Step:3080/3080:
AccuracyMetric: acc=0.725917


In Epoch:5/Step:1540, got best dev performance:
AccuracyMetric: acc=0.740826
Reloaded the best model.
快速测试

Trainer 对应,fastNLP 也提供了 Tester 用于快速测试,用法如下

from fastNLP import Tester

tester = Tester(test_data, model_cnn, metrics=AccuracyMetric())
tester.test()

训练过程输出如下:

Evaluate data in 0.43 seconds!
[tester]
AccuracyMetric: acc=0.773333

使用DataSetIter实现自定义训练过程

我们使用前面介绍过的 文本分类 任务来进行详细的介绍。这里我们把数据集换成了SST2,使用 DataSetIter 类来编写自己的训练过程。 DataSetIter初探之前的内容与 使用Trainer和Tester快速训练和测试 中的完全一样,如已经阅读过可以跳过。

注解

本教程中的代码没有使用 GPU 。读者可以自行修改代码,扩大数据量并使用 GPU 进行训练。

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

我们可以使用 fastNLP fastNLP.io 模块中的 SST2Pipe 类,轻松地读取以及预处理SST2数据集。SST2Pipe 对象的 process_from_file() 方法能够对读入的SST2数据集进行数据的预处理,方法的参数为paths, 指要处理的文件所在目录,如果paths为None,则会自动下载数 据集,函数默认paths值为None。 此函数返回一个 DataBundle,包含SST2数据集的训练集、测试集、验证集以及source端和target端的字典。其训练、测试、验证数据集含有四个 field

  • raw_words: 原source句子
  • target: 标签值
  • words: index之后的raw_words
  • seq_len: 句子长度

读入数据代码如下:

from fastNLP.io import SST2Pipe

pipe = SST2Pipe()
databundle = pipe.process_from_file()
vocab = databundle.get_vocab('words')
print(databundle)
print(databundle.get_dataset('train')[0])
print(databundle.get_vocab('words'))

输出数据如下:

In total 3 datasets:
    test has 1821 instances.
    train has 67349 instances.
    dev has 872 instances.
In total 2 vocabs:
    words has 16293 entries.
    target has 2 entries.

+-------------------------------------------+--------+--------------------------------------+---------+
|                 raw_words                 | target |                words                 | seq_len |
+-------------------------------------------+--------+--------------------------------------+---------+
| hide new secretions from the parental ... |   1    | [4111, 98, 12010, 38, 2, 6844, 9042] |    7    |
+-------------------------------------------+--------+--------------------------------------+---------+

Vocabulary(['hide', 'new', 'secretions', 'from', 'the']...)

除了可以对数据进行读入的Pipe类,fastNLP还提供了读入和下载数据的Loader类,不同数据集的Pipe和Loader及其用法详见 使用Loader和Pipe加载并处理数据集

数据集分割

由于SST2数据集的测试集并不带有标签数值,故我们分割出一部分训练集作为测试集。下面这段代码展示了 split() 的使用方法, 为了能让读者快速运行完整个教程,我们只取了训练集的前5000个数据。

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

输出结果为:

4925 872 75
数据集 set_input()set_target() 函数

SST2Pipe 类的 process_from_file() 方法在预处理过程中还将训练、测试、验证集 的 wordsseq_len field 设定为input,同时将`target` field 设定为target。 我们可以通过 Dataset 类的 print_field_meta() 方法查看各个 field 的设定情况,代码如下:

train_data.print_field_meta()

输出结果为:

+-------------+-----------+--------+-------+---------+
| field_names | raw_words | target | words | seq_len |
+-------------+-----------+--------+-------+---------+
|   is_input  |   False   | False  |  True |   True  |
|  is_target  |   False   |  True  | False |  False  |
| ignore_type |           | False  | False |  False  |
|  pad_value  |           |   0    |   0   |    0    |
+-------------+-----------+--------+-------+---------+

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

is_input为true的 fieldDataSetIter 迭代取出的 batch_x 中, 而 is_target为true的 fieldDataSetIter 迭代取出的 batch_y 中。 具体分析见下面DataSetIter的介绍过程。

评价指标

训练模型需要提供一个评价指标。这里使用准确率做为评价指标。

  • pred 参数对应的是模型的 forward 方法返回的 dict 中的一个 key 的名字。
  • target 参数对应的是 DataSet 中作为标签的 field 的名字。

这里我们用 Const 来辅助命名,如果你自己编写模型中 forward 方法的返回值或 数据集中 field 的名字与本例不同, 你可以把 pred 参数和 target 参数设定符合自己代码的值。代码如下:

from fastNLP import AccuracyMetric
from fastNLP import Const

# metrics=AccuracyMetric() 在本例中与下面这行代码等价
metrics=AccuracyMetric(pred=Const.OUTPUT, target=Const.TARGET)
DataSetIter初探
DataSetIter

fastNLP定义的 DataSetIter 类,用于定义一个batch,并实现batch的多种功能,在初始化时传入的参数有:

  • dataset: DataSet 对象, 数据集
  • batch_size: 取出的batch大小
  • sampler: 规定使用的 Sampler 若为 None, 使用 RandomSampler (Default: None)
  • as_numpy: 若为 True, 输出batch为 numpy.array. 否则为 torch.Tensor (Default: False)
  • prefetch: 若为 True使用多进程预先取出下一batch. (Default: False)
sampler

fastNLP 实现的采样器有:

  • BucketSampler 可以随机地取出长度相似的元素 【初始化参数: num_buckets:bucket的数量; batch_size:batch大小; seq_len_field_name:dataset中对应序列长度的 field 的名字】
  • SequentialSampler: 顺序取出元素的采样器【无初始化参数】
  • RandomSampler:随机化取元素的采样器【无初始化参数】
Padder
在fastNLP里,pad是与一个 field 绑定的。即不同的 field 可以使用不同的pad方式,比如在英文任务中word需要的pad和 character的pad方式往往是不同的。fastNLP是通过一个叫做 Padder 的子类来完成的。 默认情况下,所有field使用 AutoPadder 。大多数情况下直接使用 AutoPadder 就可以了。 如果 AutoPadderEngChar2DPadder 无法满足需求, 也可以自己写一个 Padder
DataSetIter自动padding

以下代码展示了DataSetIter的简单使用:

from fastNLP import BucketSampler
from fastNLP import DataSetIter

tmp_data = dev_data[:10]
# 定义一个Batch,传入DataSet,规定batch_size和去batch的规则。
# 顺序(Sequential),随机(Random),相似长度组成一个batch(Bucket)
sampler = BucketSampler(batch_size=2, seq_len_field_name='seq_len')
batch = DataSetIter(batch_size=2, dataset=tmp_data, sampler=sampler)
for batch_x, batch_y in batch:
    print("batch_x: ",batch_x)
    print("batch_y: ", batch_y)

输出结果如下:

batch_x:  {'words': tensor([[   13,   830,  7746,   174,     3,    47,     6,    83,  5752,    15,
          2177,    15,    63,    57,   406,    84,  1009,  4973,    27,    17,
         13785,     3,   533,  3687, 15623,    39,   375,     8, 15624,     8,
          1323,  4398,     7],
        [ 1045, 11113,    16,   104,     5,     4,   176,  1824,  1704,     3,
             2,    18,    11,     4,  1018,   432,   143,    33,   245,   308,
             7,     0,     0,     0,     0,     0,     0,     0,     0,     0,
             0,     0,     0]]), 'seq_len': tensor([33, 21])}
batch_y:  {'target': tensor([1, 0])}
batch_x:  {'words': tensor([[  14,   10,    4,  311,    5,  154, 1418,  609,    7],
        [  14,   10,  437,   32,   78,    3,   78,  437,    7]]), 'seq_len': tensor([9, 9])}
batch_y:  {'target': tensor([0, 1])}
batch_x:  {'words': tensor([[    4,   277,   685,    18,     7],
        [15618,  3204,     5,  1675,     0]]), 'seq_len': tensor([5, 4])}
batch_y:  {'target': tensor([1, 1])}
batch_x:  {'words': tensor([[    2,   155,     3,  4426,     3,   239,     3,   739,     5,  1136,
            41,    43,  2427,   736,     2,   648,    10, 15620,  2285,     7],
        [   24,    95,    28,    46,     8,   336,    38,   239,     8,  2133,
             2,    18,    10, 15622,  1421,     6,    61,     5,   387,     7]]), 'seq_len': tensor([20, 20])}
batch_y:  {'target': tensor([0, 0])}
batch_x:  {'words': tensor([[  879,    96,     8,  1026,    12,  8067,    11, 13623,     8, 15619,
             4,   673,   662,    15,     4,  1154,   240,   639,   417,     7],
        [   45,   752,   327,   180,    10, 15621,    16,    72,  8904,     9,
          1217,     7,     0,     0,     0,     0,     0,     0,     0,     0]]), 'seq_len': tensor([20, 12])}
batch_y:  {'target': tensor([0, 1])}

可以看到那些设定为input的 field 都出现在batch_x中,而设定为target的 field 则出现在batch_y中。同时对于同一个batch_x中的两个数据,长度偏短的那个会被自动padding到和长度偏长的句子长度一致,默认的padding值为0。

Dataset改变padding值

可以通过 set_pad_val() 方法修改默认的pad值,代码如下:

tmp_data.set_pad_val('words',-1)
batch = DataSetIter(batch_size=2, dataset=tmp_data, sampler=sampler)
for batch_x, batch_y in batch:
    print("batch_x: ",batch_x)
    print("batch_y: ", batch_y)

输出结果如下:

batch_x:  {'words': tensor([[   13,   830,  7746,   174,     3,    47,     6,    83,  5752,    15,
          2177,    15,    63,    57,   406,    84,  1009,  4973,    27,    17,
         13785,     3,   533,  3687, 15623,    39,   375,     8, 15624,     8,
          1323,  4398,     7],
        [ 1045, 11113,    16,   104,     5,     4,   176,  1824,  1704,     3,
             2,    18,    11,     4,  1018,   432,   143,    33,   245,   308,
             7,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
            -1,    -1,    -1]]), 'seq_len': tensor([33, 21])}
batch_y:  {'target': tensor([1, 0])}
batch_x:  {'words': tensor([[  14,   10,    4,  311,    5,  154, 1418,  609,    7],
        [  14,   10,  437,   32,   78,    3,   78,  437,    7]]), 'seq_len': tensor([9, 9])}
batch_y:  {'target': tensor([0, 1])}
batch_x:  {'words': tensor([[    2,   155,     3,  4426,     3,   239,     3,   739,     5,  1136,
            41,    43,  2427,   736,     2,   648,    10, 15620,  2285,     7],
        [   24,    95,    28,    46,     8,   336,    38,   239,     8,  2133,
             2,    18,    10, 15622,  1421,     6,    61,     5,   387,     7]]), 'seq_len': tensor([20, 20])}
batch_y:  {'target': tensor([0, 0])}
batch_x:  {'words': tensor([[    4,   277,   685,    18,     7],
        [15618,  3204,     5,  1675,    -1]]), 'seq_len': tensor([5, 4])}
batch_y:  {'target': tensor([1, 1])}
batch_x:  {'words': tensor([[  879,    96,     8,  1026,    12,  8067,    11, 13623,     8, 15619,
             4,   673,   662,    15,     4,  1154,   240,   639,   417,     7],
        [   45,   752,   327,   180,    10, 15621,    16,    72,  8904,     9,
          1217,     7,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1]]), 'seq_len': tensor([20, 12])}
batch_y:  {'target': tensor([0, 1])}

可以看到使用了-1进行padding。

Dataset个性化padding

如果我们希望对某一些 field 进行个性化padding,可以自己构造Padder类,并使用 set_padder() 函数修改padder来实现。下面通过构造一个将数据padding到固定长度的padder进行展示:

from fastNLP.core.field import Padder
import numpy as np
class FixLengthPadder(Padder):
    def __init__(self, pad_val=0, length=None):
        super().__init__(pad_val=pad_val)
        self.length = length
        assert self.length is not None, "Creating FixLengthPadder with no specific length!"

    def __call__(self, contents, field_name, field_ele_dtype, dim):
        #计算当前contents中的最大长度
        max_len = max(map(len, contents))
        #如果当前contents中的最大长度大于指定的padder length的话就报错
        assert max_len <= self.length, "Fixed padder length smaller than actual length! with length {}".format(max_len)
        array = np.full((len(contents), self.length), self.pad_val, dtype=field_ele_dtype)
        for i, content_i in enumerate(contents):
            array[i, :len(content_i)] = content_i
        return array

#设定FixLengthPadder的固定长度为40
tmp_padder = FixLengthPadder(pad_val=0,length=40)
#利用dataset的set_padder函数设定words field的padder
tmp_data.set_padder('words',tmp_padder)
batch = DataSetIter(batch_size=2, dataset=tmp_data, sampler=sampler)
for batch_x, batch_y in batch:
    print("batch_x: ",batch_x)
    print("batch_y: ", batch_y)

输出结果如下:

batch_x:  {'words': tensor([[   45,   752,   327,   180,    10, 15621,    16,    72,  8904,     9,
          1217,     7,     0,     0,     0,     0,     0,     0,     0,     0,
             0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
             0,     0,     0,     0,     0,     0,     0,     0,     0,     0],
        [  879,    96,     8,  1026,    12,  8067,    11, 13623,     8, 15619,
             4,   673,   662,    15,     4,  1154,   240,   639,   417,     7,
             0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
             0,     0,     0,     0,     0,     0,     0,     0,     0,     0]]), 'seq_len': tensor([12, 20])}
batch_y:  {'target': tensor([1, 0])}
batch_x:  {'words': tensor([[   13,   830,  7746,   174,     3,    47,     6,    83,  5752,    15,
          2177,    15,    63,    57,   406,    84,  1009,  4973,    27,    17,
         13785,     3,   533,  3687, 15623,    39,   375,     8, 15624,     8,
          1323,  4398,     7,     0,     0,     0,     0,     0,     0,     0],
        [ 1045, 11113,    16,   104,     5,     4,   176,  1824,  1704,     3,
             2,    18,    11,     4,  1018,   432,   143,    33,   245,   308,
             7,     0,     0,     0,     0,     0,     0,     0,     0,     0,
             0,     0,     0,     0,     0,     0,     0,     0,     0,     0]]), 'seq_len': tensor([33, 21])}
batch_y:  {'target': tensor([1, 0])}
batch_x:  {'words': tensor([[  14,   10,    4,  311,    5,  154, 1418,  609,    7,    0,    0,    0,
            0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
            0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
            0,    0,    0,    0],
        [  14,   10,  437,   32,   78,    3,   78,  437,    7,    0,    0,    0,
            0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
            0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
            0,    0,    0,    0]]), 'seq_len': tensor([9, 9])}
batch_y:  {'target': tensor([0, 1])}
batch_x:  {'words': tensor([[    2,   155,     3,  4426,     3,   239,     3,   739,     5,  1136,
            41,    43,  2427,   736,     2,   648,    10, 15620,  2285,     7,
             0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
             0,     0,     0,     0,     0,     0,     0,     0,     0,     0],
        [   24,    95,    28,    46,     8,   336,    38,   239,     8,  2133,
             2,    18,    10, 15622,  1421,     6,    61,     5,   387,     7,
             0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
             0,     0,     0,     0,     0,     0,     0,     0,     0,     0]]), 'seq_len': tensor([20, 20])}
batch_y:  {'target': tensor([0, 0])}
batch_x:  {'words': tensor([[    4,   277,   685,    18,     7,     0,     0,     0,     0,     0,
             0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
             0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
             0,     0,     0,     0,     0,     0,     0,     0,     0,     0],
        [15618,  3204,     5,  1675,     0,     0,     0,     0,     0,     0,
             0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
             0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
             0,     0,     0,     0,     0,     0,     0,     0,     0,     0]]), 'seq_len': tensor([5, 4])}
batch_y:  {'target': tensor([1, 1])}

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

使用DataSetIter自己编写训练过程

如果你想用类似 PyTorch 的使用方法,自己编写训练过程,可以参考下面这段代码。 其中使用了 fastNLP 提供的 DataSetIter 来获得小批量训练的小批量数据, 使用 BucketSampler 做为 DataSetIter 的参数来选择采样的方式。

以下代码使用BucketSampler作为 DataSetIter 初始化的输入,运用 DataSetIter 自己写训练程序

from fastNLP import BucketSampler
from fastNLP import DataSetIter
from fastNLP.models import CNNText
from fastNLP import Tester
import torch
import time

embed_dim = 100
model = CNNText((len(vocab),embed_dim), num_classes=2, dropout=0.1)

def train(epoch, data, devdata):
    optimizer = torch.optim.Adam(model.parameters(), lr=0.001)
    lossfunc = torch.nn.CrossEntropyLoss()
    batch_size = 32

    # 定义一个Batch,传入DataSet,规定batch_size和去batch的规则。
    # 顺序(Sequential),随机(Random),相似长度组成一个batch(Bucket)
    train_sampler = BucketSampler(batch_size=batch_size, seq_len_field_name='seq_len')
    train_batch = DataSetIter(batch_size=batch_size, dataset=data, sampler=train_sampler)

    start_time = time.time()
    print("-"*5+"start training"+"-"*5)
    for i in range(epoch):
        loss_list = []
        for batch_x, batch_y in train_batch:
            optimizer.zero_grad()
            output = model(batch_x['words'])
            loss = lossfunc(output['pred'], batch_y['target'])
            loss.backward()
            optimizer.step()
            loss_list.append(loss.item())

        #这里verbose如果为0,在调用Tester对象的test()函数时不输出任何信息,返回评估信息; 如果为1,打印出验证结果,返回评估信息
        #在调用过Tester对象的test()函数后,调用其_format_eval_results(res)函数,结构化输出验证结果
        tester_tmp = Tester(devdata, model, metrics=AccuracyMetric(), verbose=0)
        res=tester_tmp.test()

        print('Epoch {:d} Avg Loss: {:.2f}'.format(i, sum(loss_list) / len(loss_list)),end=" ")
        print(tester_tmp._format_eval_results(res),end=" ")
        print('{:d}ms'.format(round((time.time()-start_time)*1000)))
        loss_list.clear()

train(10, train_data, dev_data)
#使用tester进行快速测试
tester = Tester(test_data, model, metrics=AccuracyMetric())
tester.test()

这段代码的输出如下:

-----start training-----

Evaluate data in 2.68 seconds!
Epoch 0 Avg Loss: 0.66 AccuracyMetric: acc=0.708716 29307ms

Evaluate data in 0.38 seconds!
Epoch 1 Avg Loss: 0.41 AccuracyMetric: acc=0.770642 52200ms

Evaluate data in 0.51 seconds!
Epoch 2 Avg Loss: 0.16 AccuracyMetric: acc=0.747706 70268ms

Evaluate data in 0.96 seconds!
Epoch 3 Avg Loss: 0.06 AccuracyMetric: acc=0.741972 90349ms

Evaluate data in 1.04 seconds!
Epoch 4 Avg Loss: 0.03 AccuracyMetric: acc=0.740826 114250ms

Evaluate data in 0.8 seconds!
Epoch 5 Avg Loss: 0.02 AccuracyMetric: acc=0.738532 134742ms

Evaluate data in 0.65 seconds!
Epoch 6 Avg Loss: 0.01 AccuracyMetric: acc=0.731651 154503ms

Evaluate data in 0.8 seconds!
Epoch 7 Avg Loss: 0.01 AccuracyMetric: acc=0.738532 175397ms

Evaluate data in 0.36 seconds!
Epoch 8 Avg Loss: 0.01 AccuracyMetric: acc=0.733945 192384ms

Evaluate data in 0.84 seconds!
Epoch 9 Avg Loss: 0.01 AccuracyMetric: acc=0.744266 214417ms

Evaluate data in 0.04 seconds!
[tester]
AccuracyMetric: acc=0.786667

使用Metric快速评测你的模型

在进行训练时,fastNLP提供了各种各样的 metrics 。 如前面的教程中所介绍,AccuracyMetric 类的对象被直接传到 Trainer 中用于训练

trainer = Trainer(train_data=train_data, dev_data=dev_data, model=model,
                  loss=loss, device=device, metrics=metric)
trainer.train()

除了 AccuracyMetric 之外,SpanFPreRecMetric 也是一种非常见的评价指标, 例如在序列标注问题中,常以span的方式计算 F-measure, precision, recall。

另外,fastNLP 还实现了用于抽取式QA(如SQuAD)的metric ExtractiveQAMetric。 用户可以参考下面这个表格,点击第一列查看各个 metrics 的详细文档。

名称 介绍
MetricBase 自定义metrics需继承的基类
AccuracyMetric 简单的正确率metric
SpanFPreRecMetric 同时计算 F-measure, precision, recall 值的 metric
ExtractiveQAMetric 用于抽取式QA任务 的metric

更多的 metrics 正在被添加到 fastNLP 当中,敬请期待。

定义自己的metrics

在定义自己的metrics类时需继承 fastNLP 的 MetricBase, 并覆盖写入 evaluateget_metric 方法。

evaluate(xxx) 中传入一个批次的数据,将针对一个批次的预测结果做评价指标的累计

get_metric(xxx) 当所有数据处理完毕时调用该方法,它将根据 evaluate函数累计的评价指标统计量来计算最终的评价结果

以分类问题中,accuracy 计算为例,假设 model 的 forward 返回 dict 中包含 pred 这个 key , 并且该 key 需要用于 accuracy:

class Model(nn.Module):
    def __init__(xxx):
        # do something
    def forward(self, xxx):
        # do something
        return {'pred': pred, 'other_keys':xxx} # pred's shape: batch_size x num_classes

假设dataset中 target 这个 field 是需要预测的值,并且该 field 被设置为了 target 对应的 AccMetric 可以按如下的定义( Version 1, 只使用这一次):

from fastNLP import MetricBase

class AccMetric(MetricBase):

    def __init__(self):
        super().__init__()
        # 根据你的情况自定义指标
        self.total = 0
        self.acc_count = 0

    # evaluate的参数需要和DataSet 中 field 名以及模型输出的结果 field 名一致,不然找不到对应的value
    # pred, target 的参数是 fastNLP 的默认配置
    def evaluate(self, pred, target):
        # dev或test时,每个batch结束会调用一次该方法,需要实现如何根据每个batch累加metric
        self.total += target.size(0)
        self.acc_count += target.eq(pred).sum().item()

    def get_metric(self, reset=True): # 在这里定义如何计算metric
        acc = self.acc_count/self.total
        if reset: # 是否清零以便重新计算
            self.acc_count = 0
            self.total = 0
        return {'acc': acc}
        # 需要返回一个dict,key为该metric的名称,该名称会显示到Trainer的progress bar中

如果需要复用 metric,比如下一次使用 AccMetric 时,dataset中目标field不叫 target 而叫 y ,或者model的输出不是 pred (Version 2):

class AccMetric(MetricBase):
    def __init__(self, pred=None, target=None):
        """
        假设在另一场景使用时,目标field叫y,model给出的key为pred_y。则只需要在初始化AccMetric时,
        acc_metric = AccMetric(pred='pred_y', target='y')即可。
        当初始化为acc_metric = AccMetric() 时,fastNLP会直接使用 'pred', 'target' 作为key去索取对应的的值
        """

        super().__init__()

        # 如果没有注册该则效果与 Version 1 就是一样的
        self._init_param_map(pred=pred, target=target) # 该方法会注册 pred 和 target . 仅需要注册evaluate()方法会用到的参数名即可

        # 根据你的情况自定义指标
        self.total = 0
        self.acc_count = 0

    # evaluate的参数需要和DataSet 中 field 名以及模型输出的结果 field 名一致,不然找不到对应的value
    # pred, target 的参数是 fastNLP 的默认配置
    def evaluate(self, pred, target):
        # dev或test时,每个batch结束会调用一次该方法,需要实现如何根据每个batch累加metric
        self.total += target.size(0)
        self.acc_count += target.eq(pred).sum().item()

    def get_metric(self, reset=True): # 在这里定义如何计算metric
        acc = self.acc_count/self.total
        if reset: # 是否清零以便重新计算
            self.acc_count = 0
            self.total = 0
        return {'acc': acc}
        # 需要返回一个dict,key为该metric的名称,该名称会显示到Trainer的progress bar中

MetricBase 将会在输入的字典 pred_dicttarget_dict 中进行检查. pred_dict 是模型当中 forward() 函数或者 predict() 函数的返回值. target_dict 是DataSet当中的ground truth, 判定ground truth的条件是field的 is_target 被设置为True.

MetricBase 会进行以下的类型检测:

  1. self.evaluate当中是否有 varargs, 这是不支持的.
  2. self.evaluate当中所需要的参数是否既不在 pred_dict 也不在 target_dict .
  3. self.evaluate当中所需要的参数是否既在 pred_dict 也在 target_dict .

除此以外,在参数被传入self.evaluate以前,这个函数会检测 pred_dicttarget_dict 当中没有被用到的参数 如果kwargs是self.evaluate的参数,则不会检测

self.evaluate将计算一个批次(batch)的评价指标,并累计。 没有返回值 self.get_metric将统计当前的评价指标并返回评价结果, 返回值需要是一个dict, key是指标名称,value是指标的值

使用Modules和Models快速搭建自定义模型

modulesmodels 用于构建 fastNLP 所需的神经网络模型,它可以和 torch.nn 中的模型一起使用。 下面我们会分三节介绍编写构建模型的具体方法。

使用 models 中的模型

fastNLP 在 models 模块中内置了如 CNNTextSeqLabeling 等完整的模型,以供用户直接使用。 以文本分类的任务为例,我们从 models 中导入 CNNText 模型,用它进行训练。

from fastNLP.models import CNNText

model_cnn = CNNText((len(vocab),100), num_classes=2, dropout=0.1)

trainer = Trainer(train_data=train_data, dev_data=dev_data, metrics=metric,
                  loss=loss, device=device, model=model_cnn)
trainer.train()

在 iPython 环境输入 model_cnn ,我们可以看到 model_cnn 的网络结构

CNNText(
  (embed): Embedding(
    (embed): Embedding(16292, 100)
    (dropout): Dropout(p=0.0, inplace=False)
  )
  (conv_pool): ConvMaxpool(
    (convs): ModuleList(
      (0): Conv1d(100, 30, kernel_size=(1,), stride=(1,), bias=False)
      (1): Conv1d(100, 40, kernel_size=(3,), stride=(1,), padding=(1,), bias=False)
      (2): Conv1d(100, 50, kernel_size=(5,), stride=(1,), padding=(2,), bias=False)
    )
  )
  (dropout): Dropout(p=0.1, inplace=False)
  (fc): Linear(in_features=120, out_features=2, bias=True)
)

FastNLP 中内置的 models 如下表所示,您可以点击具体的名称查看详细的 API:

名称 介绍
CNNText 使用 CNN 进行文本分类的模型
SeqLabeling 简单的序列标注模型
AdvSeqLabel 更大网络结构的序列标注模型
ESIM ESIM 模型的实现
StarTransEnc 带 word-embedding的Star-Transformer模 型
STSeqLabel 用于序列标注的 Star-Transformer 模型
STNLICls 用于自然语言推断 (NLI) 的 Star-Transformer 模型
STSeqCls 用于分类任务的 Star-Transformer 模型
BiaffineParser Biaffine 依存句法分析网络的实现
BiLSTMCRF 使用BiLSTM与CRF进行序列标注
使用 nn.torch 编写模型

FastNLP 完全支持使用 pyTorch 编写的模型,但与 pyTorch 中编写模型的常见方法不同, 用于 fastNLP 的模型中 forward 函数需要返回一个字典,字典中至少需要包含 pred 这个字段。

下面是使用 pyTorch 中的 torch.nn 模块编写的文本分类,注意观察代码中标注的向量维度。 由于 pyTorch 使用了约定俗成的维度设置,使得 forward 中需要多次处理维度顺序

import torch
import torch.nn as nn

class LSTMText(nn.Module):
    def __init__(self, vocab_size, embedding_dim, output_dim, hidden_dim=64, num_layers=2, dropout=0.5):
        super().__init__()

        self.embedding = nn.Embedding(vocab_size, embedding_dim)
        self.lstm = nn.LSTM(embedding_dim, hidden_dim, num_layers=num_layers, bidirectional=True, dropout=dropout)
        self.fc = nn.Linear(hidden_dim * 2, output_dim)
        self.dropout = nn.Dropout(dropout)

    def forward(self, words):
        # (input) words : (batch_size, seq_len)
        words = words.permute(1,0)
        # words : (seq_len, batch_size)

        embedded = self.dropout(self.embedding(words))
        # embedded : (seq_len, batch_size, embedding_dim)
        output, (hidden, cell) = self.lstm(embedded)
        # output: (seq_len, batch_size, hidden_dim * 2)
        # hidden: (num_layers * 2, batch_size, hidden_dim)
        # cell: (num_layers * 2, batch_size, hidden_dim)

        hidden = torch.cat((hidden[-2, :, :], hidden[-1, :, :]), dim=1)
        hidden = self.dropout(hidden)
        # hidden: (batch_size, hidden_dim * 2)

        pred = self.fc(hidden.squeeze(0))
        # result: (batch_size, output_dim)
        return {"pred":pred}

我们同样可以在 iPython 环境中查看这个模型的网络结构

LSTMText(
  (embedding): Embedding(16292, 100)
  (lstm): LSTM(100, 64, num_layers=2, dropout=0.5, bidirectional=True)
  (fc): Linear(in_features=128, out_features=2, bias=True)
  (dropout): Dropout(p=0.5, inplace=False)
)
使用 modules 编写模型

下面我们使用 fastNLP.modules 中的组件来构建同样的网络。由于 fastNLP 统一把 batch_size 放在第一维, 在编写代码的过程中会有一定的便利。

from fastNLP.modules import Embedding, LSTM, MLP

class MyText(nn.Module):
    def __init__(self, vocab_size, embedding_dim, output_dim, hidden_dim=64, num_layers=2, dropout=0.5):
        super().__init__()

        self.embedding = Embedding((vocab_size, embedding_dim))
        self.lstm = LSTM(embedding_dim, hidden_dim, num_layers=num_layers, bidirectional=True)
        self.mlp = MLP([hidden_dim*2,output_dim], dropout=dropout)

    def forward(self, words):
        embedded = self.embedding(words)
        _,(hidden,_) = self.lstm(embedded)
        pred = self.mlp(torch.cat((hidden[-1],hidden[-2]),dim=1))
        return {"pred":pred}

我们自己编写模型的网络结构如下

MyText(
  (embedding): Embedding(
    (embed): Embedding(16292, 100)
    (dropout): Dropout(p=0.0, inplace=False)
  )
  (lstm): LSTM(
    (lstm): LSTM(100, 64, num_layers=2, batch_first=True, bidirectional=True)
  )
  (mlp): MLP(
    (hiddens): ModuleList()
    (output): Linear(in_features=128, out_features=2, bias=True)
    (dropout): Dropout(p=0.5, inplace=False)
  )
)

FastNLP 中包含的各种模块如下表,您可以点击具体的名称查看详细的 API,也可以通过 fastNLP.modules 进行了解。

名称 介绍  
ConvolutionCharEncoder char级别的卷积 encoder  
LSTMCharEncoder char级别基于LSTM的 encoder  
ConvMaxpool 结合了Convolution和Max-Pooling于一体的模块  
LSTM LSTM模块 轻量封装了PyTorch的LSTM
StarTransformer Star-Transformer 的encoder部分  
TransformerEncoder Transformer的encoder模块,不包含embedding层  
VarRNN Variational Dropout RNN 模块  
VarLSTM Variational Dropout LSTM 模块  
VarGRU Variational Dropout GRU 模块  
MaxPool Max-pooling模块  
MaxPoolWithMask 带mask矩阵的max pooling。在做 max-pooling的时候不会考虑mask值为0的位置。  
AvgPool Average-pooling模块  
AvgPoolWithMask 带mask矩阵的average pooling。在做 average-pooling的时候不会考虑mask值为0的位置。  
MultiHeadAttention MultiHead Attention 模块  
MLP 简单的多层感知器模块  
ConditionalRandomField 条件随机场模块  
viterbi_decode 给定一个特征矩阵以及转移分数矩阵,计算出最佳的路径以及对应的分数 (与 ConditionalRandomField 配合使用)  
allowed_transitions 给定一个id到label的映射表,返回所有可以跳转的列表(与 ConditionalRandomField 配合使用)  
TimestepDropout 简单包装过的Dropout 组件  

使用 Callback 自定义你的训练过程

什么是Callback

Callback 是与 Trainer 紧密结合的模块,利用 Callback 可以在 Trainer 训练时,加入自定义的操作,比如梯度裁剪,学习率调节,测试模型的性能等。定义的 Callback 会在训练的特定阶段被调用。

fastNLP 中提供了很多常用的 Callback ,开箱即用。

使用 Callback

使用 Callback 很简单,将需要的 callback 按 list 存储,以对应参数 callbacks 传入对应的 Trainer。Trainer 在训练时就会自动执行这些 Callback 指定的操作了。

from fastNLP import (Callback, EarlyStopCallback,
                     Trainer, CrossEntropyLoss, AccuracyMetric)
from fastNLP.models import CNNText
import torch.cuda

# prepare data
def get_data():
    from fastNLP.io import ChnSentiCorpPipe as pipe
    data = pipe().process_from_file()
    print(data)
    data.rename_field('chars', 'words')
    train_data = data.get_dataset('train')
    dev_data = data.get_dataset('dev')
    test_data = data.get_dataset('test')
    vocab = data.get_vocab('words')
    tgt_vocab = data.get_vocab('target')
    return train_data, dev_data, test_data, vocab, tgt_vocab

# prepare model
train_data, dev_data, _, vocab, tgt_vocab = get_data()
device = 'cuda:0' if torch.cuda.is_available() else 'cpu'
model = CNNText((len(vocab),50), num_classes=len(tgt_vocab))

# define callback
callbacks=[EarlyStopCallback(5)]

# pass callbacks to Trainer
def train_with_callback(cb_list):
    trainer = Trainer(
        device=device,
        n_epochs=3,
        model=model,
        train_data=train_data,
        dev_data=dev_data,
        loss=CrossEntropyLoss(),
        metrics=AccuracyMetric(),
        callbacks=cb_list,
        check_code_level=-1
    )
    trainer.train()

train_with_callback(callbacks)
fastNLP 中的 Callback

fastNLP 中提供了很多常用的 Callback,如梯度裁剪,训练时早停和测试验证集,fitlog 等等。具体 Callback 请参考 fastNLP.core.callback

from fastNLP import EarlyStopCallback, GradientClipCallback, EvaluateCallback
callbacks = [
    EarlyStopCallback(5),
    GradientClipCallback(clip_value=5, clip_type='value'),
    EvaluateCallback(dev_data)
]

train_with_callback(callbacks)
自定义 Callback

这里我们以一个简单的 Callback作为例子,它的作用是打印每一个 Epoch 平均训练 loss。

  1. 创建 Callback

    要自定义 Callback,我们要实现一个类,继承 Callback 。这里我们定义 MyCallBack ,继承 fastNLP.Callback 。

  2. 指定 Callback 调用的阶段

    Callback 中所有以 on_ 开头的类方法会在 Trainer 的训练中在特定阶段调用。 如 on_train_begin() 会在训练开始时被调用,on_epoch_end() 会在每个 epoch 结束时调用。 具体有哪些类方法,参见 Callback 文档。这里, MyCallBack 在求得loss时调用 on_backward_begin() 记录 当前 loss,在每一个 epoch 结束时调用 on_epoch_end() ,求当前 epoch 平均loss并输出。

  3. 使用 Callback 的属性访问 Trainer 的内部信息

    为了方便使用,可以使用 Callback 的属性,访问 Trainer 中的对应信息,如 optimizer, epoch, n_epochs,分别对应训练时的优化器, 当前 epoch 数,和总 epoch 数。 具体可访问的属性,参见 Callback 。这里, MyCallBack 为了求平均 loss ,需要知道当前 epoch 的总步 数,可以通过 self.step 属性得到当前训练了多少步。

from fastNLP import Callback
from fastNLP import logger

class MyCallBack(Callback):
    """Print average loss in each epoch"""
    def __init__(self):
        super().__init__()
        self.total_loss = 0
        self.start_step = 0

    def on_backward_begin(self, loss):
        self.total_loss += loss.item()

    def on_epoch_end(self):
        n_steps = self.step - self.start_step
        avg_loss = self.total_loss / n_steps
        logger.info('Avg loss at epoch %d, %.6f', self.epoch, avg_loss)
        self.start_step = self.step

callbacks = [MyCallBack()]
train_with_callback(callbacks)

BertEmbedding的各种用法

Bert自从在 BERT: Pre-training of Deep Bidirectional Transformers for Language Understanding 中被提出后,因其性能卓越受到了极大的关注,在这里我们展示一下在fastNLP中如何使用Bert进行各类任务。其中中文Bert我们使用的模型的权重来自于 中文Bert预训练

为了方便大家的使用,fastNLP提供了预训练的Embedding权重及数据集的自动下载,支持自动下载的Embedding和数据集见 数据集 。或您可从 使用Embedding模块将文本转成向量使用Loader和Pipe加载并处理数据集 了解更多相关信息。

中文任务

下面我们将介绍通过使用Bert来进行文本分类, 中文命名实体识别, 文本匹配, 中文问答。

注解

本教程必须使用 GPU 进行实验,并且会花费大量的时间

1. 使用Bert进行文本分类

文本分类是指给定一段文字,判定其所属的类别。例如下面的文本情感分类

1, 商务大床房,房间很大,床有2M宽,整体感觉经济实惠不错!

这里我们使用fastNLP提供自动下载的微博分类进行测试

from fastNLP.io import WeiboSenti100kPipe
from fastNLP.embeddings import BertEmbedding
from fastNLP.models import BertForSequenceClassification
from fastNLP import Trainer, CrossEntropyLoss, AccuracyMetric, Adam
import torch

data_bundle =WeiboSenti100kPipe().process_from_file()
data_bundle.rename_field('chars', 'words')

# 载入BertEmbedding
embed = BertEmbedding(data_bundle.get_vocab('words'), model_dir_or_name='cn-wwm', include_cls_sep=True)

# 载入模型
model = BertForSequenceClassification(embed, len(data_bundle.get_vocab('target')))

# 训练模型
device = 0 if torch.cuda.is_available() else 'cpu'
trainer = Trainer(data_bundle.get_dataset('train'), model,
                  optimizer=Adam(model_params=model.parameters(), lr=2e-5),
                  loss=CrossEntropyLoss(), device=device,
                  batch_size=8, dev_data=data_bundle.get_dataset('dev'),
                  metrics=AccuracyMetric(), n_epochs=2, print_every=1)
trainer.train()

# 测试结果
from fastNLP import Tester

tester = Tester(data_bundle.get_dataset('test'), model, batch_size=128, metrics=AccuracyMetric())
tester.test()

输出结果:

In Epoch:1/Step:12499, got best dev performance:
AccuracyMetric: acc=0.9838
Reloaded the best model.
Evaluate data in 63.84 seconds!
[tester]
AccuracyMetric: acc=0.9815
2. 使用Bert进行命名实体识别

命名实体识别是给定一句话,标记出其中的实体。一般序列标注的任务都使用conll格式,conll格式是至一行中通过制表符分隔不同的内容,使用空行分隔 两句话,例如下面的例子

中   B-ORG
共   I-ORG
中   I-ORG
央   I-ORG
致   O
中   B-ORG
国   I-ORG
致   I-ORG
公   I-ORG
党   I-ORG
十   I-ORG
一   I-ORG
大   I-ORG
的   O
贺   O
词   O

这部分内容请参考 序列标注

3. 使用Bert进行文本匹配

文本匹配任务是指给定两句话判断他们的关系。比如,给定两句话判断前一句是否和后一句具有因果关系或是否是矛盾关系;或者给定两句话判断两句话是否 具有相同的意思。这里我们使用

from fastNLP.io import CNXNLIBertPipe
from fastNLP.embeddings import BertEmbedding
from fastNLP.models import BertForSentenceMatching
from fastNLP import Trainer, CrossEntropyLoss, AccuracyMetric, Adam
from fastNLP.core.optimizer import AdamW
from fastNLP.core.callback import WarmupCallback
from fastNLP import Tester
import torch

data_bundle = CNXNLIBertPipe().process_from_file()
data_bundle.rename_field('chars', 'words')
print(data_bundle)

# 载入BertEmbedding
embed = BertEmbedding(data_bundle.get_vocab('words'), model_dir_or_name='cn-wwm', include_cls_sep=True)

# 载入模型
model = BertForSentenceMatching(embed, len(data_bundle.get_vocab('target')))

# 训练模型
callbacks = [WarmupCallback(warmup=0.1, schedule='linear'), ]
device = 0 if torch.cuda.is_available() else 'cpu'
trainer = Trainer(data_bundle.get_dataset('train'), model,
                  optimizer=AdamW(params=model.parameters(), lr=4e-5),
                  loss=CrossEntropyLoss(), device=device,
                  batch_size=8, dev_data=data_bundle.get_dataset('dev'),
                  metrics=AccuracyMetric(), n_epochs=5, print_every=1,
                  update_every=8, callbacks=callbacks)
trainer.train()

tester = Tester(data_bundle.get_dataset('test'), model, batch_size=8, metrics=AccuracyMetric())
tester.test()

运行结果:

In Epoch:3/Step:73632, got best dev performance:
AccuracyMetric: acc=0.781928
Reloaded the best model.
Evaluate data in 18.54 seconds!
[tester]
AccuracyMetric: acc=0.783633
4. 使用Bert进行中文问答

问答任务是给定一段内容,以及一个问题,需要从这段内容中找到答案。 例如:

"context": "锣鼓经是大陆传统器乐及戏曲里面常用的打击乐记谱方法,以中文字的声音模拟敲击乐的声音,纪录打击乐的各种不同的演奏方法。常
用的节奏型称为「锣鼓点」。而锣鼓是戏曲节奏的支柱,除了加强演员身段动作的节奏感,也作为音乐的引子和尾声,提示音乐的板式和速度,以及
作为唱腔和念白的伴奏,令诗句的韵律更加抑扬顿锉,段落分明。锣鼓的运用有约定俗成的程式,依照角色行当的身份、性格、情绪以及环境,配合
相应的锣鼓点。锣鼓亦可以模仿大自然的音响效果,如雷电、波浪等等。戏曲锣鼓所运用的敲击乐器主要分为鼓、锣、钹和板四类型:鼓类包括有单
皮鼓(板鼓)、大鼓、大堂鼓(唐鼓)、小堂鼓、怀鼓、花盆鼓等;锣类有大锣、小锣(手锣)、钲锣、筛锣、马锣、镗锣、云锣;钹类有铙钹、大
钹、小钹、水钹、齐钹、镲钹、铰子、碰钟等;打拍子用的檀板、木鱼、梆子等。因为京剧的锣鼓通常由四位乐师负责,又称为四大件,领奏的师
傅称为:「鼓佬」,其职责有如西方乐队的指挥,负责控制速度以及利用各种手势提示乐师演奏不同的锣鼓点。粤剧吸收了部份京剧的锣鼓,但以木鱼
和沙的代替了京剧的板和鼓,作为打拍子的主要乐器。以下是京剧、昆剧和粤剧锣鼓中乐器对应的口诀用字:",
"question": "锣鼓经是什么?",
"answers": [
    {
      "text": "大陆传统器乐及戏曲里面常用的打击乐记谱方法",
      "answer_start": 4
    },
    {
      "text": "大陆传统器乐及戏曲里面常用的打击乐记谱方法",
      "answer_start": 4
    },
    {
      "text": "大陆传统器乐及戏曲里面常用的打击乐记谱方法",
      "answer_start": 4
    }
]

您可以通过以下的代码训练 (原文代码:CMRC2018)

from fastNLP.embeddings import BertEmbedding
from fastNLP.models import BertForQuestionAnswering
from fastNLP.core.losses import CMRC2018Loss
from fastNLP.core.metrics import CMRC2018Metric
from fastNLP.io.pipe.qa import CMRC2018BertPipe
from fastNLP import Trainer, BucketSampler
from fastNLP import WarmupCallback, GradientClipCallback
from fastNLP.core.optimizer import AdamW
import torch

data_bundle = CMRC2018BertPipe().process_from_file()
data_bundle.rename_field('chars', 'words')

print(data_bundle)

embed = BertEmbedding(data_bundle.get_vocab('words'), model_dir_or_name='cn', requires_grad=True, include_cls_sep=False, auto_truncate=True,
                      dropout=0.5, word_dropout=0.01)
model = BertForQuestionAnswering(embed)
loss = CMRC2018Loss()
metric = CMRC2018Metric()

wm_callback = WarmupCallback(schedule='linear')
gc_callback = GradientClipCallback(clip_value=1, clip_type='norm')
callbacks = [wm_callback, gc_callback]

optimizer = AdamW(model.parameters(), lr=5e-5)

device = 0 if torch.cuda.is_available() else 'cpu'
trainer = Trainer(data_bundle.get_dataset('train'), model, loss=loss, optimizer=optimizer,
                  sampler=BucketSampler(seq_len_field_name='context_len'),
                  dev_data=data_bundle.get_dataset('dev'), metrics=metric,
                  callbacks=callbacks, device=device, batch_size=6, num_workers=2, n_epochs=2, print_every=1,
                  test_use_tqdm=False, update_every=10)
trainer.train(load_best_model=False)

训练结果(和原论文中报道的基本一致):

In Epoch:2/Step:1692, got best dev performance:
CMRC2018Metric: f1=85.61, em=66.08

Distributed Parallel Training

原理

随着深度学习模型越来越复杂,单个GPU可能已经无法满足正常的训练。比如BERT等预训练模型,更是在多个GPU上训练得到的。为了使用多GPU训练,Pytorch框架已经提供了 nn.DataParallel 以及 nn.DistributedDataParallel 两种方式的支持。 nn.DataParallel 很容易使用,但是却有着GPU负载不均衡,单进程速度慢等缺点,无法发挥出多GPU的全部性能。因此,分布式的多GPU训练方式 nn.DistributedDataParallel 是更好的选择。然而,因为分布式训练的特点, nn.DistributedDataParallel 常常难以理解和使用,也很难debug。所以,在使用分布式训练之前,需要理解它的原理。

在使用 nn.DistributedDataParallel 时,模型会被复制到所有使用的GPU,通常每个GPU上存有一个模型,并被一个单独的进程控制。这样有N块GPU,就会产生N个进程。当训练一个batch时,这一batch会被分为N份,每个进程会使用batch的一部分进行训练,然后在必要时进行同步,并通过网络传输需要同步的数据。这时,只有模型的梯度会被同步,而模型的参数不会,所以能缓解大部分的网络传输压力,网络传输不再是训练速度的瓶颈之一。你可能会好奇,不同步模型的参数,怎么保证不同进程所训练的模型相同?只要每个进程初始的模型是同一个,具有相同的参数,而之后每次更新,都使用相同的梯度,就能保证梯度更新后的模型也具有相同的参数了。

为了让每个进程的模型初始化完全相同,通常这N个进程都是由单个进程复制而来的,这时需要对分布式的进程进行初始化,建立相互通信的机制。在 Pytorch 中,我们用 distributed.init_process_group 函数来完成,需要在程序开头就加入这一步骤。初始化完成后,每一个进程用唯一的编号 rank 进行区分,从 0 到 N-1递增,一般地,我们将 rank 为 0 的进程当作主进程,而其他 rank 的进程为子进程。每个进程还要知道 world_size ,即分布式训练的总进程数 N。训练时,每个进程使用batch的一部分,互相不能重复,这里通过 nn.utils.data.DistributedSampler 来实现。

使用方式

Pytorch的分布式训练使用起来非常麻烦,难以理解,可以从给出的官方教程 中看到。而fastNLP 提供了 DistTrainer,将大部分的分布式训练的细节进行了封装,只需简单的改动训练代码,就能直接用上分布式训练。那么,具体怎么将普通的训练代码改成支持分布式训练的代码呢。下面我们来讲一讲分布式训练的完整流程。通常,分布式程序的多个进程是单个进程的复制。假设我们用N个GPU进行分布式训练,我们需要启动N个进程,这时,在命令行使用:

python -m torch.distributed.launch --nproc_per_node=N train_script.py --args

其中N是需要启动的进程数,train_script.py为训练代码,--args是自定义的命令行参数。在启动了N个进程之后,如果我们在train_script.py的训练代码中正常配置,分布式训练就能正常进行。

此外,还可以使用环境变量CUDA_VISIBLE_DEVICES设置指定的GPU,比如在8卡机器上使用编号为4,5,6,7的4块GPU:

CUDA_VISIBLE_DEVICES=4,5,6,7 python -m torch.distributed.launch --nproc_per_node=N train_script.py --args

train_script.py 训练代码中,有一些必须的配置。为了清晰的叙述,这里放一个简单的分布式训练代码,省去多余细节:

import torch.distributed as dist
from fastNLP import DistTrainer, get_local_rank
import fastNLP as fnlp

def main(options):
    # options为训练所需的参数,batch_size等

    set_seed(options.seed)

    # 初始化分布式进程
    dist.init_process_group('nccl')

    ######## 读取数据
    if get_local_rank() != 0:
        dist.barrier() # 先让主进程(rank==0)先执行,进行数据处理,预训模型参数下载等操作,然后保存cache
    data = get_processed_data()
    model = get_model(data.get_vocab("words"), data.get_vocab("target"))
    if get_local_rank() == 0:
        dist.barrier() # 主进程执行完后,其余进程开始读取cache
    ########

    # 初始化Trainer,训练等,与普通训练差别不大
    def get_trainer(model, data):
        # 注意设置的callback有两种,一种只在主进程执行,一种在所有进程都执行
        callbacks_master = [fnlp.FitlogCallback()]
        callbacks_all = [fnlp.WarmupCallback(warmup=options.warmup)]
        trainer = DistTrainer(
            save_path='save',
            train_data=data.get_dataset("train"),
            dev_data=data.get_dataset("dev"),
            model=model,
            loss=fnlp.CrossEntropyLoss(),
            metrics=fnlp.AccuracyMetric(),
            metric_key="acc",
            optimizer=fnlp.AdamW(model.parameters(), lr=options.lr),
            callbacks_master=callbacks_master, # 仅在主进程执行(如模型保存,日志记录)
            callbacks_all=callbacks_all,    # 在所有进程都执行(如梯度裁剪,学习率衰减)
            batch_size_per_gpu=options.batch_size, # 指定每个GPU的batch大小
            update_every=options.update,
            n_epochs=options.epochs,
            use_tqdm=True,
        )
        return trainer

    trainer = get_trainer(model, data)
    trainer.train()
指定进程编号

首先,为了区分不同的进程,初始时需要对每个进程传入rank。这里一般分为node_ranklocal_rank,分别表示进程处于哪一机器以及同机器上处于第几进程。如果在单一机器上,node_rank可以省略。local_rank一般通过命令行参数--local_rank传入,为int类型。也可以通过环境变量传入local_rank,只需在torch.distributed.launch时,使用--use_env参数。无论哪种方式,在训练脚本中,都要获取到local_rank,用于初始化分布式通信,以及区分进程。如果你使用fastNLP,可以通过fastNLP.get_local_rank来得到local_rank

初始化进程

在获取了local_rank等重要参数后,在开始训练前,我们需要建立不同进程的通信和同步机制。这时我们使用torch.distributed.init_process_group 来完成。通常,我们只需要 torch.distributed.init_process_group('nccl') 来指定使用nccl后端来进行同步即可。其他参数程序将读取环境变量自动设置。如果想手动设置这些参数,比如,使用TCP进行通信,可以设置:

init_process_group('nccl', init_method='tcp://localhost:55678',
                  rank=args.rank, world_size=N)

或者使用文件进行通信:

init_process_group('nccl', init_method='file:///mnt/nfs/sharedfile',
                  world_size=N, rank=args.rank)

注意,此时必须显式指定world_sizerank,具体可以参考 torch.distributed.init_process_group 的使用文档。

在初始化分布式通信后,再初始化DistTrainer,传入数据和模型,就完成了分布式训练的代码。代码修改完成后,使用上面给出的命令行启动脚本,就能成功运行分布式训练。但是,如果数据处理,训练中的自定义操作比较复杂,则可能需要额外的代码修改。下面列出一些需要特别注意的地方,在使用分布式训练前,请仔细检查这些事项。

注意事项

在执行完 torch.distributed.init_process_group 后,我们就可以在不同进程间完成传输数据,进行同步等操作。这些操作都可以在torch.distributed 中找到。其中,最重要的是 barrier 以及 get_rank 操作。对于训练而言,我们关心的是读入数据,记录日志,模型初始化,模型参数更新,模型保存等操作。这些操作大多是读写操作,在多进程状态下,这些操作都必须小心进行,否则可能出现难以预料的bug。而在fastNLP中,大部分操作都封装在 DistTrainer 中,只需保证数据读入和模型初始化正确即可完成训练。

写操作

一般而言,读入操作需要在每一个进程都执行,因为每个进程都要使用读入的数据和模型参数进行训练。而写出操作只需在其中一个进程(通常为主进程)执行,因为每一个进程保存的模型都相同,都处于同一训练状态。所以,通常单进程的训练脚本中,只需要修改写出操作的部分,通过加入对进程rank的判断,仅让其中一个进程执行写操作:

import torch.distributed as dist

# 仅在主进程才执行
if dist.get_rank() == 0:
    do_wirte_op()  # 一些写操作
dist.barrier()  # 确保写完成后,所有进程再执行(若进程无需读入写出的数据,可以省去)

若使用fastNLP中的DistTrainer,也可以这样写:

# 判断是否是主进程的trainer
if trainer.is_master:
    do_wirte_op()
dist.barrier()
读操作

然而有些时候,我们需要其中一个进程先执行某些操作,等这一进程执行完后,其它进程再执行这一操作。比如,在读入数据时,我们有时需要从网上下载,再处理,将处理好的数据保存,供反复使用。这时,我们不需要所有进程都去下载和处理数据,只需要主进程进行这些操作,其它进程等待。直到处理好的数据被保存后,其他进程再从保存位置直接读入数据。这里可以参考范例代码中的读取数据:

if dist.get_rank() != 0:
    dist.barrier()  # 先让主进程(rank==0)先执行,进行数据处理,预训模型参数下载等操作,然后保存cache

# 这里会自动处理数据,或直接读取保存的cache
data = get_processed_data()
model = get_model(data.get_vocab("words"), data.get_vocab("target"))

if dist.get_rank() == 0:
    dist.barrier()  # 主进程执行完后,其余进程开始读取cache

也可以显式的将主进程和其它进程的操作分开:

if dist.get_rank() == 0:
    data = do_data_processing()  # 数据处理
    dist.barrier()
else:
    dist.barrier()
    data = load_processed_data()  # 读取cache
日志操作

通常,我们需要知道训练的状态,如当前在第几个epoch,模型当前的loss等等。单进程训练时,我们可以直接使用print将这些信息输出到命令行或日志文件。然而,在多进程时,print会导致同样的信息在每一进程都输出,造成问题。这一问题和写操作类似,也可以通过判断进程的编号之后再输出。问题是,日志通常在训练的很多地方都有输出,逐一加上判断代码是非常繁琐的。这里,建议统一修改为:

from fastNLP import logger
logger.info('....')  # 替换print

DistTrainer中,主进程的logger级别为INFO,而其它进程为WARNING。这样级别为INFO的信息只会在主进程输出,不会造成日志重复问题。若需要其它进程中的信息,可以使用logger.warning

注意,logger的级别设置只有初始化了DistTrainer后才能生效。如果想要在初始化进程后就生效,需要在分布式通信初始化后,执行init_logger_dist

Callback

fastNLP的一个特色是可以使用Callback在训练时完成各种自定义操作。而这一特色在DistTrainer中得以保留。但是,这时需要特别注意Callback是否只需要在主进程执行。一些Callback,比如调整学习率,梯度裁剪等,会改变模型的状态,因此需要在所有进程上都执行,将它们通过callback_all参数传入DistTrainer。而另一些Callback,比如fitlog,保存模型,不会改变模型的状态,而是进行数据写操作,因此仅在主进程上执行,将它们通过callback_master传入。

在自定义Callback时,请遵循一个原则,改变训练或模型状态的操作在所有进程中执行,而数据写到硬盘请在主进程单独进行。这样就能避免进程间失去同步,或者磁盘写操作的冲突。

Debug

多进程的程序很难进行debug,如果出现问题,可以先参考报错信息进行处理。也可以在程序中多输出日志,定位问题。具体情况,具体分析。在debug时,要多考虑进程同步和异步的操作,判断问题是程序本身导致的,还是由进程间没有同步而产生。

其中,有一个常见问题是程序卡住不动。具体表现为训练暂停,程序没有输出,但是GPU利用率保持100%。这一问题是由进程失去同步导致的。这时只能手动killGPU上残留的进程,再检查代码。需要检查进程同步的位置,比如模型backward()时,barrier()时等。同时,也要检查主进程与其它进程操作不同的位置,比如存储模型,evaluate模型时等。注意,失去同步的位置可能并不是程序卡住的位置,所以需要细致的检查。

使用fitlog 辅助 fastNLP 进行科研

本文介绍结合使用 fastNLP 和 fitlog 进行科研的方法。

首先,我们需要安装 fitlog 。你需要确认你的电脑中没有其它名为 fitlog 的命令。

我们从命令行中进入到一个文件夹,现在我们要在文件夹中创建我们的 fastNLP 项目。你可以在命令行输入 fitlog init test1 , 然后你会看到如下提示:

Initialized empty Git repository in /Users/fdujyn/workspaces/test1/.git/
Auto commit by fitlog
Initialized empty Git repository in /Users/fdujyn/workspaces/test1/.git/
Fitlog project test1 is initialized.

这表明你已经创建成功了项目文件夹,并且在项目文件夹中已经初始化了 Git。如果你不想初始化 Git, 可以参考文档 命令行工具

现在我们进入你创建的项目文件夹 test1 中,可以看到有一个名为 logs 的文件夹,后面我们将会在里面存放你的实验记录。 同时也有一个名为 main.py 的文件,这是我们推荐你使用的训练入口文件。文件的内容如下:

import fitlog

fitlog.commit(__file__)             # auto commit your codes
fitlog.add_hyper_in_file (__file__) # record your hyperparameters

"""
Your training code here, you may use these functions to log your result:
    fitlog.add_hyper()
    fitlog.add_loss()
    fitlog.add_metric()
    fitlog.add_best_metric()
    ......
"""

fitlog.finish()                     # finish the logging

我们推荐你保留除注释外的四行代码,它们有助于你的实验, 他们的具体用处参见文档 用户 API

我们假定你要进行前两个教程中的实验,并已经把数据复制到了项目根目录下的 tutorial_sample_dataset.csv 文件中。 现在我们编写如下的训练代码,使用 FitlogCallback 进行实验记录保存:

import fitlog
from fastNLP import Vocabulary, Trainer, CrossEntropyLoss, AccuracyMetric
from fastNLP.io import CSVLoader
from fastNLP.models import CNNText
from fastNLP.core.callback import FitlogCallback

fitlog.commit(__file__)             # auto commit your codes
fitlog.add_hyper_in_file (__file__) # record your hyperparameters

############hyper
word_embed = 50
dropout = 0.1
############hyper

loader = CSVLoader(headers=('raw_sentence', 'label'), sep='\t')
dataset = loader.load("tutorial_sample_dataset.csv")

dataset.apply(lambda x: x['raw_sentence'].lower(), new_field_name='sentence')
dataset.apply(lambda x: x['sentence'].split(), new_field_name='words', is_input=True)
dataset.apply(lambda x: int(x['label']), new_field_name='target', is_target=True)
vocab = Vocabulary(min_freq=2).from_dataset(dataset, field_name='words')
vocab.index_dataset(dataset, field_name='words',new_field_name='words')

model = CNNText((len(vocab),word_embed), num_classes=5, padding=2, dropout=dropout)

train_dev_data, test_data = dataset.split(0.1)
train_data, dev_data = train_dev_data.split(0.1)

trainer = Trainer(model=model, train_data=train_data, dev_data=dev_data,
                  loss=CrossEntropyLoss(), metrics=AccuracyMetric(),
                  callbacks=[FitlogCallback(test_data)])
trainer.train()

fitlog.finish()                     # finish the logging

用命令行在项目目录下执行 python main.py 之后,输出结果如下:

Auto commit by fitlog
input fields after batch(if batch size is 2):
    words: (1)type:torch.Tensor (2)dtype:torch.int64, (3)shape:torch.Size([2, 11])
target fields after batch(if batch size is 2):
    target: (1)type:torch.Tensor (2)dtype:torch.int64, (3)shape:torch.Size([2])

training epochs started 2019-05-23-21-11-51
Evaluation at Epoch 1/10. Step:2/20. AccuracyMetric: acc=0.285714

Evaluation at Epoch 2/10. Step:4/20. AccuracyMetric: acc=0.285714

Evaluation at Epoch 3/10. Step:6/20. AccuracyMetric: acc=0.285714

Evaluation at Epoch 4/10. Step:8/20. AccuracyMetric: acc=0.428571

Evaluation at Epoch 5/10. Step:10/20. AccuracyMetric: acc=0.571429

Evaluation at Epoch 6/10. Step:12/20. AccuracyMetric: acc=0.571429

Evaluation at Epoch 7/10. Step:14/20. AccuracyMetric: acc=0.285714

Evaluation at Epoch 8/10. Step:16/20. AccuracyMetric: acc=0.142857

Evaluation at Epoch 9/10. Step:18/20. AccuracyMetric: acc=0.285714

Evaluation at Epoch 10/10. Step:20/20. AccuracyMetric: acc=0.571429


In Epoch:5/Step:10, got best dev performance:AccuracyMetric: acc=0.571429
Reloaded the best model.

现在,我们在项目目录下输入 fitlog log logs ,命令行会启动一个网页,默认 url 为 0.0.0.0:5000 。 我们在浏览器中打开网页,可以看到如下的统计表格:

_images/fitlogTable.png

如果我们点击action中的最后一个键钮,可以看到详细的 loss 图:

_images/fitlogChart.png

更多的教程还在编写中,敬请期待~

API 文档

除了用户手册之外,你还可以通过查阅 API 文档来找到你所需要的工具。

fastNLP

fastNLP 由 coreioembeddingsmodulesmodels 等子模块组成,你可以查看每个模块的文档。

  • core 是fastNLP 的核心模块,包括 DataSet、 Trainer、 Tester 等组件。详见文档 fastNLP.core
  • io 是实现输入输出的模块,包括了数据集的读取,模型的存取等功能。详见文档 fastNLP.io
  • embeddings 提供用于构建复杂网络模型所需的各种embedding。详见文档 fastNLP.embeddings
  • modules 包含了用于搭建神经网络模型的诸多组件,可以帮助用户快速搭建自己所需的网络。详见文档 fastNLP.modules
  • models 包含了一些使用 fastNLP 实现的完整网络模型,包括 CNNTextSeqLabeling 等常见模型。详见文档 fastNLP.models

fastNLP 中最常用的组件可以直接从 fastNLP 包中 import ,他们的文档如下:

class fastNLP.Instance(**fields)[源代码]

别名 fastNLP.Instance fastNLP.core.instance.Instance

Instance是fastNLP中对应一个sample的类。每个sample在fastNLP中是一个Instance对象。 Instance一般与 DataSet 一起使用, Instance的初始化如下面的Example所示:

>>>from fastNLP import Instance
>>>ins = Instance(field_1=[1, 1, 1], field_2=[2, 2, 2])
>>>ins["field_1"]
[1, 1, 1]
>>>ins.add_field("field_3", [3, 3, 3])
>>>ins = Instance(**{'x1': 1, 'x2':np.zeros((3, 4))})
add_field(field_name, field)[源代码]

向Instance中增加一个field

参数:
  • field_name (str) -- 新增field的名称
  • field (Any) -- 新增field的内容
items()[源代码]

返回一个迭代器,迭代器返回两个内容,第一个内容是field_name, 第二个内容是field_value

返回:一个迭代器
class fastNLP.DataSetIter(dataset, batch_size=1, sampler=None, as_numpy=False, num_workers=0, pin_memory=False, drop_last=False, timeout=0, worker_init_fn=None, batch_sampler=None)[源代码]

基类 fastNLP.BatchIter

别名 fastNLP.DataSetIter fastNLP.core.batch.DataSetIter

DataSetIter 用于从 DataSet 中按一定的顺序, 依次按 batch_size 的大小将数据取出,通过使用DataSetIter,可以不需要考虑
输入的padding(由DataSet中每列的Padder决定了)以及不需要考虑将数据转为tensor。

组成 xy:

batch = DataSetIter(data_set, batch_size=16, sampler=SequentialSampler())
num_batch = len(batch)
for batch_x, batch_y in batch:
    # do stuff ...
__init__(dataset, batch_size=1, sampler=None, as_numpy=False, num_workers=0, pin_memory=False, drop_last=False, timeout=0, worker_init_fn=None, batch_sampler=None)[源代码]
参数:
  • dataset -- DataSet 对象, 数据集
  • batch_size (int) -- 取出的batch大小
  • sampler --

    规定使用的 Sampler 方式. 若为 None , 使用 SequentialSampler.

    Default: None

  • as_numpy (bool) --

    若为 True , 输出batch为 numpy.array. 否则为 torch.Tensor.

    Default: False

  • num_workers (int) -- 使用多少个进程来预处理数据
  • pin_memory (bool) -- 是否将产生的tensor使用pin memory, 可能会加快速度。
  • drop_last (bool) -- 如果最后一个batch没有batch_size这么多sample,就扔掉最后一个
  • timeout -- 生成一个batch的timeout值
  • worker_init_fn -- 在每个worker启动时调用该函数,会传入一个值,该值是worker的index。
  • batch_sampler -- 当每次batch取出的数据数量不一致时,可以使用该sampler。batch_sampler每次iter应该输出一个list的index。 当batch_sampler不为None时,参数batch_size, sampler, drop_last会被忽略。
dataset

获取正在参与iterate的dataset

返回:
get_batch_indices()

获取最近输出的batch的index。用于溯源当前batch的数据

返回:
static get_num_batches(num_samples, batch_size, drop_last)

计算batch的数量。用于前端显示进度

参数:
  • num_samples (int) --
  • batch_size (int) --
  • drop_last (bool) -- 如果最后一个batch没有batch_size这么多,是否就丢掉。
返回:

class fastNLP.BatchIter(dataset, batch_size=1, sampler=None, num_workers=0, pin_memory=False, drop_last=False, timeout=0, worker_init_fn=None, collate_fn=None, batch_sampler=None)[源代码]

别名 fastNLP.BatchIter fastNLP.core.batch.BatchIter

Trainer用于迭代数据的类。继承该类,并实现get_num_batches(), get_batch_indices(), num_batches(), __iter__()方法以及dataset属性。

dataset

获取正在参与iterate的dataset

返回:
get_batch_indices()[源代码]

获取最近输出的batch的index。用于溯源当前batch的数据

返回:
static get_num_batches(num_samples, batch_size, drop_last)[源代码]

计算batch的数量。用于前端显示进度

参数:
  • num_samples (int) --
  • batch_size (int) --
  • drop_last (bool) -- 如果最后一个batch没有batch_size这么多,是否就丢掉。
返回:

class fastNLP.TorchLoaderIter(dataset, collate_fn, batch_size=1, sampler=None, num_workers=0, pin_memory=False, drop_last=False, timeout=0, worker_init_fn=None, batch_sampler=None)[源代码]

基类 fastNLP.BatchIter

别名 fastNLP.TorchLoaderIter fastNLP.core.batch.TorchLoaderIter

与DataSetIter类似,但可以用于非fastNLP的数据容器对象,以及可以实现完全自定义的生成batch的方式,然后与Trainer,Tester可以实现
与DataSetIter一样的对接。

需要保证传入的数据容器实现了实现了以下的方法

Example:

import random
from fastNLP import TorchLoaderIter
import torch
class UdfDataSet:
    def __init__(self, num_samples):
        self.num_samples = num_samples

    def __getitem__(self, idx):  # 必须实现的方法,输入参数是一个int,范围为[0, len(self))
        x = [random.random() for _ in range(3)]
        y = random.random()
        return x,y

    def __len__(self):  # 需要实现该方法返回值需要是一个int数据
        return self.num_samples

# 需要实现collact_fn将数据转换为tensor
def collate_fn(data_list):
    # [(x1,y1), (x2,y2), ...], 这里的输入实际上是将UdfDataSet的__getitem__输入结合为list
    xs, ys = [], []
    for l in data_list:
        x, y = l
        xs.append(x)
        ys.append(y)
    # 不需要转移到gpu,Trainer或Tester会将其转移到model所在的device
    x,y = torch.FloatTensor(xs), torch.FloatTensor(ys)
    return {'x':x, 'y':y}, {'y':y}  # 第一个dict中内容类似于DataSet中的input列,第二个dict的内容类似于target列

udf_dataset = UdfDataSet(10)
dataset = TorchLoaderIter(udf_dataset, collate_fn=collate_fn)
class Model(nn.Module):
    def __init__(self):
        super().__init__()
        self.fc = nn.Linear(3, 1)
    def forward(self, x, y):
        return {'loss':torch.pow(self.fc(x).squeeze(-1)-y, 2).sum()}
    def predict(self, x):
        return {'pred':self.fc(x).squeeze(0)}
model = Model()
trainer = Trainer(train_data=dataset, model=model, loss=None, print_every=2, dev_data=dataset,
                  metrics=AccuracyMetric(target='y'), use_tqdm=False)
trainer.train(load_best_model=False)

除此之外,还可以通过该方法实现OnTheFly的训练,如下面的代码所示

Example:

import tempfile
import random
import torch
tmp_file_handler, tmp_file_path = tempfile.mkstemp(text=True)
try:
    num_samples, data = 10, []
    for _ in range(num_samples):
        x, y = [random.random() for _ in range(3)], random.random()
        data.append(x + [y])
    with open(tmp_file_path, 'w') as f:
        for d in data:
            f.write(' '.join(map(str, d)) + '\n')

    class FileDataSet:
        def __init__(self, tmp_file):
            num_samples = 0
            line_pos = [0]  # 对应idx是某一行对应的位置
            self.tmp_file_handler = open(tmp_file, 'r', encoding='utf-8')
            line = self.tmp_file_handler.readline()
            while line:
                if line.strip():
                    num_samples += 1
                    line_pos.append(self.tmp_file_handler.tell())
                line = self.tmp_file_handler.readline()
            self.tmp_file_handler.seek(0)
            self.num_samples = num_samples
            self.line_pos = line_pos

        def __getitem__(self, idx):
            line_start, line_end = self.line_pos[idx], self.line_pos[idx + 1]
            self.tmp_file_handler.seek(line_start)
            line = self.tmp_file_handler.read(line_end - line_start).strip()
            values = list(map(float, line.split()))
            x, y = values[:3], values[-1]
            return x, y

        def __len__(self):
            return self.num_samples

    def collate_fn(data_list):
        # [(x1,y1), (x2,y2), ...], 这里的输入实际上是将UdfDataSet的__getitem__输入结合为list
        xs, ys = [], []
        for l in data_list:
            x, y = l
            xs.append(x)
            ys.append(y)
        x, y = torch.FloatTensor(xs), torch.FloatTensor(ys)
        return {'x': x, 'y': y}, {'y': y}  # 第一个dict中内容类似于DataSet中的input列,第二个dict的内容类似于target列

    file_data = FileDataSet(tmp_file_path)
    dataset = TorchLoaderIter(file_data, collate_fn=collate_fn)

    class Model(nn.Module):
        def __init__(self):
            super().__init__()
            self.fc = nn.Linear(3, 1)

        def forward(self, x, y):
            return {'loss': torch.pow(self.fc(x).squeeze(-1) - y, 2).sum()}

        def predict(self, x):
            return {'pred': self.fc(x).squeeze(0)}

    model = Model()
    trainer = Trainer(train_data=dataset, model=model, loss=None, print_every=2, dev_data=dataset,
                      metrics=AccuracyMetric(target='y'), use_tqdm=False, n_epochs=2)
    trainer.train(load_best_model=False)

finally:
    import os
    if os.path.exists(tmp_file_path):
        os.remove(tmp_file_path)
__init__(dataset, collate_fn, batch_size=1, sampler=None, num_workers=0, pin_memory=False, drop_last=False, timeout=0, worker_init_fn=None, batch_sampler=None)[源代码]
参数:
  • dataset -- 实现了__getitem__和__len__方法的数据容器。
  • collate_fn (callable) -- 用于将样本组合成batch的函数。输入为[dataset[idx1], dataset[idx2], ...], 即dataset中 __getitem__返回值组成的list,返回值必须为两个dict,其中第一个dict会被认为是input,第二个dict中的内容被认为是target。 需要转换为tensor的数据,需要在collate_fn中转化,但不需要转移到对应device。
  • batch_size (int) -- 取出的batch大小
  • sampler -- 规定使用的 Sampler 方式. 若为 None , 使用 SequentialSampler. Default: None
  • num_workers (int) -- 使用多少个进程来预处理数据
  • pin_memory (bool) -- 是否将产生的tensor使用pin memory, 可能会加快速度。
  • drop_last (bool) -- 如果最后一个batch没有batch_size这么多sample,就扔掉最后一个
  • timeout -- 生成一个batch的timeout值
  • worker_init_fn -- 在每个worker启动时调用该函数,会传入一个值,该值是worker的index。
  • batch_sampler -- 当每次batch取出的数据数量不一致时,可以使用该sampler。batch_sampler每次iter应该输出一个list的index。 当batch_sampler不为None时,参数batch_size, sampler, drop_last会被忽略。
dataset

获取正在参与iterate的dataset

返回:
get_batch_indices()

获取最近输出的batch的index。用于溯源当前batch的数据

返回:
static get_num_batches(num_samples, batch_size, drop_last)

计算batch的数量。用于前端显示进度

参数:
  • num_samples (int) --
  • batch_size (int) --
  • drop_last (bool) -- 如果最后一个batch没有batch_size这么多,是否就丢掉。
返回:

class fastNLP.Vocabulary(max_size=None, min_freq=None, padding='<pad>', unknown='<unk>')[源代码]

别名 fastNLP.Vocabulary fastNLP.core.vocabulary.Vocabulary

用于构建, 存储和使用 strint 的一一映射:

vocab = Vocabulary()
word_list = "this is a word list".split()
vocab.update(word_list)
vocab["word"] # str to int
vocab.to_word(5) # int to str
__init__(max_size=None, min_freq=None, padding='<pad>', unknown='<unk>')[源代码]
参数:
  • max_size (int) -- Vocabulary 的最大大小, 即能存储词的最大数量 若为 None , 则不限制大小. Default: None
  • min_freq (int) -- 能被记录下的词在文本中的最小出现频率, 应大于或等于 1. 若小于该频率, 词语将被视为 unknown. 若为 None , 所有文本中的词都被记录. Default: None
  • optional padding (str) -- padding的字符. 如果设置为 None , 则vocabulary中不考虑padding, 也不计入词表大小,为 None 的情况多在为label建立Vocabulary的情况. Default: '<pad>'
  • optional unknown (str) -- unknown的字符,所有未被记录的词在转为 int 时将被视为unknown. 如果设置为 None ,则vocabulary中不考虑unknow, 也不计入词表大小. 为 None 的情况多在为label建立Vocabulary的情况. Default: '<unk>'
add(word, no_create_entry=False)[源代码]

增加一个新词在词典中的出现频率

参数:
  • word (str) -- 新词
  • no_create_entry (bool) -- 在使用fastNLP.TokenEmbedding加载预训练模型时,没有从预训练词表中找到这个词的处理方式。 如果为True,则不会有这个词语创建一个单独的entry,它将一直被指向unk的表示; 如果为False,则为这个词创建一个单独 的entry。如果这个word来自于dev或者test,一般设置为True,如果来自与train一般设置为False。以下两种情况: 如果新 加入一个word,且no_create_entry为True,但这个词之前已经在Vocabulary中且并不是no_create_entry的,则还是会为这 个词创建一个单独的vector; 如果no_create_entry为False,但这个词之前已经在Vocabulary中且并不是no_create_entry的, 则这个词将认为是需要创建单独的vector的。
add_word(word, no_create_entry=False)[源代码]

增加一个新词在词典中的出现频率

参数:
  • word (str) -- 新词
  • no_create_entry (bool) -- 在使用fastNLP.TokenEmbedding加载预训练模型时,没有从预训练词表中找到这个词的处理方式。 如果为True,则不会有这个词语创建一个单独的entry,它将一直被指向unk的表示; 如果为False,则为这个词创建一个单独 的entry。如果这个word来自于dev或者test,一般设置为True,如果来自与train一般设置为False。以下两种情况: 如果新 加入一个word,且no_create_entry为True,但这个词之前已经在Vocabulary中且并不是no_create_entry的,则还是会为这 个词创建一个单独的vector; 如果no_create_entry为False,但这个词之前已经在Vocabulary中且并不是no_create_entry的, 则这个词将认为是需要创建单独的vector的。
add_word_lst(word_lst, no_create_entry=False)[源代码]

依次增加序列中词在词典中的出现频率

参数:
  • word_lst (list[str]) -- 词的序列
  • no_create_entry (bool) -- 在使用fastNLP.TokenEmbedding加载预训练模型时,没有从预训练词表中找到这个词的处理方式。 如果为True,则不会有这个词语创建一个单独的entry,它将一直被指向unk的表示; 如果为False,则为这个词创建一个单独 的entry。如果这个word来自于dev或者test,一般设置为True,如果来自与train一般设置为False。以下两种情况: 如果新 加入一个word,且no_create_entry为True,但这个词之前已经在Vocabulary中且并不是no_create_entry的,则还是会为这 个词创建一个单独的vector; 如果no_create_entry为False,但这个词之前已经在Vocabulary中且并不是no_create_entry的, 则这个词将认为是需要创建单独的vector的。
build_reverse_vocab()[源代码]

基于 word to index dict, 构建 index to word dict.

build_vocab()[源代码]

根据已经出现的词和出现频率构建词典. 注意: 重复构建可能会改变词典的大小, 但已经记录在词典中的词, 不会改变对应的 int

clear()[源代码]

删除Vocabulary中的词表数据。相当于重新初始化一下。

返回:
from_dataset(*datasets, field_name, no_create_entry_dataset=None)[源代码]

使用dataset的对应field中词构建词典:

# remember to use `field_name`
vocab.from_dataset(train_data1, train_data2, field_name='words')
参数:
  • datasets (DataSet,List[DataSet]) -- 需要转index的一个或多个数据集
  • field_name (str,List[str]) -- 可为 strList[str] . 构建词典所使用的 field(s), 支持一个或多个field,若有多个 DataSet, 每个DataSet都必须有这些field. 目前支持的field结构 : str , List[str]
  • no_create_entry_dataset -- 可以传入DataSet, List[DataSet]或者None(默认),该选项用在接下来的模型会使用pretrain 的embedding(包括glove, word2vec, elmo与bert)且会finetune的情况。如果仅使用来自于train的数据建立vocabulary,会导致test与dev 中的数据无法充分利用到来自于预训练embedding的信息,所以在建立词表的时候将test与dev考虑进来会使得最终的结果更好。 如果一个词出现在了train中,但是没在预训练模型中,embedding会为它用unk初始化,但它是单独的一个vector,如果 finetune embedding的话,这个词在更新之后可能会有更好的表示; 而如果这个词仅出现在了dev或test中,那么就不能为它们单独建立vector, 而应该让它指向unk这个vector的值。所以只位于no_create_entry_dataset中的token,将首先从预训练的词表中寻找它的表示, 如果找到了,就使用该表示; 如果没有找到,则认为该词的表示应该为unk的表示。
Return self:
has_word(w)[源代码]

检查词是否被记录:

has_abc = vocab.has_word('abc')
# equals to
has_abc = 'abc' in vocab
参数:item -- the word
返回:True or False
index_dataset(*datasets, field_name, new_field_name=None)[源代码]

将DataSet中对应field的词转为数字,Example:

# remember to use `field_name`
vocab.index_dataset(train_data, dev_data, test_data, field_name='words')
参数:
  • datasets (DataSet,List[DataSet]) -- 需要转index的一个或多个数据集
  • field_name (list,str) -- 需要转index的field, 若有多个 DataSet, 每个DataSet都必须有此 field. 目前支持 str , List[str]
  • new_field_name (list,str) -- 保存结果的field_name. 若为 None , 将覆盖原field. Default: None.
static load(filepath)[源代码]
参数:filepath (str) -- Vocabulary的读取路径
返回:Vocabulary
padding_idx

padding 对应的数字

save(filepath)[源代码]
参数:filepath (str) -- Vocabulary的储存路径
返回:
to_index(w)[源代码]

将词转为数字. 若词不再词典中被记录, 将视为 unknown, 若 unknown=None , 将抛出 ValueError

index = vocab.to_index('abc')
# equals to
index = vocab['abc']
参数:w (str) -- a word
Return int index:
 the number
to_word(idx)[源代码]

给定一个数字, 将其转为对应的词.

参数:idx (int) -- the index
Return str word:
 the word
unknown_idx

unknown 对应的数字.

update(word_lst, no_create_entry=False)[源代码]

依次增加序列中词在词典中的出现频率

参数:
  • word_lst (list) -- a list of strings
  • no_create_entry (bool) -- 在使用fastNLP.TokenEmbedding加载预训练模型时,没有从预训练词表中找到这个词的处理方式。 如果为True,则不会有这个词语创建一个单独的entry,它将一直被指向unk的表示; 如果为False,则为这个词创建一个单独 的entry。如果这个word来自于dev或者test,一般设置为True,如果来自与train一般设置为False。以下两种情况: 如果新 加入一个word,且no_create_entry为True,但这个词之前已经在Vocabulary中且并不是no_create_entry的,则还是会为这 个词创建一个单独的vector; 如果no_create_entry为False,但这个词之前已经在Vocabulary中且并不是no_create_entry的, 则这个词将认为是需要创建单独的vector的。
class fastNLP.DataSet(data=None)[源代码]

别名 fastNLP.DataSet fastNLP.core.dataset.DataSet

fastNLP的数据容器,详细的使用方法见文档 fastNLP.core.dataset

__init__(data=None)[源代码]
参数:data -- 如果为dict类型,则每个key的value应该为等长的list; 如果为list, 每个元素应该为具有相同field的 Instance
add_collate_fn(fn, name=None)[源代码]

添加 CollateFn,collate_fn允许在生成的batch的过程中动态生成一些数据(在DataSetIter作为迭代器的情况下有效,默认情况下就是用的 这个)。支持依次添加多个collate_fn, 如果相同的key,后面的collate_fn的结果覆盖前面的collate_fn的结果。

参数:
  • fn (callable) -- 传入一个可调用的function, 该function可接受的参数为List[(ind1, instance1), (ind2, instance2)] (某个batch被选中的所有的indice以及instance),其中ind1/ind2是该instance在dataset中的index,instance1/instance2是 这次batch取出来的数据,包含了所有的field。返回值需要为两个dict,第一个dict的值将被认为是input,第二个dict的值被认为是 target,返回的值至多允许一个空dict。若返回的dict中包含了被设置为input或target的field的名称,将覆盖dataset中的field。 fastNLP不会将collate_fn的返回结果pad和转换为tensor,需要在collate_fn中完成pad和转换为tensor(不需要将tensor移动到 gpu中,fastNLP会自动将其移动到特定gpu)。不要修改传入collate_fn中的数据,否则可能导致未知问题。
  • name (str,int) -- collate_fn的名称,如果不传入,默认使用自增长的数字作为key。相同的name会覆盖之前的collate_fn。
add_field(field_name, fields, padder=<fastNLP.core.field.AutoPadder object>, is_input=False, is_target=False, ignore_type=False)[源代码]

新增一个field

参数:
  • field_name (str) -- 新增的field的名称
  • fields (list) -- 需要新增的field的内容
  • padder (None,Padder) -- 如果为None,则不进行pad,默认使用 AutoPadder 自动判断是否需要做pad。
  • is_input (bool) -- 新加入的field是否是input
  • is_target (bool) -- 新加入的field是否是target
  • ignore_type (bool) -- 是否忽略对新加入的field的类型检查
add_fieldarray(field_name, fieldarray)[源代码]

将fieldarray添加到DataSet中.

参数:
  • field_name (str) -- 新加入的field的名称
  • fieldarray (FieldArray) -- 需要加入DataSet的field的内容
返回:

add_seq_len(field_name: str, new_field_name='seq_len')[源代码]

将使用len()直接对field_name中每个元素作用,将其结果作为sequence length, 并放入seq_len这个field。

参数:
  • field_name -- str.
  • new_field_name -- str. 新的field_name
返回:

append(instance)[源代码]

将一个instance对象append到DataSet后面。

参数:instance (Instance) -- 若DataSet不为空,则instance应该拥有和DataSet完全一样的field。
apply(func, new_field_name=None, **kwargs)[源代码]

将DataSet中每个instance传入到func中,并获取它的返回值.

参数:
  • func (callable) -- 参数是 DataSet 中的 Instance
  • new_field_name (None,str) -- 将func返回的内容放入到 new_field_name 这个field中,如果名称与已有的field相同,则覆 盖之前的field。如果为None则不创建新的field。
  • kwargs (optional) --

    支持输入is_input,is_target,ignore_type

    1. is_input: bool, 如果为True则将 new_field_name 的field设置为input
    2. is_target: bool, 如果为True则将 new_field_name 的field设置为target
    3. ignore_type: bool, 如果为True则将 new_field_name 的field的ignore_type设置为true, 忽略其类型
Return List[Any]:
 

里面的元素为func的返回值,所以list长度为DataSet的长度

apply_field(func, field_name, new_field_name=None, **kwargs)[源代码]

将DataSet中的每个instance中的名为 field_name 的field传给func,并获取它的返回值。

参数:
  • func (callable) -- input是instance中名为 field_name 的field的内容。
  • field_name (str) -- 传入func的是哪个field。
  • new_field_name (None,str) -- 将func返回的内容放入到 new_field_name 这个field中,如果名称与已有的field相同,则覆 盖之前的field。如果为None则不创建新的field。
  • kwargs (optional) --

    支持输入is_input,is_target,ignore_type

    1. is_input: bool, 如果为True则将名为 new_field_name 的field设置为input
    2. is_target: bool, 如果为True则将名为 new_field_name 的field设置为target
    3. ignore_type: bool, 如果为True则将名为 new_field_name 的field的ignore_type设置为true, 忽略其类型
Return List[Any]:
 

里面的元素为func的返回值,所以list长度为DataSet的长度

apply_field_more(func, field_name, modify_fields=True, **kwargs)[源代码]

DataSet 中的每个 Instance 中的名为 field_name 的field 传给 func,并获取它的返回值。 func 可以返回一个或多个 field 上的结果。

注解

apply_field_moreapply_field 的区别参考 apply_more() 中关于 apply_moreapply 区别的介绍。

参数:
  • func (callable) -- 参数是 DataSet 中的 Instance ,返回值是一个字典,key 是field 的名字,value 是对应的结果
  • field_name (str) -- 传入func的是哪个field。
  • modify_fields (bool) -- 是否用结果修改 DataSet 中的 Field, 默认为 True
  • kwargs (optional) --

    支持输入is_input,is_target,ignore_type

    1. is_input: bool, 如果为True则将被修改的field设置为input
    2. is_target: bool, 如果为True则将被修改的field设置为target
    3. ignore_type: bool, 如果为True则将被修改的field的ignore_type设置为true, 忽略其类型

:return Dict[int:Field]: 返回一个字典

apply_more(func, modify_fields=True, **kwargs)[源代码]

DataSet 中每个 Instance 传入到func中,并获取它的返回值。func可以返回一个或多个 field 上的结果。

注解

apply_moreapply 的区别:

  1. apply_more 可以返回多个 field 的结果, apply 只可以返回一个field 的结果;
  2. apply_more 的返回值是一个字典,每个 key-value 对中的 key 表示 field 的名字,value 表示计算结果;
  3. apply_more 默认修改 DataSet 中的 field ,apply 默认不修改。
参数:
  • func (callable) -- 参数是 DataSet 中的 Instance ,返回值是一个字典,key 是field 的名字,value 是对应的结果
  • modify_fields (bool) -- 是否用结果修改 DataSet 中的 Field , 默认为 True
  • kwargs (optional) --

    支持输入is_input,is_target,ignore_type

    1. is_input: bool, 如果为True则将被修改的的field设置为input
    2. is_target: bool, 如果为True则将被修改的的field设置为target
    3. ignore_type: bool, 如果为True则将被修改的的field的ignore_type设置为true, 忽略其类型

:return Dict[int:Field]: 返回一个字典

copy_field(field_name, new_field_name)[源代码]

深度copy名为field_name的field到new_field_name

参数:
  • field_name (str) -- 需要copy的field。
  • new_field_name (str) -- copy生成的field名称
返回:

self

delete_collate_fn(name=None)[源代码]

删除某个collate_fn

参数:name (str,int) -- 如果为None,则删除最近加入的collate_fn
返回:
delete_field(field_name)[源代码]

删除名为field_name的field

参数:field_name (str) -- 需要删除的field的名称.
delete_instance(index)[源代码]

删除第index个instance

参数:index (int) -- 需要删除的instance的index,序号从0开始。
drop(func, inplace=True)[源代码]

func接受一个Instance,返回bool值。返回值为True时,该Instance会被移除或者不会包含在返回的DataSet中。

参数:
  • func (callable) -- 接受一个Instance作为参数,返回bool值。为True时删除该instance
  • inplace (bool) -- 是否在当前DataSet中直接删除instance;如果为False,将返回一个新的DataSet。
返回:

DataSet

get_all_fields()[源代码]

返回一个dict,key为field_name, value为对应的 FieldArray

Return dict:返回如上所述的字典
get_field(field_name)[源代码]

获取field_name这个field

参数:field_name (str) -- field的名称
返回:FieldArray
get_field_names() → list[源代码]

返回一个list,包含所有 field 的名字

Return list:返回如上所述的列表
get_input_name()[源代码]

返回所有is_input被设置为True的field名称

Return list:里面的元素为被设置为input的field名称
get_length()[源代码]

获取DataSet的元素数量

返回:int: DataSet中Instance的个数。
get_target_name()[源代码]

返回所有is_target被设置为True的field名称

Return list:里面的元素为被设置为target的field名称
has_field(field_name)[源代码]

判断DataSet中是否有名为field_name这个field

参数:field_name (str) -- field的名称
Return bool:表示是否有名为field_name这个field
static load(path)[源代码]

从保存的DataSet pickle文件的路径中读取DataSet

参数:path (str) -- 从哪里读取DataSet
返回:读取后的 读取后的DataSet
print_field_meta()[源代码]

输出当前field的meta信息, 形似下列的输出:

+-------------+-------+-------+
| field_names |   x   |   y   |
+=============+=======+=======+
|   is_input  |  True | False |
|  is_target  | False | False |
| ignore_type | False |       |
|  pad_value  |   0   |       |
+-------------+-------+-------+
参数:
  • field_names -- DataSet中field的名称
  • is_input -- field是否为input
  • is_target -- field是否为target
  • ignore_type -- 是否忽略该field的type, 一般仅在该field至少为input或target时才有意义
  • pad_value -- 该field的pad的值,仅在该field为input或target时有意义
返回:

rename_field(field_name, new_field_name)[源代码]

将某个field重新命名.

参数:
  • field_name (str) -- 原来的field名称。
  • new_field_name (str) -- 修改为new_name。
save(path)[源代码]

保存DataSet.

参数:path (str) -- 将DataSet存在哪个路径
set_ignore_type(*field_names, flag=True)[源代码]

将field设置为忽略类型状态。当某个field被设置了ignore_type, 则在被设置为target或者input时将不进行类型检查, 默认情况下也不进行pad。如果仍需要pad该field,可通过自定义Padder实现,若该field需要转换为tensor,需要在padder 中转换,但不需要在padder中移动到gpu。

参数:
  • field_names (str) -- field的名称
  • flag (bool) -- 将field_name的ignore_type状态设置为flag
返回:

set_input(*field_names, flag=True, use_1st_ins_infer_dim_type=True)[源代码]

将field_names的field设置为input:

dataset.set_input('words', 'seq_len')   # 将words和seq_len这两个field的input属性设置为True
dataset.set_input('words', flag=False)  # 将words这个field的input属性设置为False
参数:
  • field_names (str) -- field的名称
  • flag (bool) -- 将field_name的input状态设置为flag
  • use_1st_ins_infer_dim_type (bool) -- 如果为True,将不会check该列是否所有数据都是同样的维度,同样的类型。将直接使用第一 行的数据进行类型和维度推断本列的数据的类型和维度。
set_pad_val(field_name, pad_val)[源代码]

为某个field设置对应的pad_val.

参数:
  • field_name (str) -- 修改该field的pad_val
  • pad_val (int) -- 该field的padder会以pad_val作为padding index
set_padder(field_name, padder)[源代码]

为field_name设置padder:

from fastNLP import EngChar2DPadder
padder = EngChar2DPadder()
dataset.set_padder('chars', padder)  # 则chars这个field会使用EngChar2DPadder进行pad操作
参数:
  • field_name (str) -- 设置field的padding方式为padder
  • padder (None,Padder) -- 设置为None即删除padder, 即对该field不进行pad操作。
set_target(*field_names, flag=True, use_1st_ins_infer_dim_type=True)[源代码]

将field_names的field设置为target

Example:

dataset.set_target('labels', 'seq_len')  # 将labels和seq_len这两个field的target属性设置为True
dataset.set_target('labels', 'seq_lens', flag=False) # 将labels和seq_len的target属性设置为False
参数:
  • field_names (str) -- field的名称
  • flag (bool) -- 将field_name的target状态设置为flag
  • use_1st_ins_infer_dim_type (bool) -- 如果为True,将不会check该列是否所有数据都是同样的维度,同样的类型。将直接使用第一 行的数据进行类型和维度推断本列的数据的类型和维度。
split(ratio, shuffle=True)[源代码]

将DataSet按照ratio的比例拆分,返回两个DataSet

参数:
  • ratio (float) -- 0<ratio<1, 返回的第一个DataSet拥有 (1-ratio) 这么多数据,第二个DataSet拥有`ratio`这么多数据
  • shuffle (bool) -- 在split前是否shuffle一下
返回:

[ 读取后的DataSet , 读取后的DataSet ]

class fastNLP.Const[源代码]

别名 fastNLP.Const fastNLP.core.const.Const

fastNLP中field命名常量。

具体列表:

INPUT       模型的序列输入      words(具有多列words时,依次使用words1, words2, )
CHAR_INPUT  模型character输入  chars(具有多列chars时,依次使用chars1, chars2)
INPUT_LEN   序列长度           seq_len(具有多列seq_len时,依次使用seq_len1,seq_len2)
OUTPUT      模型输出           pred(具有多列pred时,依次使用pred1, pred2)
TARGET      真实目标           target(具有多列target时,依次使用target1,target2)
LOSS        损失函数           loss (具有多列loss时,依次使用loss1,loss2)
RAW_WORD    原文的词           raw_words  (具有多列raw_words时,依次使用raw_words1, raw_words2)
RAW_CHAR    原文的字           raw_chars  (具有多列raw_chars时,依次使用raw_chars1, raw_chars2)
CHAR_INPUT = 'chars'
static CHAR_INPUTS(i)[源代码]

得到第 i 个 CHAR_INPUT 的命名

INPUT = 'words'
static INPUTS(i)[源代码]

得到第 i 个 INPUT 的命名

INPUT_LEN = 'seq_len'
static INPUT_LENS(i)[源代码]

得到第 i 个 INPUT_LEN 的命名

LOSS = 'loss'
static LOSSES(i)[源代码]

得到第 i 个 LOSS 的命名

OUTPUT = 'pred'
static OUTPUTS(i)[源代码]

得到第 i 个 OUTPUT 的命名

RAW_CHAR = 'raw_chars'
static RAW_CHARS(i)[源代码]

得到第 i 个 RAW_CHARS 的命名

RAW_WORD = 'raw_words'
static RAW_WORDS(i)[源代码]

得到第 i 个 RAW_WORDS 的命名

TARGET = 'target'
static TARGETS(i)[源代码]

得到第 i 个 TARGET 的命名

__init__

Initialize self. See help(type(self)) for accurate signature.

class fastNLP.Trainer(train_data, model, optimizer=None, loss=None, batch_size=32, sampler=None, drop_last=False, update_every=1, num_workers=0, n_epochs=10, print_every=5, dev_data=None, metrics=None, metric_key=None, validate_every=-1, save_path=None, use_tqdm=True, device=None, callbacks=None, check_code_level=0, **kwargs)[源代码]

别名 fastNLP.Trainer fastNLP.core.trainer.Trainer

Trainer在fastNLP中用于组织单任务的训练过程,可以避免用户在不同训练任务中重复撰写
  1. epoch循环;
  2. 将数据分成不同的Batch;
  3. 对Batch进行pad;
  4. 每个epoch结束或一定step后进行验证集验证;
  5. 保存获得更好验证性能的模型等。

详细的介绍参见 fastNLP.core.trainer

__init__(train_data, model, optimizer=None, loss=None, batch_size=32, sampler=None, drop_last=False, update_every=1, num_workers=0, n_epochs=10, print_every=5, dev_data=None, metrics=None, metric_key=None, validate_every=-1, save_path=None, use_tqdm=True, device=None, callbacks=None, check_code_level=0, **kwargs)[源代码]
参数:
  • train_data -- 训练集, DataSet 类型或 BatchIter 的子类
  • model (nn.modules) -- 待训练的模型
  • optimizer -- torch.optim.Optimizer 优化器。如果为None,则Trainer使用默认的Adam(model.parameters(), lr=4e-3)这个优化器
  • batch_size (int) -- 训练和验证的时候的batch大小。
  • loss -- 使用的 LossBase 对象。当为None时,默认使用 LossInForward
  • sampler -- Batch数据生成的顺序, Sampler 类型。如果为None,默认使用 RandomSampler
  • drop_last -- 如果最后一个batch没有正好为batch_size这么多数据,就扔掉最后一个batch
  • num_workers -- int, 有多少个线程来进行数据pad处理。
  • update_every -- int, 多少步更新一次梯度。用于希望累计梯度的场景,比如需要128的batch_size, 但是直接设为128 会导致内存不足,通过设置batch_size=32, update_every=4达到目的。当optimizer为None时,该参数无效。
  • n_epochs (int) -- 需要优化迭代多少次。
  • print_every (int) -- 多少次反向传播更新tqdm显示的loss; 如果use_tqdm=False, 则多少次反向传播打印loss。
  • dev_data -- 用于做验证的DataSet, DataSet 类型。
  • metrics -- 验证的评估函数。可以只使用一个 Metric , 也可以使用多个 Metric ,通过列表传入。 如验证时取得了更好的验证结果(如果有多个Metric,以列表中第一个Metric为准),且save_path不为None, 则保存当前模型。Metric种类详见 metrics模块 。仅在传入dev_data时有效。
  • metric_key (str,None) -- Metric 有时会有多个指标, 比如 SpanFPreRecMetric 中包含了'f', 'pre', 'rec'。此时需 要指定以哪个指标为准。另外有些指标是越小效果越好,比如语言模型的困惑度,这种情况下,在key前面增加一个'-'来表 明验证时,值越小越好(比如: "-ppl")。仅在传入dev_data时有效。
  • validate_every (int) -- 多少个step在验证集上验证一次; 如果为-1,则每个epoch结束验证一次。仅在传入dev_data时有效。
  • save_path (str,None) -- 将模型保存路径,如果路径不存在,将自动创建文件夹。如果为None,则不保存模型。如果dev_data为None,则保存 最后一次迭代的模型。保存的时候不仅保存了参数,还保存了模型结构。即便使用DataParallel,这里也只保存模型。
  • use_tqdm (bool) -- 是否使用tqdm来显示训练进度; 如果为False,则将loss打印在终端中。
  • device (str,int,torch.device,list(int)) --

    将模型load到哪个设备。默认为None,即Trainer不对模型 的计算位置进行管理。支持以下的输入:

    1. str: ['cpu', 'cuda', 'cuda:0', 'cuda:1', ...] 依次为'cpu'中, 可见的第一个GPU中, 可见的第一个GPU中, 可见的第二个GPU中;

    1. torch.device:将模型装载到torch.device上。
    2. int: 将使用device_id为该值的gpu进行训练
    3. list(int):如果多于1个device,将使用torch.nn.DataParallel包裹model, 并使用传入的device。
    4. None. 为None则不对模型进行任何处理,如果传入的model为torch.nn.DataParallel该值必须为None。

    已知可能会出现的问题:Adagrad优化器可能无法正常使用这个参数,请手动管理模型位置。

  • callbacks (list(callbacks)) -- 用于在train过程中起调节作用的回调函数。比如early stop,negative sampling等可以 通过callback机制实现。 可使用的callback参见 callback模块
  • check_code_level (int) -- 模型检查等级. -1: 不进行检查; 0: 仅出现错误时停止; 1: 如果有field没有被使用, 报告警告信息; 2: 有任何field没有被使用都报错. 检查的原理是通过使用很小的batch(默认2个sample)来运行代码,但是 这个过程理论上不会修改任何参数,只是会检查能否运行。但如果(1)模型中存在将batch_size写为某个固定值的情况; (2)模型中存在累加前向计算次数的,可能会多计算1次。以上情况建议将check_code_level设置为-1。
is_master

是否是主进程

train(load_best_model=True, on_exception='auto')[源代码]

使用该函数使Trainer开始训练。

参数:
  • load_best_model (bool) -- 该参数只有在初始化提供了dev_data的情况下有效,如果True, trainer将在返回之前重新加载dev表现 最好的模型参数。
  • on_exception (str) -- 在训练过程遭遇exception,并被 :py:class:Callback 的on_exception()处理后,是否继续抛出异常。 支持'ignore','raise', 'auto': 'ignore'将捕获异常,写在Trainer.train()后面的代码将继续运行; 'raise'将异常抛出; 'auto'将ignore以下两种Exception: CallbackException与KeyboardInterrupt, raise其它exception.
Return dict:

返回一个字典类型的数据, 内含以下内容:

seconds: float, 表示训练时长
以下三个内容只有在提供了dev_data的情况下会有。
best_eval: Dict of Dict, 表示evaluation的结果。第一层的key为Metric的名称,
            第二层的key为具体的Metric
best_epoch: int,在第几个epoch取得的最佳值
best_step: int, 在第几个step(batch)更新取得的最佳值
class fastNLP.Tester(data, model, metrics, batch_size=16, num_workers=0, device=None, verbose=1, use_tqdm=True)[源代码]

别名 fastNLP.Tester fastNLP.core.tester.Tester

Tester是在提供数据,模型以及metric的情况下进行性能测试的类。需要传入模型,数据以及metric进行验证。

__init__(data, model, metrics, batch_size=16, num_workers=0, device=None, verbose=1, use_tqdm=True)[源代码]
参数:
  • data (DataSet,BatchIter) -- 需要测试的数据集
  • model (torch.nn.Module) -- 使用的模型
  • metrics (MetricBase,List[MetricBase]) -- 测试时使用的metrics
  • batch_size (int) -- evaluation时使用的batch_size有多大。
  • device (str,int,torch.device,list(int)) --

    将模型load到哪个设备。默认为None,即Trainer不对模型 的计算位置进行管理。支持以下的输入:

    1. str: ['cpu', 'cuda', 'cuda:0', 'cuda:1', ...] 依次为'cpu'中, 可见的第一个GPU中,可见的第一个GPU中,可见的第二个GPU中;
    2. torch.device:将模型装载到torch.device上。
    3. int: 将使用device_id为该值的gpu进行训练
    4. list(int):如果多于1个device,将使用torch.nn.DataParallel包裹model, 并使用传入的device。
    5. None. 为None则不对模型进行任何处理,如果传入的model为torch.nn.DataParallel该值必须为None。

    如果模型是通过predict()进行预测的话,那么将不能使用多卡(DataParallel)进行验证,只会使用第一张卡上的模型。

  • verbose (int) -- 如果为0不输出任何信息; 如果为1,打印出验证结果。
  • use_tqdm (bool) -- 是否使用tqdm来显示测试进度; 如果为False,则不会显示任何内容。
test()[源代码]

开始进行验证,并返回验证结果。

Return Dict[Dict]:
 dict的二层嵌套结构,dict的第一层是metric的名称; 第二层是这个metric的指标。一个AccuracyMetric的例子为{'AccuracyMetric': {'acc': 1.0}}。
class fastNLP.DistTrainer(train_data, model, optimizer=None, loss=None, callbacks_all=None, callbacks_master=None, batch_size_per_gpu=8, n_epochs=1, num_workers=1, drop_last=False, dev_data=None, metrics=None, metric_key=None, update_every=1, print_every=10, validate_every=-1, save_path=None, device='auto', fp16='', use_tqdm=True)[源代码]

别名 fastNLP.DistTrainer fastNLP.core.dist_trainer.DistTrainer

分布式的 Trainer,支持分布式训练和混合精度的训练。具体实现原理请阅读 pytorch 官方文档。

Note: 使用分布式 Trainer 时会同时有多个进程执行训练代码。因此将单进程的训练代码改为多进程之前, 请仔细检查,确保训练代码中的同步和互斥操作能正确执行(如模型保持,打印日志等)

__init__(train_data, model, optimizer=None, loss=None, callbacks_all=None, callbacks_master=None, batch_size_per_gpu=8, n_epochs=1, num_workers=1, drop_last=False, dev_data=None, metrics=None, metric_key=None, update_every=1, print_every=10, validate_every=-1, save_path=None, device='auto', fp16='', use_tqdm=True)[源代码]
参数:
  • train_data -- 训练集, DataSet 类型。
  • model (nn.modules) -- 待训练的模型
  • optimizer -- torch.optim.Optimizer 优化器。如果为None,则Trainer使用默认的Adam(model.parameters(), lr=4e-3)这个优化器
  • loss -- 使用的 LossBase 对象。当为None时,默认使用 LossInForward
  • callbacks_all (list) -- 用于在train过程中起调节作用的回调函数,作用于所有训练进程中。 可使用的callback参见 callback模块
  • callbacks_master (list) -- 用于在train过程中起调节作用的回调函数,只作用于其中一个进程( Master 进程)。 可使用的callback参见 callback模块
  • batch_size_per_gpu (int) -- 训练时,每个进程的 batch 大小。
  • n_epochs (int) -- 需要优化迭代多少次。
  • num_workers -- int, 有多少个线程来进行数据pad处理。
  • drop_last -- 如果最后一个batch没有正好为batch_size这么多数据,就扔掉最后一个batch
  • dev_data -- 用于做验证的DataSet, DataSet 类型。
  • metrics -- 验证的评估函数。可以只使用一个 Metric , 也可以使用多个 Metric ,通过列表传入。 如验证时取得了更好的验证结果(如果有多个Metric,以列表中第一个Metric为准),且save_path不为None, 则保存当前模型。Metric种类详见 metrics模块 。仅在传入dev_data时有效。
  • metric_key (str,None) -- Metric 有时会有多个指标, 比如 SpanFPreRecMetric 中包含了'f', 'pre', 'rec'。此时需 要指定以哪个指标为准。另外有些指标是越小效果越好,比如语言模型的困惑度,这种情况下,在key前面增加一个'-'来表 明验证时,值越小越好(比如: "-ppl")。仅在传入dev_data时有效。
  • update_every -- int, 多少步更新一次梯度。用于希望累计梯度的场景,比如需要128的batch_size, 但是直接设为128 会导致内存不足,通过设置batch_size=32, update_every=4达到目的。当optimizer为None时,该参数无效。
  • print_every (int) -- 多少次反向传播更新tqdm显示的loss; 如果use_tqdm=False, 则多少次反向传播打印loss。
  • validate_every (int) -- 多少个step在验证集上验证一次; 如果为-1,则每个epoch结束验证一次。仅在传入dev_data时有效。
  • save_path (str,None) -- 将模型保存路径,如果路径不存在,将自动创建文件夹。如果为None,则不保存模型。如果dev_data为None,则保存 最后一次迭代的模型。保存的时候不仅保存了参数,还保存了模型结构。即便使用DataParallel,这里也只保存模型。
  • device (str) -- 指定 device,可以是 gpu,cpu 或 auto
  • fp16 (str) -- 指定半精度训练的优化等级,可为 O1,O2 或 O3,若为空字符串则不使用半精度。
  • use_tqdm (bool) -- 是否使用tqdm来显示训练进度; 如果为False,则将loss打印在终端中。
close()[源代码]

关闭Trainer,销毁进程

is_master

是否是主进程

save_check_point(name=None, only_params=False)[源代码]

保存当前模型

train(load_best_model=True, on_exception='auto')[源代码]

使用该函数使Trainer开始训练。

参数:

on_exception (str) -- 在训练过程遭遇exception,并被 :py:class:Callback 的on_exception()处理后,是否继续抛出异常。 支持'ignore','raise', 'auto': 'ignore'将捕获异常,写在Trainer.train()后面的代码将继续运行; 'raise'将异常抛出; 'auto'将ignore以下两种Exception: CallbackException与KeyboardInterrupt, raise其它exception.

Return dict:

返回一个字典类型的数据, 内含以下内容:

seconds: float, 表示训练时长
以下三个内容只有在提供了dev_data的情况下会有。
best_eval: Dict of Dict, 表示evaluation的结果。第一层的key为Metric的名称,
            第二层的key为具体的Metric
best_epoch: int,在第几个epoch取得的最佳值
best_step: int, 在第几个step(batch)更新取得的最佳值
fastNLP.get_local_rank()[源代码]

别名 fastNLP.get_local_rank fastNLP.core.dist_trainer.get_local_rank

返回当前进程的 local rank, 0 到 N-1 ,N为当前分布式总进程数

class fastNLP.Callback[源代码]

别名 fastNLP.Callback fastNLP.core.callback.Callback

Callback是fastNLP中被设计用于增强 Trainer 的类。 如果Callback被传递给了 Trainer , 则 Trainer 会在对应的阶段调用Callback的函数, 具体调用时机可以通过 trainer 模块 查看。 这是Callback的基类,所有的callback必须继承自这个类

batch_per_epoch

每个epoch一共有多少个batch,只有在on_epoch_begin之后才能调用该属性。

batch_size

train和evaluate时的batch_size为多大

epoch

当前运行的epoch数,范围是[1, self.n_epochs+1)

model

正在被Trainer训练的模型

n_epochs

一共会运行多少个epoch

n_steps

Trainer一共会采多少个batch。当Trainer中update_every设置为非1的值时,该值不等于update的次数

on_backward_begin(loss)[源代码]

在loss得到之后,但在反向传播之前。可能可以进行loss是否为NaN的检查。

参数:loss (torch.Tensor) -- 计算得到的loss值
返回:
on_backward_end()[源代码]

反向梯度传播已完成,但由于update_every的设置,可能并不是每一次调用都有梯度。到这一步,还没有更新参数。

返回:
on_batch_begin(batch_x, batch_y, indices)[源代码]

每次采集到一个batch的数据则调用一次。这里对batch_x或batch_y删除添加内容是可以影响到Trainer中内容的。所以在这一步 可以进行一些负采样之类的操作

参数:
  • batch_x (dict) -- DataSet中被设置为input的field的batch。
  • batch_y (dict) -- DataSet中被设置为target的field的batch。
  • indices (list(int)) -- 这次采样使用到的indices,可以通过DataSet[indices]获取出这个batch采出的Instance,在一些 情况下可以帮助定位是哪个Sample导致了错误。仅当num_workers=0时有效。
返回:

on_batch_end()[源代码]

这一步与on_step_end是紧接着的。只是为了对称性加上了这一步。

on_epoch_begin()[源代码]

在每个epoch开始之前调用一次

返回:
on_epoch_end()[源代码]

每个epoch结束将会调用该方法

on_exception(exception)[源代码]

当训练过程出现异常,会触发该方法 :param exception: 某种类型的Exception,比如KeyboardInterrupt等

on_loss_begin(batch_y, predict_y)[源代码]

在计算loss前调用,即这里修改batch_y或predict_y的值是可以影响到loss计算的。

参数:
  • batch_y (dict) -- 在DataSet中被设置为target的field的batch集合。
  • predict_y (dict) -- 模型的forward()返回的结果。
返回:

on_step_end()[源代码]

到这里模型的参数已经按照梯度更新。但可能受update_every影响,并不是每次都更新了。

返回:
on_train_begin()[源代码]

在Train过程开始之前调用。

返回:
on_train_end()[源代码]

训练结束,调用该方法

on_valid_begin()[源代码]

如果Trainer中设置了验证,则发生验证前会调用该函数

返回:
on_valid_end(eval_result, metric_key, optimizer, is_better_eval)[源代码]

每次执行验证集的evaluation后会调用。

参数:
  • Dict[str -- Dict[str: float]] eval_result: , evaluation的结果。一个例子为{'AccuracyMetric':{'acc':1.0}},即 传入的dict是有两层,第一层是metric的名称,第二层是metric的具体指标。
  • metric_key (str) -- 初始化Trainer时传入的metric_key。
  • optimizer (torch.Optimizer) -- Trainer中使用的优化器。
  • is_better_eval (bool) -- 当前dev结果是否比之前的好。
返回:

optimizer

初始化Trainer时传递的Optimizer

pbar

如果在Callback中需要打印内容,请使用self.pbar.write(str)。否则可能出现命令行显示效果不太好的问题。在 on_train_begin(), on_train_end(), on_exception()中请不要使用该属性,通过print输出即可。

step

当前运行到的step, 范围为[1, self.n_steps+1)

trainer

该属性可以通过self.trainer获取到,一般情况下不需要使用这个属性。

update_every

Trainer中的模型多少次反向传播才进行一次梯度更新,在Trainer初始化时传入的。

class fastNLP.GradientClipCallback(parameters=None, clip_value=1, clip_type='norm')[源代码]

基类 fastNLP.Callback

别名 fastNLP.GradientClipCallback fastNLP.core.callback.GradientClipCallback

每次backward前,将parameter的gradient clip到某个范围。
__init__(parameters=None, clip_value=1, clip_type='norm')[源代码]
参数:
  • parameters (None,torch.Tensor,List[torch.Tensor]) -- 一般通过model.parameters()获得。 如果为None则默认对Trainer的model中所有参数进行clip
  • clip_value (float) -- 将gradient 限制到[-clip_value, clip_value]。clip_value应该为正数
  • clip_type (str) --

    支持'norm', 'value' 两种:

    1 'norm', 将gradient的norm rescale到[-clip_value, clip_value]
    
    2 'value', 将gradient限制在[-clip_value, clip_value],
        小于-clip_value的gradient被赋值为-clip_value;
        大于clip_value的gradient被赋值为clip_value.
    
batch_per_epoch

每个epoch一共有多少个batch,只有在on_epoch_begin之后才能调用该属性。

batch_size

train和evaluate时的batch_size为多大

epoch

当前运行的epoch数,范围是[1, self.n_epochs+1)

model

正在被Trainer训练的模型

n_epochs

一共会运行多少个epoch

n_steps

Trainer一共会采多少个batch。当Trainer中update_every设置为非1的值时,该值不等于update的次数

on_backward_begin(loss)

在loss得到之后,但在反向传播之前。可能可以进行loss是否为NaN的检查。

参数:loss (torch.Tensor) -- 计算得到的loss值
返回:
on_batch_begin(batch_x, batch_y, indices)

每次采集到一个batch的数据则调用一次。这里对batch_x或batch_y删除添加内容是可以影响到Trainer中内容的。所以在这一步 可以进行一些负采样之类的操作

参数:
  • batch_x (dict) -- DataSet中被设置为input的field的batch。
  • batch_y (dict) -- DataSet中被设置为target的field的batch。
  • indices (list(int)) -- 这次采样使用到的indices,可以通过DataSet[indices]获取出这个batch采出的Instance,在一些 情况下可以帮助定位是哪个Sample导致了错误。仅当num_workers=0时有效。
返回:

on_batch_end()

这一步与on_step_end是紧接着的。只是为了对称性加上了这一步。

on_epoch_begin()

在每个epoch开始之前调用一次

返回:
on_epoch_end()

每个epoch结束将会调用该方法

on_exception(exception)

当训练过程出现异常,会触发该方法 :param exception: 某种类型的Exception,比如KeyboardInterrupt等

on_loss_begin(batch_y, predict_y)

在计算loss前调用,即这里修改batch_y或predict_y的值是可以影响到loss计算的。

参数:
  • batch_y (dict) -- 在DataSet中被设置为target的field的batch集合。
  • predict_y (dict) -- 模型的forward()返回的结果。
返回:

on_step_end()

到这里模型的参数已经按照梯度更新。但可能受update_every影响,并不是每次都更新了。

返回:
on_train_begin()

在Train过程开始之前调用。

返回:
on_train_end()

训练结束,调用该方法

on_valid_begin()

如果Trainer中设置了验证,则发生验证前会调用该函数

返回:
on_valid_end(eval_result, metric_key, optimizer, is_better_eval)

每次执行验证集的evaluation后会调用。

参数:
  • Dict[str -- Dict[str: float]] eval_result: , evaluation的结果。一个例子为{'AccuracyMetric':{'acc':1.0}},即 传入的dict是有两层,第一层是metric的名称,第二层是metric的具体指标。
  • metric_key (str) -- 初始化Trainer时传入的metric_key。
  • optimizer (torch.Optimizer) -- Trainer中使用的优化器。
  • is_better_eval (bool) -- 当前dev结果是否比之前的好。
返回:

optimizer

初始化Trainer时传递的Optimizer

pbar

如果在Callback中需要打印内容,请使用self.pbar.write(str)。否则可能出现命令行显示效果不太好的问题。在 on_train_begin(), on_train_end(), on_exception()中请不要使用该属性,通过print输出即可。

step

当前运行到的step, 范围为[1, self.n_steps+1)

trainer

该属性可以通过self.trainer获取到,一般情况下不需要使用这个属性。

update_every

Trainer中的模型多少次反向传播才进行一次梯度更新,在Trainer初始化时传入的。

class fastNLP.EarlyStopCallback(patience)[源代码]

基类 fastNLP.Callback

别名 fastNLP.EarlyStopCallback fastNLP.core.callback.EarlyStopCallback

多少个epoch没有变好就停止训练,相关类 EarlyStopError
__init__(patience)[源代码]
参数:patience (int) -- epoch的数量
batch_per_epoch

每个epoch一共有多少个batch,只有在on_epoch_begin之后才能调用该属性。

batch_size

train和evaluate时的batch_size为多大

epoch

当前运行的epoch数,范围是[1, self.n_epochs+1)

model

正在被Trainer训练的模型

n_epochs

一共会运行多少个epoch

n_steps

Trainer一共会采多少个batch。当Trainer中update_every设置为非1的值时,该值不等于update的次数

on_backward_begin(loss)

在loss得到之后,但在反向传播之前。可能可以进行loss是否为NaN的检查。

参数:loss (torch.Tensor) -- 计算得到的loss值
返回:
on_backward_end()

反向梯度传播已完成,但由于update_every的设置,可能并不是每一次调用都有梯度。到这一步,还没有更新参数。

返回:
on_batch_begin(batch_x, batch_y, indices)

每次采集到一个batch的数据则调用一次。这里对batch_x或batch_y删除添加内容是可以影响到Trainer中内容的。所以在这一步 可以进行一些负采样之类的操作

参数:
  • batch_x (dict) -- DataSet中被设置为input的field的batch。
  • batch_y (dict) -- DataSet中被设置为target的field的batch。
  • indices (list(int)) -- 这次采样使用到的indices,可以通过DataSet[indices]获取出这个batch采出的Instance,在一些 情况下可以帮助定位是哪个Sample导致了错误。仅当num_workers=0时有效。
返回:

on_batch_end()

这一步与on_step_end是紧接着的。只是为了对称性加上了这一步。

on_epoch_begin()

在每个epoch开始之前调用一次

返回:
on_epoch_end()

每个epoch结束将会调用该方法

on_loss_begin(batch_y, predict_y)

在计算loss前调用,即这里修改batch_y或predict_y的值是可以影响到loss计算的。

参数:
  • batch_y (dict) -- 在DataSet中被设置为target的field的batch集合。
  • predict_y (dict) -- 模型的forward()返回的结果。
返回:

on_step_end()

到这里模型的参数已经按照梯度更新。但可能受update_every影响,并不是每次都更新了。

返回:
on_train_begin()

在Train过程开始之前调用。

返回:
on_train_end()

训练结束,调用该方法

on_valid_begin()

如果Trainer中设置了验证,则发生验证前会调用该函数

返回:
optimizer

初始化Trainer时传递的Optimizer

pbar

如果在Callback中需要打印内容,请使用self.pbar.write(str)。否则可能出现命令行显示效果不太好的问题。在 on_train_begin(), on_train_end(), on_exception()中请不要使用该属性,通过print输出即可。

step

当前运行到的step, 范围为[1, self.n_steps+1)

trainer

该属性可以通过self.trainer获取到,一般情况下不需要使用这个属性。

update_every

Trainer中的模型多少次反向传播才进行一次梯度更新,在Trainer初始化时传入的。

class fastNLP.FitlogCallback(data=None, tester=None, log_loss_every=0, verbose=0, log_exception=False)[源代码]

基类 fastNLP.Callback

别名 fastNLP.FitlogCallback fastNLP.core.callback.FitlogCallback

该callback可将loss和progress写入到fitlog中; 如果Trainer有dev的数据,将自动把dev的结果写入到log中; 同时还支持传入 一个(或多个)test数据集进行测试(只有在trainer具有dev时才能使用),每次在dev上evaluate之后会在这些数据集上验证一下。 并将验证结果写入到fitlog中。这些数据集的结果是根据dev上最好的结果报道的,即如果dev在第3个epoch取得了最佳,则 fitlog中记录的关于这些数据集的结果就是来自第三个epoch的结果。
__init__(data=None, tester=None, log_loss_every=0, verbose=0, log_exception=False)[源代码]
参数:
  • data (DataSet,Dict[DataSet]) -- 传入DataSet对象,会使用多个Trainer中的metric对数据进行验证。如果需要 传入多个DataSet请通过dict的方式传入,dict的key将作为对应dataset的name传递给fitlog。data的结果的名称以'data'开头。
  • tester (Tester,Dict[Tester]) -- Tester对象,将在on_valid_end时调用。tester的结果的名称以'tester'开头
  • log_loss_every (int) -- 多少个step记录一次loss(记录的是这几个batch的loss平均值),如果数据集较大建议将该值设置得 大一些,不然会导致log文件巨大。默认为0, 即不要记录loss。
  • verbose (int) -- 是否在终端打印evaluation的结果,0不打印。
  • log_exception (bool) -- fitlog是否记录发生的exception信息
batch_per_epoch

每个epoch一共有多少个batch,只有在on_epoch_begin之后才能调用该属性。

batch_size

train和evaluate时的batch_size为多大

epoch

当前运行的epoch数,范围是[1, self.n_epochs+1)

model

正在被Trainer训练的模型

n_epochs

一共会运行多少个epoch

n_steps

Trainer一共会采多少个batch。当Trainer中update_every设置为非1的值时,该值不等于update的次数

on_backward_end()

反向梯度传播已完成,但由于update_every的设置,可能并不是每一次调用都有梯度。到这一步,还没有更新参数。

返回:
on_batch_begin(batch_x, batch_y, indices)

每次采集到一个batch的数据则调用一次。这里对batch_x或batch_y删除添加内容是可以影响到Trainer中内容的。所以在这一步 可以进行一些负采样之类的操作

参数:
  • batch_x (dict) -- DataSet中被设置为input的field的batch。
  • batch_y (dict) -- DataSet中被设置为target的field的batch。
  • indices (list(int)) -- 这次采样使用到的indices,可以通过DataSet[indices]获取出这个batch采出的Instance,在一些 情况下可以帮助定位是哪个Sample导致了错误。仅当num_workers=0时有效。
返回:

on_batch_end()

这一步与on_step_end是紧接着的。只是为了对称性加上了这一步。

on_epoch_begin()

在每个epoch开始之前调用一次

返回:
on_epoch_end()

每个epoch结束将会调用该方法

on_loss_begin(batch_y, predict_y)

在计算loss前调用,即这里修改batch_y或predict_y的值是可以影响到loss计算的。

参数:
  • batch_y (dict) -- 在DataSet中被设置为target的field的batch集合。
  • predict_y (dict) -- 模型的forward()返回的结果。
返回:

on_step_end()

到这里模型的参数已经按照梯度更新。但可能受update_every影响,并不是每次都更新了。

返回:
on_valid_begin()

如果Trainer中设置了验证,则发生验证前会调用该函数

返回:
optimizer

初始化Trainer时传递的Optimizer

pbar

如果在Callback中需要打印内容,请使用self.pbar.write(str)。否则可能出现命令行显示效果不太好的问题。在 on_train_begin(), on_train_end(), on_exception()中请不要使用该属性,通过print输出即可。

step

当前运行到的step, 范围为[1, self.n_steps+1)

trainer

该属性可以通过self.trainer获取到,一般情况下不需要使用这个属性。

update_every

Trainer中的模型多少次反向传播才进行一次梯度更新,在Trainer初始化时传入的。

class fastNLP.EvaluateCallback(data=None, tester=None)[源代码]

基类 fastNLP.Callback

别名 fastNLP.EvaluateCallback fastNLP.core.callback.EvaluateCallback

通过使用该Callback可以使得Trainer在evaluate dev之外还可以evaluate其它数据集,比如测试集。每一次验证dev之前都会先验证EvaluateCallback 中的数据。
__init__(data=None, tester=None)[源代码]
参数:
  • data (DataSet,Dict[DataSet]) -- 传入DataSet对象,会使用Trainer中的metric对数据进行验证。如果需要传入多个 DataSet请通过dict的方式传入。
  • tester (Tester,Dict[DataSet]) -- Tester对象, 通过使用Tester对象,可以使得验证的metric与Trainer中 的metric不一样。
batch_per_epoch

每个epoch一共有多少个batch,只有在on_epoch_begin之后才能调用该属性。

batch_size

train和evaluate时的batch_size为多大

epoch

当前运行的epoch数,范围是[1, self.n_epochs+1)

model

正在被Trainer训练的模型

n_epochs

一共会运行多少个epoch

n_steps

Trainer一共会采多少个batch。当Trainer中update_every设置为非1的值时,该值不等于update的次数

on_backward_begin(loss)

在loss得到之后,但在反向传播之前。可能可以进行loss是否为NaN的检查。

参数:loss (torch.Tensor) -- 计算得到的loss值
返回:
on_backward_end()

反向梯度传播已完成,但由于update_every的设置,可能并不是每一次调用都有梯度。到这一步,还没有更新参数。

返回:
on_batch_begin(batch_x, batch_y, indices)

每次采集到一个batch的数据则调用一次。这里对batch_x或batch_y删除添加内容是可以影响到Trainer中内容的。所以在这一步 可以进行一些负采样之类的操作

参数:
  • batch_x (dict) -- DataSet中被设置为input的field的batch。
  • batch_y (dict) -- DataSet中被设置为target的field的batch。
  • indices (list(int)) -- 这次采样使用到的indices,可以通过DataSet[indices]获取出这个batch采出的Instance,在一些 情况下可以帮助定位是哪个Sample导致了错误。仅当num_workers=0时有效。
返回:

on_batch_end()

这一步与on_step_end是紧接着的。只是为了对称性加上了这一步。

on_epoch_begin()

在每个epoch开始之前调用一次

返回:
on_epoch_end()

每个epoch结束将会调用该方法

on_exception(exception)

当训练过程出现异常,会触发该方法 :param exception: 某种类型的Exception,比如KeyboardInterrupt等

on_loss_begin(batch_y, predict_y)

在计算loss前调用,即这里修改batch_y或predict_y的值是可以影响到loss计算的。

参数:
  • batch_y (dict) -- 在DataSet中被设置为target的field的batch集合。
  • predict_y (dict) -- 模型的forward()返回的结果。
返回:

on_step_end()

到这里模型的参数已经按照梯度更新。但可能受update_every影响,并不是每次都更新了。

返回:
on_train_end()

训练结束,调用该方法

on_valid_begin()

如果Trainer中设置了验证,则发生验证前会调用该函数

返回:
optimizer

初始化Trainer时传递的Optimizer

pbar

如果在Callback中需要打印内容,请使用self.pbar.write(str)。否则可能出现命令行显示效果不太好的问题。在 on_train_begin(), on_train_end(), on_exception()中请不要使用该属性,通过print输出即可。

step

当前运行到的step, 范围为[1, self.n_steps+1)

trainer

该属性可以通过self.trainer获取到,一般情况下不需要使用这个属性。

update_every

Trainer中的模型多少次反向传播才进行一次梯度更新,在Trainer初始化时传入的。

class fastNLP.LRScheduler(lr_scheduler)[源代码]

基类 fastNLP.Callback

别名 fastNLP.LRScheduler fastNLP.core.callback.LRScheduler

对PyTorch LR Scheduler的包装以使得其可以被Trainer所使用
__init__(lr_scheduler)[源代码]
参数:lr_scheduler (torch.optim.lr_scheduler._LRScheduler) -- PyTorch的lr_scheduler
batch_per_epoch

每个epoch一共有多少个batch,只有在on_epoch_begin之后才能调用该属性。

batch_size

train和evaluate时的batch_size为多大

epoch

当前运行的epoch数,范围是[1, self.n_epochs+1)

model

正在被Trainer训练的模型

n_epochs

一共会运行多少个epoch

n_steps

Trainer一共会采多少个batch。当Trainer中update_every设置为非1的值时,该值不等于update的次数

on_backward_begin(loss)

在loss得到之后,但在反向传播之前。可能可以进行loss是否为NaN的检查。

参数:loss (torch.Tensor) -- 计算得到的loss值
返回:
on_backward_end()

反向梯度传播已完成,但由于update_every的设置,可能并不是每一次调用都有梯度。到这一步,还没有更新参数。

返回:
on_batch_begin(batch_x, batch_y, indices)

每次采集到一个batch的数据则调用一次。这里对batch_x或batch_y删除添加内容是可以影响到Trainer中内容的。所以在这一步 可以进行一些负采样之类的操作

参数:
  • batch_x (dict) -- DataSet中被设置为input的field的batch。
  • batch_y (dict) -- DataSet中被设置为target的field的batch。
  • indices (list(int)) -- 这次采样使用到的indices,可以通过DataSet[indices]获取出这个batch采出的Instance,在一些 情况下可以帮助定位是哪个Sample导致了错误。仅当num_workers=0时有效。
返回:

on_batch_end()

这一步与on_step_end是紧接着的。只是为了对称性加上了这一步。

on_epoch_begin()

在每个epoch开始之前调用一次

返回:
on_exception(exception)

当训练过程出现异常,会触发该方法 :param exception: 某种类型的Exception,比如KeyboardInterrupt等

on_loss_begin(batch_y, predict_y)

在计算loss前调用,即这里修改batch_y或predict_y的值是可以影响到loss计算的。

参数:
  • batch_y (dict) -- 在DataSet中被设置为target的field的batch集合。
  • predict_y (dict) -- 模型的forward()返回的结果。
返回:

on_step_end()

到这里模型的参数已经按照梯度更新。但可能受update_every影响,并不是每次都更新了。

返回:
on_train_begin()

在Train过程开始之前调用。

返回:
on_train_end()

训练结束,调用该方法

on_valid_begin()

如果Trainer中设置了验证,则发生验证前会调用该函数

返回:
on_valid_end(eval_result, metric_key, optimizer, is_better_eval)

每次执行验证集的evaluation后会调用。

参数:
  • Dict[str -- Dict[str: float]] eval_result: , evaluation的结果。一个例子为{'AccuracyMetric':{'acc':1.0}},即 传入的dict是有两层,第一层是metric的名称,第二层是metric的具体指标。
  • metric_key (str) -- 初始化Trainer时传入的metric_key。
  • optimizer (torch.Optimizer) -- Trainer中使用的优化器。
  • is_better_eval (bool) -- 当前dev结果是否比之前的好。
返回:

optimizer

初始化Trainer时传递的Optimizer

pbar

如果在Callback中需要打印内容,请使用self.pbar.write(str)。否则可能出现命令行显示效果不太好的问题。在 on_train_begin(), on_train_end(), on_exception()中请不要使用该属性,通过print输出即可。

step

当前运行到的step, 范围为[1, self.n_steps+1)

trainer

该属性可以通过self.trainer获取到,一般情况下不需要使用这个属性。

update_every

Trainer中的模型多少次反向传播才进行一次梯度更新,在Trainer初始化时传入的。

class fastNLP.ControlC(quit_and_do, action=<staticmethod object>)[源代码]

基类 fastNLP.Callback

别名 fastNLP.ControlC fastNLP.core.callback.ControlC

检测到 control+C 时的反馈
__init__(quit_and_do, action=<staticmethod object>)[源代码]
参数:quit_and_do (bool) -- 若为True,则检测到control+C 进行后续操作(默认值为:直接退出程序);否则只退出Trainer。
batch_per_epoch

每个epoch一共有多少个batch,只有在on_epoch_begin之后才能调用该属性。

batch_size

train和evaluate时的batch_size为多大

epoch

当前运行的epoch数,范围是[1, self.n_epochs+1)

model

正在被Trainer训练的模型

n_epochs

一共会运行多少个epoch

n_steps

Trainer一共会采多少个batch。当Trainer中update_every设置为非1的值时,该值不等于update的次数

on_backward_begin(loss)

在loss得到之后,但在反向传播之前。可能可以进行loss是否为NaN的检查。

参数:loss (torch.Tensor) -- 计算得到的loss值
返回:
on_backward_end()

反向梯度传播已完成,但由于update_every的设置,可能并不是每一次调用都有梯度。到这一步,还没有更新参数。

返回:
on_batch_begin(batch_x, batch_y, indices)

每次采集到一个batch的数据则调用一次。这里对batch_x或batch_y删除添加内容是可以影响到Trainer中内容的。所以在这一步 可以进行一些负采样之类的操作

参数:
  • batch_x (dict) -- DataSet中被设置为input的field的batch。
  • batch_y (dict) -- DataSet中被设置为target的field的batch。
  • indices (list(int)) -- 这次采样使用到的indices,可以通过DataSet[indices]获取出这个batch采出的Instance,在一些 情况下可以帮助定位是哪个Sample导致了错误。仅当num_workers=0时有效。
返回:

on_batch_end()

这一步与on_step_end是紧接着的。只是为了对称性加上了这一步。

on_epoch_begin()

在每个epoch开始之前调用一次

返回:
on_epoch_end()

每个epoch结束将会调用该方法

on_loss_begin(batch_y, predict_y)

在计算loss前调用,即这里修改batch_y或predict_y的值是可以影响到loss计算的。

参数:
  • batch_y (dict) -- 在DataSet中被设置为target的field的batch集合。
  • predict_y (dict) -- 模型的forward()返回的结果。
返回:

on_step_end()

到这里模型的参数已经按照梯度更新。但可能受update_every影响,并不是每次都更新了。

返回:
on_train_begin()

在Train过程开始之前调用。

返回:
on_train_end()

训练结束,调用该方法

on_valid_begin()

如果Trainer中设置了验证,则发生验证前会调用该函数

返回:
on_valid_end(eval_result, metric_key, optimizer, is_better_eval)

每次执行验证集的evaluation后会调用。

参数:
  • Dict[str -- Dict[str: float]] eval_result: , evaluation的结果。一个例子为{'AccuracyMetric':{'acc':1.0}},即 传入的dict是有两层,第一层是metric的名称,第二层是metric的具体指标。
  • metric_key (str) -- 初始化Trainer时传入的metric_key。
  • optimizer (torch.Optimizer) -- Trainer中使用的优化器。
  • is_better_eval (bool) -- 当前dev结果是否比之前的好。
返回:

optimizer

初始化Trainer时传递的Optimizer

pbar

如果在Callback中需要打印内容,请使用self.pbar.write(str)。否则可能出现命令行显示效果不太好的问题。在 on_train_begin(), on_train_end(), on_exception()中请不要使用该属性,通过print输出即可。

step

当前运行到的step, 范围为[1, self.n_steps+1)

trainer

该属性可以通过self.trainer获取到,一般情况下不需要使用这个属性。

update_every

Trainer中的模型多少次反向传播才进行一次梯度更新,在Trainer初始化时传入的。

class fastNLP.LRFinder(start_lr=1e-06, end_lr=10)[源代码]

基类 fastNLP.Callback

别名 fastNLP.LRFinder fastNLP.core.callback.LRFinder

用第一个 epoch 找最佳的学习率,从第二个epoch开始应用它
__init__(start_lr=1e-06, end_lr=10)[源代码]
参数:
  • start_lr (float) -- 学习率下界
  • end_lr (float) -- 学习率上界
batch_per_epoch

每个epoch一共有多少个batch,只有在on_epoch_begin之后才能调用该属性。

batch_size

train和evaluate时的batch_size为多大

epoch

当前运行的epoch数,范围是[1, self.n_epochs+1)

model

正在被Trainer训练的模型

n_epochs

一共会运行多少个epoch

n_steps

Trainer一共会采多少个batch。当Trainer中update_every设置为非1的值时,该值不等于update的次数

on_backward_end()

反向梯度传播已完成,但由于update_every的设置,可能并不是每一次调用都有梯度。到这一步,还没有更新参数。

返回:
on_batch_begin(batch_x, batch_y, indices)

每次采集到一个batch的数据则调用一次。这里对batch_x或batch_y删除添加内容是可以影响到Trainer中内容的。所以在这一步 可以进行一些负采样之类的操作

参数:
  • batch_x (dict) -- DataSet中被设置为input的field的batch。
  • batch_y (dict) -- DataSet中被设置为target的field的batch。
  • indices (list(int)) -- 这次采样使用到的indices,可以通过DataSet[indices]获取出这个batch采出的Instance,在一些 情况下可以帮助定位是哪个Sample导致了错误。仅当num_workers=0时有效。
返回:

on_exception(exception)

当训练过程出现异常,会触发该方法 :param exception: 某种类型的Exception,比如KeyboardInterrupt等

on_loss_begin(batch_y, predict_y)

在计算loss前调用,即这里修改batch_y或predict_y的值是可以影响到loss计算的。

参数:
  • batch_y (dict) -- 在DataSet中被设置为target的field的batch集合。
  • predict_y (dict) -- 模型的forward()返回的结果。
返回:

on_step_end()

到这里模型的参数已经按照梯度更新。但可能受update_every影响,并不是每次都更新了。

返回:
on_train_begin()

在Train过程开始之前调用。

返回:
on_train_end()

训练结束,调用该方法

on_valid_begin()

如果Trainer中设置了验证,则发生验证前会调用该函数

返回:
on_valid_end(eval_result, metric_key, optimizer, is_better_eval)

每次执行验证集的evaluation后会调用。

参数:
  • Dict[str -- Dict[str: float]] eval_result: , evaluation的结果。一个例子为{'AccuracyMetric':{'acc':1.0}},即 传入的dict是有两层,第一层是metric的名称,第二层是metric的具体指标。
  • metric_key (str) -- 初始化Trainer时传入的metric_key。
  • optimizer (torch.Optimizer) -- Trainer中使用的优化器。
  • is_better_eval (bool) -- 当前dev结果是否比之前的好。
返回:

optimizer

初始化Trainer时传递的Optimizer

pbar

如果在Callback中需要打印内容,请使用self.pbar.write(str)。否则可能出现命令行显示效果不太好的问题。在 on_train_begin(), on_train_end(), on_exception()中请不要使用该属性,通过print输出即可。

step

当前运行到的step, 范围为[1, self.n_steps+1)

trainer

该属性可以通过self.trainer获取到,一般情况下不需要使用这个属性。

update_every

Trainer中的模型多少次反向传播才进行一次梯度更新,在Trainer初始化时传入的。

class fastNLP.TensorboardCallback(*options)[源代码]

基类 fastNLP.Callback

别名 fastNLP.TensorboardCallback fastNLP.core.callback.TensorboardCallback

接受以下一个或多个字符串作为参数: - "model" - "loss" - "metric"

警告

fastNLP 已停止对此功能的维护,请等待 fastNLP 兼容 PyTorch1.1 的下一个版本。 或者使用和 fastNLP 高度配合的 fitlog(参见 使用fitlog 辅助 fastNLP 进行科研 )。

batch_per_epoch

每个epoch一共有多少个batch,只有在on_epoch_begin之后才能调用该属性。

batch_size

train和evaluate时的batch_size为多大

epoch

当前运行的epoch数,范围是[1, self.n_epochs+1)

model

正在被Trainer训练的模型

n_epochs

一共会运行多少个epoch

n_steps

Trainer一共会采多少个batch。当Trainer中update_every设置为非1的值时,该值不等于update的次数

on_backward_end()

反向梯度传播已完成,但由于update_every的设置,可能并不是每一次调用都有梯度。到这一步,还没有更新参数。

返回:
on_batch_end()

这一步与on_step_end是紧接着的。只是为了对称性加上了这一步。

on_epoch_begin()

在每个epoch开始之前调用一次

返回:
on_epoch_end()

每个epoch结束将会调用该方法

on_loss_begin(batch_y, predict_y)

在计算loss前调用,即这里修改batch_y或predict_y的值是可以影响到loss计算的。

参数:
  • batch_y (dict) -- 在DataSet中被设置为target的field的batch集合。
  • predict_y (dict) -- 模型的forward()返回的结果。
返回:

on_step_end()

到这里模型的参数已经按照梯度更新。但可能受update_every影响,并不是每次都更新了。

返回:
on_valid_begin()

如果Trainer中设置了验证,则发生验证前会调用该函数

返回:
optimizer

初始化Trainer时传递的Optimizer

pbar

如果在Callback中需要打印内容,请使用self.pbar.write(str)。否则可能出现命令行显示效果不太好的问题。在 on_train_begin(), on_train_end(), on_exception()中请不要使用该属性,通过print输出即可。

step

当前运行到的step, 范围为[1, self.n_steps+1)

trainer

该属性可以通过self.trainer获取到,一般情况下不需要使用这个属性。

update_every

Trainer中的模型多少次反向传播才进行一次梯度更新,在Trainer初始化时传入的。

class fastNLP.WarmupCallback(warmup=0.1, schedule='constant')[源代码]

基类 fastNLP.Callback

别名 fastNLP.WarmupCallback fastNLP.core.callback.WarmupCallback

learning rate按照一定的速率从0上升到设置的learning rate。
__init__(warmup=0.1, schedule='constant')[源代码]
参数:
  • warmup (int,float) -- 如果warmup为int,则在该step之前,learning rate根据schedule的策略变化; 如果warmup为float, 如0.1, 则前10%的step是按照schedule策略调整learning rate。
  • schedule (str) -- 以哪种方式调整。 linear: 前warmup的step上升到指定的learning rate(从Trainer中的optimizer处获取的), 后warmup的step下降到0; constant前warmup的step上升到指定learning rate,后面的step保持learning rate.
batch_per_epoch

每个epoch一共有多少个batch,只有在on_epoch_begin之后才能调用该属性。

batch_size

train和evaluate时的batch_size为多大

epoch

当前运行的epoch数,范围是[1, self.n_epochs+1)

model

正在被Trainer训练的模型

n_epochs

一共会运行多少个epoch

n_steps

Trainer一共会采多少个batch。当Trainer中update_every设置为非1的值时,该值不等于update的次数

on_backward_begin(loss)

在loss得到之后,但在反向传播之前。可能可以进行loss是否为NaN的检查。

参数:loss (torch.Tensor) -- 计算得到的loss值
返回:
on_batch_begin(batch_x, batch_y, indices)

每次采集到一个batch的数据则调用一次。这里对batch_x或batch_y删除添加内容是可以影响到Trainer中内容的。所以在这一步 可以进行一些负采样之类的操作

参数:
  • batch_x (dict) -- DataSet中被设置为input的field的batch。
  • batch_y (dict) -- DataSet中被设置为target的field的batch。
  • indices (list(int)) -- 这次采样使用到的indices,可以通过DataSet[indices]获取出这个batch采出的Instance,在一些 情况下可以帮助定位是哪个Sample导致了错误。仅当num_workers=0时有效。
返回:

on_batch_end()

这一步与on_step_end是紧接着的。只是为了对称性加上了这一步。

on_epoch_begin()

在每个epoch开始之前调用一次

返回:
on_epoch_end()

每个epoch结束将会调用该方法

on_exception(exception)

当训练过程出现异常,会触发该方法 :param exception: 某种类型的Exception,比如KeyboardInterrupt等

on_loss_begin(batch_y, predict_y)

在计算loss前调用,即这里修改batch_y或predict_y的值是可以影响到loss计算的。

参数:
  • batch_y (dict) -- 在DataSet中被设置为target的field的batch集合。
  • predict_y (dict) -- 模型的forward()返回的结果。
返回:

on_step_end()

到这里模型的参数已经按照梯度更新。但可能受update_every影响,并不是每次都更新了。

返回:
on_train_end()

训练结束,调用该方法

on_valid_begin()

如果Trainer中设置了验证,则发生验证前会调用该函数

返回:
on_valid_end(eval_result, metric_key, optimizer, is_better_eval)

每次执行验证集的evaluation后会调用。

参数:
  • Dict[str -- Dict[str: float]] eval_result: , evaluation的结果。一个例子为{'AccuracyMetric':{'acc':1.0}},即 传入的dict是有两层,第一层是metric的名称,第二层是metric的具体指标。
  • metric_key (str) -- 初始化Trainer时传入的metric_key。
  • optimizer (torch.Optimizer) -- Trainer中使用的优化器。
  • is_better_eval (bool) -- 当前dev结果是否比之前的好。
返回:

optimizer

初始化Trainer时传递的Optimizer

pbar

如果在Callback中需要打印内容,请使用self.pbar.write(str)。否则可能出现命令行显示效果不太好的问题。在 on_train_begin(), on_train_end(), on_exception()中请不要使用该属性,通过print输出即可。

step

当前运行到的step, 范围为[1, self.n_steps+1)

trainer

该属性可以通过self.trainer获取到,一般情况下不需要使用这个属性。

update_every

Trainer中的模型多少次反向传播才进行一次梯度更新,在Trainer初始化时传入的。

class fastNLP.SaveModelCallback(save_dir, top=3, only_param=False, save_on_exception=False)[源代码]

基类 fastNLP.Callback

别名 fastNLP.SaveModelCallback fastNLP.core.callback.SaveModelCallback

由于Trainer在训练过程中只会保存最佳的模型, 该callback可实现多种方式的结果存储。 会根据训练开始的时间戳在save_dir下建立文件夹,再在文件夹下存放多个模型:

-save_dir
    -2019-07-03-15-06-36
        -epoch:0_step:20_{metric_key}:{evaluate_performance}.pt   # metric是给定的metric_key, evaluate_performance是性能
        -epoch:1_step:40_{metric_key}:{evaluate_performance}.pt
    -2019-07-03-15-10-00
        -epoch:0_step:20_{metric_key}:{evaluate_performance}.pt   # metric是给定的metric_key, evaluate_perfomance是性能
__init__(save_dir, top=3, only_param=False, save_on_exception=False)[源代码]
参数:
  • save_dir (str) -- 将模型存放在哪个目录下,会在该目录下创建以时间戳命名的目录,并存放模型。如果save_dir不存在将自动创建
  • top (int) -- 保存dev表现top多少模型。-1为保存所有模型。
  • only_param (bool) -- 是否只保存模型的权重。
  • save_on_exception -- 发生exception时,是否保存一份发生exception的模型。模型名称为epoch:x_step:x_Exception:{exception_name}.
batch_per_epoch

每个epoch一共有多少个batch,只有在on_epoch_begin之后才能调用该属性。

batch_size

train和evaluate时的batch_size为多大

epoch

当前运行的epoch数,范围是[1, self.n_epochs+1)

model

正在被Trainer训练的模型

n_epochs

一共会运行多少个epoch

n_steps

Trainer一共会采多少个batch。当Trainer中update_every设置为非1的值时,该值不等于update的次数

on_backward_begin(loss)

在loss得到之后,但在反向传播之前。可能可以进行loss是否为NaN的检查。

参数:loss (torch.Tensor) -- 计算得到的loss值
返回:
on_backward_end()

反向梯度传播已完成,但由于update_every的设置,可能并不是每一次调用都有梯度。到这一步,还没有更新参数。

返回:
on_batch_begin(batch_x, batch_y, indices)

每次采集到一个batch的数据则调用一次。这里对batch_x或batch_y删除添加内容是可以影响到Trainer中内容的。所以在这一步 可以进行一些负采样之类的操作

参数:
  • batch_x (dict) -- DataSet中被设置为input的field的batch。
  • batch_y (dict) -- DataSet中被设置为target的field的batch。
  • indices (list(int)) -- 这次采样使用到的indices,可以通过DataSet[indices]获取出这个batch采出的Instance,在一些 情况下可以帮助定位是哪个Sample导致了错误。仅当num_workers=0时有效。
返回:

on_batch_end()

这一步与on_step_end是紧接着的。只是为了对称性加上了这一步。

on_epoch_begin()

在每个epoch开始之前调用一次

返回:
on_epoch_end()

每个epoch结束将会调用该方法

on_loss_begin(batch_y, predict_y)

在计算loss前调用,即这里修改batch_y或predict_y的值是可以影响到loss计算的。

参数:
  • batch_y (dict) -- 在DataSet中被设置为target的field的batch集合。
  • predict_y (dict) -- 模型的forward()返回的结果。
返回:

on_step_end()

到这里模型的参数已经按照梯度更新。但可能受update_every影响,并不是每次都更新了。

返回:
on_train_end()

训练结束,调用该方法

on_valid_begin()

如果Trainer中设置了验证,则发生验证前会调用该函数

返回:
optimizer

初始化Trainer时传递的Optimizer

pbar

如果在Callback中需要打印内容,请使用self.pbar.write(str)。否则可能出现命令行显示效果不太好的问题。在 on_train_begin(), on_train_end(), on_exception()中请不要使用该属性,通过print输出即可。

step

当前运行到的step, 范围为[1, self.n_steps+1)

trainer

该属性可以通过self.trainer获取到,一般情况下不需要使用这个属性。

update_every

Trainer中的模型多少次反向传播才进行一次梯度更新,在Trainer初始化时传入的。

exception fastNLP.CallbackException(msg)[源代码]

别名 fastNLP.CallbackException fastNLP.core.callback.CallbackException

当需要通过callback跳出训练的时候可以通过抛出CallbackException并在on_exception中捕获这个值。

__init__(msg)[源代码]
参数:msg (str) -- Exception的信息。
with_traceback()

Exception.with_traceback(tb) -- set self.__traceback__ to tb and return self.

exception fastNLP.EarlyStopError(msg)[源代码]

基类 fastNLP.CallbackException

别名 fastNLP.EarlyStopError fastNLP.core.callback.EarlyStopError

用于EarlyStop时从Trainer训练循环中跳出。
with_traceback()

Exception.with_traceback(tb) -- set self.__traceback__ to tb and return self.

class fastNLP.Padder(pad_val=0, **kwargs)[源代码]

别名 fastNLP.Padder fastNLP.core.field.Padder

所有padder都需要继承这个类,并覆盖__call__方法。 用于对batch进行padding操作。传入的element是inplace的,即直接修改element可能导致数据变化,建议inplace修改之前deepcopy一份。

__call__(self, contents, field_name, field_ele_dtype):
__init__(pad_val=0, **kwargs)[源代码]
参数:
  • contents (List[Any]) -- 传入的element是inplace的,即直接修改element可能导致数据变化,建议inplace修改之前 deepcopy一份。
  • field_name (str,) -- field的名称。
  • field_ele_dtype (np.int64,np.float64,np.str,None,) -- 该field的内层元素的类型。如果该field的ignore_type为True,该这个值为None。
返回:

np.array([padded_element])

class fastNLP.AutoPadder(pad_val=0)[源代码]

基类 fastNLP.Padder

别名 fastNLP.AutoPadder fastNLP.core.field.AutoPadder

根据contents的数据自动判定是否需要做padding。

1 如果元素类型(元素类型是指field中最里层元素的数据类型, 可以通过FieldArray.dtype查看,比如['This', 'is', ...]的元素类 型为str, [[1,2], ...]的元素类型为int)的数据不为数值类型则不会进行pad

2 如果元素类型为数值类型,比如np.int64, np.float64, int, float, torch.int64等

2.1 如果该field的内容为数值类型(包括int, float等),比如为seq_len, 则不进行padding

2.2 如果该field的内容等价于一维list, 那么会将Batch中的List pad为一样长。

2.3 如果该field的内容等价于二维list,那么会按照英语character padding的方式进行padding。如果是character padding建议使用
class:fastNLP.EngChar2DPadder.
2.4 如果该field的内容等价于三维list,则如果每个instance在每个维度上相等,会组成一个batch的tensor返回,这种情况应该是为图片
的情况。

3 其它情况不进行处理,返回一个np.array类型。

class fastNLP.EngChar2DPadder(pad_val=0, pad_length=0)[源代码]

基类 fastNLP.Padder

别名 fastNLP.EngChar2DPadder fastNLP.core.field.EngChar2DPadder

用于为英语执行character级别的2D padding操作。对应的field内容应该类似[['T', 'h', 'i', 's'], ['a'], ['d', 'e', 'm', 'o']], 但这个Padder只能处理index为int的情况。

padded过后的batch内容,形状为(batch_size, max_sentence_length, max_word_length). max_sentence_length为这个batch中最大句 子长度;max_word_length为这个batch中最长的word的长度:

from fastNLP import DataSet
from fastNLP import EngChar2DPadder
from fastNLP import Vocabulary
dataset = DataSet({'sent': ['This is the first demo', 'This is the second demo']})
dataset.apply(lambda ins:[list(word) for word in ins['sent'].split()], new_field_name='chars')
vocab = Vocabulary()
vocab.from_dataset(dataset, field_name='chars')
vocab.index_dataset(dataset, field_name='chars')
dataset.set_input('chars')
padder = EngChar2DPadder()
dataset.set_padder('chars', padder)  # chars这个field的设置为了EnChar2DPadder
__init__(pad_val=0, pad_length=0)[源代码]
参数:
  • pad_val -- int, pad的位置使用该index
  • pad_length -- int, 如果为0则取一个batch中最大的单词长度作为padding长度。如果为大于0的数,则将所有单词的长度 都pad或截取到该长度.
class fastNLP.ConcatCollateFn(inputs, output, pad_val=0, max_len=0, is_input=True, is_target=False)[源代码]

别名 fastNLP.ConcatCollateFn fastNLP.core.ConcatCollateFn

field拼接collate_fn,将不同field按序拼接后,padding产生数据。

参数:
  • inputs (List[str]) -- 将哪些field的数据拼接起来, 目前仅支持1d的field
  • output (str) -- 拼接后的field名称
  • pad_val -- padding的数值
  • max_len -- 拼接后最大长度
  • is_input -- 是否将生成的output设置为input
  • is_target -- 是否将生成的output设置为target
class fastNLP.MetricBase[源代码]

别名 fastNLP.MetricBase fastNLP.core.metrics.MetricBase

所有metrics的基类,所有的传入到Trainer, Tester的Metric需要继承自该对象,需要覆盖写入evaluate(), get_metric()方法。

evaluate(xxx)中传入的是一个batch的数据。

get_metric(xxx)当所有数据处理完毕,调用该方法得到最终的metric值

以分类问题中,Accuracy计算为例 假设model的forward返回dict中包含 pred 这个key, 并且该key需要用于Accuracy:

class Model(nn.Module):
    def __init__(xxx):
        # do something
    def forward(self, xxx):
        # do something
        return {'pred': pred, 'other_keys':xxx} # pred's shape: batch_size x num_classes

假设dataset中 label 这个field是需要预测的值,并且该field被设置为了target 对应的AccMetric可以按如下的定义, version1, 只使用这一次:

class AccMetric(MetricBase):
    def __init__(self):
        super().__init__()

        # 根据你的情况自定义指标
        self.corr_num = 0
        self.total = 0

    def evaluate(self, label, pred): # 这里的名称需要和dataset中target field与model返回的key是一样的,不然找不到对应的value
        # dev或test时,每个batch结束会调用一次该方法,需要实现如何根据每个batch累加metric
        self.total += label.size(0)
        self.corr_num += label.eq(pred).sum().item()

    def get_metric(self, reset=True): # 在这里定义如何计算metric
        acc = self.corr_num/self.total
        if reset: # 是否清零以便重新计算
            self.corr_num = 0
            self.total = 0
        return {'acc': acc} # 需要返回一个dict,key为该metric的名称,该名称会显示到Trainer的progress bar中

version2,如果需要复用Metric,比如下一次使用AccMetric时,dataset中目标field不叫label而叫y,或者model的输出不是pred:

class AccMetric(MetricBase):
    def __init__(self, label=None, pred=None):
        # 假设在另一场景使用时,目标field叫y,model给出的key为pred_y。则只需要在初始化AccMetric时,
        #   acc_metric = AccMetric(label='y', pred='pred_y')即可。
        # 当初始化为acc_metric = AccMetric(),即label=None, pred=None, fastNLP会直接使用'label', 'pred'作为key去索取对
        #   应的的值
        super().__init__()
        self._init_param_map(label=label, pred=pred) # 该方法会注册label和pred. 仅需要注册evaluate()方法会用到的参数名即可
        # 如果没有注册该则效果与version1就是一样的

        # 根据你的情况自定义指标
        self.corr_num = 0
        self.total = 0

    def evaluate(self, label, pred): # 这里的参数名称需要和self._init_param_map()注册时一致。
        # dev或test时,每个batch结束会调用一次该方法,需要实现如何根据每个batch累加metric
        self.total += label.size(0)
        self.corr_num += label.eq(pred).sum().item()

    def get_metric(self, reset=True): # 在这里定义如何计算metric
        acc = self.corr_num/self.total
        if reset: # 是否清零以便重新计算
            self.corr_num = 0
            self.total = 0
        return {'acc': acc} # 需要返回一个dict,key为该metric的名称,该名称会显示到Trainer的progress bar中

MetricBase 将会在输入的字典 pred_dicttarget_dict 中进行检查. pred_dict 是模型当中 forward() 函数或者 predict() 函数的返回值. target_dict 是DataSet当中的ground truth, 判定ground truth的条件是field的 is_target 被设置为True.

MetricBase 会进行以下的类型检测:

  1. self.evaluate当中是否有varargs, 这是不支持的.
  2. self.evaluate当中所需要的参数是否既不在 pred_dict 也不在 target_dict .
  3. self.evaluate当中所需要的参数是否既在 pred_dict 也在 target_dict .

除此以外,在参数被传入self.evaluate以前,这个函数会检测 pred_dicttarget_dict 当中没有被用到的参数 如果kwargs是self.evaluate的参数,则不会检测

self.evaluate将计算一个批次(batch)的评价指标,并累计。 没有返回值 self.get_metric将统计当前的评价指标并返回评价结果, 返回值需要是一个dict, key是指标名称,value是指标的值

get_metric_name()[源代码]

返回metric的名称

返回:
set_metric_name(name: str)[源代码]

设置metric的名称,默认是Metric的class name.

参数:name (str) --
返回:self
class fastNLP.AccuracyMetric(pred=None, target=None, seq_len=None)[源代码]

基类 fastNLP.MetricBase

别名 fastNLP.AccuracyMetric fastNLP.core.metrics.AccuracyMetric

准确率Metric(其它的Metric参见 fastNLP.core.metrics
__init__(pred=None, target=None, seq_len=None)[源代码]
参数:
  • pred -- 参数映射表中 pred 的映射关系,None表示映射关系为 pred -> pred
  • target -- 参数映射表中 target 的映射关系,None表示映射关系为 target -> target
  • seq_len -- 参数映射表中 seq_len 的映射关系,None表示映射关系为 seq_len -> seq_len
evaluate(pred, target, seq_len=None)[源代码]

evaluate函数将针对一个批次的预测结果做评价指标的累计

参数:
  • pred (torch.Tensor) -- 预测的tensor, tensor的形状可以是torch.Size([B,]), torch.Size([B, n_classes]), torch.Size([B, max_len]), 或者torch.Size([B, max_len, n_classes])
  • target (torch.Tensor) -- 真实值的tensor, tensor的形状可以是Element's can be: torch.Size([B,]), torch.Size([B,]), torch.Size([B, max_len]), 或者torch.Size([B, max_len])
  • seq_len (torch.Tensor) -- 序列长度标记, 标记的形状可以是None, None, torch.Size([B]), 或者torch.Size([B]). 如果mask也被传进来的话seq_len会被忽略.
get_metric(reset=True)[源代码]

get_metric函数将根据evaluate函数累计的评价指标统计量来计算最终的评价结果.

参数:reset (bool) -- 在调用完get_metric后是否清空评价指标统计量.
Return dict evaluate_result:
 {"acc": float}
get_metric_name()

返回metric的名称

返回:
set_metric_name(name: str)

设置metric的名称,默认是Metric的class name.

参数:name (str) --
返回:self
class fastNLP.SpanFPreRecMetric(tag_vocab, pred=None, target=None, seq_len=None, encoding_type=None, ignore_labels=None, only_gross=True, f_type='micro', beta=1)[源代码]

基类 fastNLP.MetricBase

别名 fastNLP.SpanFPreRecMetric fastNLP.core.metrics.SpanFPreRecMetric

在序列标注问题中,以span的方式计算F, pre, rec. 比如中文Part of speech中,会以character的方式进行标注,句子 中国在亚洲 对应的POS可能为(以BMES为例) ['B-NN', 'E-NN', 'S-DET', 'B-NN', 'E-NN']。该metric就是为类似情况下的F1计算。 最后得到的metric结果为:

{
    'f': xxx, # 这里使用f考虑以后可以计算f_beta值
    'pre': xxx,
    'rec':xxx
}

若only_gross=False, 即还会返回各个label的metric统计值:

{
    'f': xxx,
    'pre': xxx,
    'rec':xxx,
    'f-label': xxx,
    'pre-label': xxx,
    'rec-label':xxx,
    ...
}
__init__(tag_vocab, pred=None, target=None, seq_len=None, encoding_type=None, ignore_labels=None, only_gross=True, f_type='micro', beta=1)[源代码]
参数:
  • tag_vocab -- 标签的 Vocabulary 。支持的标签为"B"(没有label);或"B-xxx"(xxx为某种label,比如POS中的NN), 在解码时,会将相同xxx的认为是同一个label,比如['B-NN', 'E-NN']会被合并为一个'NN'.
  • pred (str) -- 用该key在evaluate()时从传入dict中取出prediction数据。 为None,则使用 pred 取数据
  • target (str) -- 用该key在evaluate()时从传入dict中取出target数据。 为None,则使用 target 取数据
  • seq_len (str) -- 用该key在evaluate()时从传入dict中取出sequence length数据。为None,则使用 seq_len 取数据。
  • encoding_type (str) -- 目前支持bio, bmes, bmeso, bioes。默认为None,通过tag_vocab自动判断.
  • ignore_labels (list) -- str 组成的list. 这个list中的class不会被用于计算。例如在POS tagging时传入['NN'],则不会计算'NN'个label
  • only_gross (bool) -- 是否只计算总的f1, precision, recall的值;如果为False,不仅返回总的f1, pre, rec, 还会返回每个label的f1, pre, rec
  • f_type (str) -- micromacro . micro :通过先计算总体的TP,FN和FP的数量,再计算f, precision, recall; macro : 分布计算每个类别的f, precision, recall,然后做平均(各类别f的权重相同)
  • beta (float) -- f_beta分数, \(f_{beta} = \frac{(1 + {beta}^{2})*(pre*rec)}{({beta}^{2}*pre + rec)}\) . 常用为 beta=0.5, 1, 2 若为0.5则精确率的权重高于召回率;若为1,则两者平等;若为2,则召回率权重高于精确率。
evaluate(pred, target, seq_len)[源代码]

evaluate函数将针对一个批次的预测结果做评价指标的累计

参数:
  • pred -- [batch, seq_len] 或者 [batch, seq_len, len(tag_vocab)], 预测的结果
  • target -- [batch, seq_len], 真实值
  • seq_len -- [batch] 文本长度标记
返回:

get_metric(reset=True)[源代码]

get_metric函数将根据evaluate函数累计的评价指标统计量来计算最终的评价结果.

get_metric_name()

返回metric的名称

返回:
set_metric_name(name: str)

设置metric的名称,默认是Metric的class name.

参数:name (str) --
返回:self
class fastNLP.CMRC2018Metric(answers=None, raw_chars=None, context_len=None, pred_start=None, pred_end=None)[源代码]

基类 fastNLP.MetricBase

别名 fastNLP.CMRC2018Metric fastNLP.core.metrics.CMRC2018Metric

CRMC2018任务的评价metric
evaluate(answers, raw_chars, pred_start, pred_end, context_len=None)[源代码]
参数:
  • answers (list[str]) -- 如[["答案1", "答案2", "答案3"], [...], ...]
  • raw_chars (list[str]) -- [["这", "是", ...], [...]]
  • pred_start (tensor) -- batch_size x length 或 batch_size,
  • pred_end (tensor) -- batch_size x length 或 batch_size(是闭区间,包含end位置),
  • context_len (tensor) -- context长度, batch_size
返回:

get_metric_name()

返回metric的名称

返回:
set_metric_name(name: str)

设置metric的名称,默认是Metric的class name.

参数:name (str) --
返回:self
class fastNLP.ClassifyFPreRecMetric(tag_vocab=None, pred=None, target=None, seq_len=None, ignore_labels=None, only_gross=True, f_type='micro', beta=1)[源代码]

基类 fastNLP.MetricBase

别名 fastNLP.ClassifyFPreRecMetric fastNLP.core.metrics.ClassifyFPreRecMetric

分类问题计算FPR值的Metric(其它的Metric参见 fastNLP.core.metrics

最后得到的metric结果为:

{
    'f': xxx, # 这里使用f考虑以后可以计算f_beta值
    'pre': xxx,
    'rec':xxx
}

若only_gross=False, 即还会返回各个label的metric统计值:

{
    'f': xxx,
    'pre': xxx,
    'rec':xxx,
    'f-label': xxx,
    'pre-label': xxx,
    'rec-label':xxx,
    ...
}
__init__(tag_vocab=None, pred=None, target=None, seq_len=None, ignore_labels=None, only_gross=True, f_type='micro', beta=1)[源代码]
参数:
  • tag_vocab -- 标签的 Vocabulary . 默认值为None。若为None则使用数字来作为标签内容,否则使用vocab来作为标签内容。
  • pred (str) -- 用该key在evaluate()时从传入dict中取出prediction数据。 为None,则使用 pred 取数据
  • target (str) -- 用该key在evaluate()时从传入dict中取出target数据。 为None,则使用 target 取数据
  • seq_len (str) -- 用该key在evaluate()时从传入dict中取出sequence length数据。为None,则使用 seq_len 取数据。
  • ignore_labels (list) -- str 组成的list. 这个list中的class不会被用于计算。例如在POS tagging时传入['NN'],则不会计算'NN'个label
  • only_gross (bool) -- 是否只计算总的f1, precision, recall的值;如果为False,不仅返回总的f1, pre, rec, 还会返回每个label的f1, pre, rec
  • f_type (str) -- micromacro . micro :通过先计算总体的TP,FN和FP的数量,再计算f, precision, recall; macro : 分布计算每个类别的f, precision, recall,然后做平均(各类别f的权重相同)
  • beta (float) -- f_beta分数, \(f_{beta} = \frac{(1 + {beta}^{2})*(pre*rec)}{({beta}^{2}*pre + rec)}\) . 常用为 beta=0.5, 1, 2 若为0.5则精确率的权重高于召回率;若为1,则两者平等;若为2,则召回率权重高于精确率。
evaluate(pred, target, seq_len=None)[源代码]

evaluate函数将针对一个批次的预测结果做评价指标的累计

参数:
  • pred (torch.Tensor) -- 预测的tensor, tensor的形状可以是torch.Size([B,]), torch.Size([B, n_classes]), torch.Size([B, max_len]), 或者torch.Size([B, max_len, n_classes])
  • target (torch.Tensor) -- 真实值的tensor, tensor的形状可以是Element's can be: torch.Size([B,]), torch.Size([B,]), torch.Size([B, max_len]), 或者torch.Size([B, max_len])
  • seq_len (torch.Tensor) -- 序列长度标记, 标记的形状可以是None, None, torch.Size([B]), 或者torch.Size([B]). 如果mask也被传进来的话seq_len会被忽略.
get_metric(reset=True)[源代码]

get_metric函数将根据evaluate函数累计的评价指标统计量来计算最终的评价结果.

参数:reset (bool) -- 在调用完get_metric后是否清空评价指标统计量.
Return dict evaluate_result:
 {"acc": float}
get_metric_name()

返回metric的名称

返回:
set_metric_name(name: str)

设置metric的名称,默认是Metric的class name.

参数:name (str) --
返回:self
class fastNLP.ConfusionMatrixMetric(vocab=None, pred=None, target=None, seq_len=None, print_ratio=False)[源代码]

基类 fastNLP.MetricBase

别名 fastNLP.ConfusionMatrixMetric fastNLP.core.metrics.ConfusionMatrixMetric

分类问题计算混淆矩阵的Metric(其它的Metric参见 fastNLP.core.metrics ) 最后返回结果为:

dict,{'confusion_matrix': ConfusionMatrix实例}

ConfusionMatrix实例的print()函数将输出矩阵字符串。

pred_dict = {"pred": torch.Tensor([2,1,3])}
target_dict = {'target': torch.Tensor([2,2,1])}
metric = ConfusionMatrixMetric()
metric(pred_dict=pred_dict, target_dict=target_dict, )
print(metric.get_metric())
{'confusion_matrix':
 target  1.0     2.0     3.0     all
   pred
    1.0    0       1       0       1
    2.0    0       1       0       1
    3.0    1       0       0       1
    all    1       2       0       3
}
__init__(vocab=None, pred=None, target=None, seq_len=None, print_ratio=False)[源代码]
参数:
  • vocab -- vocab词表类,要求有to_word()方法。
  • pred -- 参数映射表中 pred 的映射关系,None表示映射关系为 pred -> pred
  • target -- 参数映射表中 target 的映射关系,None表示映射关系为 target -> target
  • seq_len -- 参数映射表中 seq_len 的映射关系,None表示映射关系为 seq_len -> seq_len
  • print_ratio -- 限制print的输出,false only for result, true for result, percent(dim=0), percent(dim = 1)
evaluate(pred, target, seq_len=None)[源代码]

evaluate函数将针对一个批次的预测结果做评价指标的累计

参数:
  • pred (torch.Tensor) -- 预测的tensor, tensor的形状可以是torch.Size([B,]), torch.Size([B, n_classes]), torch.Size([B, max_len]), 或者torch.Size([B, max_len, n_classes])
  • target (torch.Tensor) -- 真实值的tensor, tensor的形状可以是Element's can be: torch.Size([B,]), torch.Size([B,]), torch.Size([B, max_len]), 或者torch.Size([B, max_len])
  • seq_len (torch.Tensor) -- 序列长度标记, 标记的形状可以是None, torch.Size([B]), 或者torch.Size([B]).
get_metric(reset=True)[源代码]

get_metric函数将根据evaluate函数累计的评价指标统计量来计算最终的评价结果. :param bool reset: 在调用完get_metric后是否清空评价指标统计量. :return dict evaluate_result: {"confusion_matrix": ConfusionMatrix}

get_metric_name()

返回metric的名称

返回:
set_metric_name(name: str)

设置metric的名称,默认是Metric的class name.

参数:name (str) --
返回:self
class fastNLP.Optimizer(model_params, **kwargs)[源代码]

别名 fastNLP.Optimizer fastNLP.core.optimizer.Optimizer

Optimizer

__init__(model_params, **kwargs)[源代码]
参数:
  • model_params -- a generator. E.g. model.parameters() for PyTorch models.
  • kwargs -- additional parameters.
class fastNLP.SGD(lr=0.001, momentum=0, model_params=None)[源代码]

基类 fastNLP.Optimizer

别名 fastNLP.SGD fastNLP.core.optimizer.SGD

SGD
__init__(lr=0.001, momentum=0, model_params=None)[源代码]
参数:
  • lr (float) -- learning rate. Default: 0.01
  • momentum (float) -- momentum. Default: 0
  • model_params -- a generator. E.g. model.parameters() for PyTorch models.
class fastNLP.Adam(lr=0.001, weight_decay=0, betas=(0.9, 0.999), eps=1e-08, amsgrad=False, model_params=None)[源代码]

基类 fastNLP.Optimizer

别名 fastNLP.Adam fastNLP.core.optimizer.Adam

Adam
__init__(lr=0.001, weight_decay=0, betas=(0.9, 0.999), eps=1e-08, amsgrad=False, model_params=None)[源代码]
参数:
  • lr (float) -- learning rate
  • weight_decay (float) --
  • eps --
  • amsgrad --
  • model_params -- a generator. E.g. model.parameters() for PyTorch models.
class fastNLP.AdamW(params, lr=0.001, betas=(0.9, 0.999), eps=1e-08, weight_decay=0.01, amsgrad=False)[源代码]

别名 fastNLP.AdamW fastNLP.core.optimizer.AdamW

对AdamW的实现,该实现在pytorch 1.2.0版本中已经出现,https://github.com/pytorch/pytorch/pull/21250。 这里加入以适配低版本的pytorch

The original Adam algorithm was proposed in Adam: A Method for Stochastic Optimization. The AdamW variant was proposed in Decoupled Weight Decay Regularization.

__init__(params, lr=0.001, betas=(0.9, 0.999), eps=1e-08, weight_decay=0.01, amsgrad=False)[源代码]
参数:
  • (iterable) (params) -- iterable of parameters to optimize or dicts defining parameter groups
  • (float, optional) (weight_decay) -- learning rate (default: 1e-3)
  • (Tuple[float, float], optional) (betas) -- coefficients used for computing running averages of gradient and its square (default: (0.9, 0.99))
  • (float, optional) -- term added to the denominator to improve numerical stability (default: 1e-8)
  • (float, optional) -- weight decay coefficient (default: 1e-2) algorithm from the paper On the Convergence of Adam and Beyond (default: False)
add_param_group(param_group)

Add a param group to the Optimizer s param_groups.

This can be useful when fine tuning a pre-trained network as frozen layers can be made trainable and added to the Optimizer as training progresses.

Arguments:
param_group (dict): Specifies what Tensors should be optimized along with group specific optimization options.
load_state_dict(state_dict)

Loads the optimizer state.

Arguments:
state_dict (dict): optimizer state. Should be an object returned
from a call to state_dict().
state_dict()

Returns the state of the optimizer as a dict.

It contains two entries:

  • state - a dict holding current optimization state. Its content
    differs between optimizer classes.
  • param_groups - a dict containing all parameter groups
step(closure=None)[源代码]

Performs a single optimization step.

参数:closure -- (callable, optional) A closure that reevaluates the model and returns the loss.
zero_grad()

Clears the gradients of all optimized torch.Tensor s.

class fastNLP.Sampler[源代码]

别名 fastNLP.Sampler fastNLP.core.sampler.Sampler

Sampler 类的基类. 规定以何种顺序取出data中的元素

子类必须实现 __call__ 方法. 输入 DataSet 对象, 返回其中元素的下标序列

__init__

Initialize self. See help(type(self)) for accurate signature.

class fastNLP.SequentialSampler[源代码]

基类 fastNLP.Sampler

别名 fastNLP.SequentialSampler fastNLP.core.sampler.SequentialSampler

顺序取出元素的 Sampler
__init__

Initialize self. See help(type(self)) for accurate signature.

class fastNLP.BucketSampler(num_buckets=10, batch_size=None, seq_len_field_name='seq_len')[源代码]

基类 fastNLP.Sampler

别名 fastNLP.BucketSampler fastNLP.core.sampler.BucketSampler

带Bucket的 Random Sampler. 可以随机地取出长度相似的元素
__init__(num_buckets=10, batch_size=None, seq_len_field_name='seq_len')[源代码]
参数:
  • num_buckets (int) -- bucket的数量
  • batch_size (int) -- batch的大小. 默认为None,Trainer在调用BucketSampler时,会将该值正确设置,如果是非Trainer场景使用,需 要显示传递该值
  • seq_len_field_name (str) -- 对应序列长度的 field 的名字
set_batch_size(batch_size)[源代码]
参数:batch_size (int) -- 每个batch的大小
返回:
class fastNLP.RandomSampler[源代码]

基类 fastNLP.Sampler

别名 fastNLP.RandomSampler fastNLP.core.sampler.RandomSampler

随机化取元素的 Sampler
__init__

Initialize self. See help(type(self)) for accurate signature.

class fastNLP.LossFunc(func, key_map=None, **kwargs)[源代码]

基类 fastNLP.LossBase

别名 fastNLP.LossFunc fastNLP.core.losses.LossFunc

提供给用户使用自定义损失函数的类

param func:用户自行定义的损失函数,应当为一个函数或者callable(func)为True的ojbect
param dict key_map:
 参数映射表。键为Model/DataSet参数名,值为损失函数参数名。 fastNLP的trainer将在训练时从模型返回值或者训练数据DataSet的target=True的field中 找到相对应的参数名为value的参数,并传入func中作为参数名为key的参数
param kwargs:除了参数映射表以外可以用key word args的方式设置参数映射关系

使用方法:

func = torch.nn.CrossEntropyLoss()
loss_func = LossFunc(func, input="pred", target="label")
# 这表示构建了一个损失函数类,由func计算损失函数,其中将从模型返回值或者DataSet的target=True的field
# 当中找到一个参数名为`pred`的参数传入func一个参数名为`input`的参数;找到一个参数名为`label`的参数
# 传入func作为一个名为`target`的参数
class fastNLP.CrossEntropyLoss(pred=None, target=None, seq_len=None, class_in_dim=-1, padding_idx=-100, reduction='mean')[源代码]

基类 fastNLP.LossBase

别名 fastNLP.CrossEntropyLoss fastNLP.core.losses.CrossEntropyLoss

交叉熵损失函数

param pred:参数映射表中 pred 的映射关系,None表示映射关系为 pred -> pred
param target:参数映射表中 target 的映射关系,None表示映射关系为 target -> target
param seq_len:句子的长度, 长度之外的token不会计算loss。
param int class_in_dim:
 在序列标注的场景中,pred可能的shape为(batch_size, max_len, num_classes) 或(batch_size, num_classes, max_len), CrossEntropyLoss需要知道哪一维是class的维度以计算loss。如果为-1,就根据pred的第 二维是否等于target的第二维来判断是否需要交换pred的第二维和第三维,因为target的第二维是length的维度,如果这一维度上和pred相等, 那么pred可能第二维也是长度维(存在误判的可能,如果有误判的情况,请显示设置该值)。其它大于0的值则认为该维度是class的维度。
param padding_idx:
 padding的index,在计算loss时将忽略target中标号为padding_idx的内容, 可以通过该值代替 传入seq_len.
param str reduction:
 支持 meansumnone .

Example:

loss = CrossEntropyLoss(pred='pred', target='label', padding_idx=0)
class fastNLP.L1Loss(pred=None, target=None, reduction='mean')[源代码]

基类 fastNLP.LossBase

别名 fastNLP.L1Loss fastNLP.core.losses.L1Loss

L1损失函数

param pred:参数映射表中 pred 的映射关系,None表示映射关系为 pred -> pred
param target:参数映射表中 target 的映射关系,None表示映射关系为 target >`target`
param str reduction:
 支持'mean','sum'和'none'.
class fastNLP.BCELoss(pred=None, target=None, reduction='mean')[源代码]

基类 fastNLP.LossBase

别名 fastNLP.BCELoss fastNLP.core.losses.BCELoss

二分类交叉熵损失函数

param pred:参数映射表中 pred 的映射关系,None表示映射关系为 pred -> pred
param target:参数映射表中 target 的映射关系,None表示映射关系为 target -> target
param str reduction:
 支持 meansumnone .
class fastNLP.NLLLoss(pred=None, target=None, ignore_idx=-100, reduction='mean')[源代码]

基类 fastNLP.LossBase

别名 fastNLP.NLLLoss fastNLP.core.losses.NLLLoss

负对数似然损失函数
__init__(pred=None, target=None, ignore_idx=-100, reduction='mean')[源代码]
参数:
  • pred -- 参数映射表中 pred 的映射关系,None表示映射关系为 pred -> pred
  • target -- 参数映射表中 target 的映射关系,None表示映射关系为 target -> target
  • ignore_idx -- ignore的index,在计算loss时将忽略target中标号为ignore_idx的内容, 可以通过该值代替 传入seq_len.
  • reduction (str) -- 支持 meansumnone .
class fastNLP.LossInForward(loss_key='loss')[源代码]

基类 fastNLP.LossBase

别名 fastNLP.LossInForward fastNLP.core.losses.LossInForward

从forward()函数返回结果中获取loss
__init__(loss_key='loss')[源代码]
参数:loss_key (str) -- 在forward函数中loss的键名,默认为loss
class fastNLP.LossBase[源代码]

别名 fastNLP.LossBase fastNLP.core.losses.LossBase

所有loss的基类。如果想了解其中的原理,请查看源码。

class fastNLP.CMRC2018Loss(target_start=None, target_end=None, context_len=None, pred_start=None, pred_end=None, reduction='mean')[源代码]

基类 fastNLP.LossBase

别名 fastNLP.CMRC2018Loss fastNLP.core.losses.CMRC2018Loss

用于计算CMRC2018中文问答任务。
get_loss(target_start, target_end, context_len, pred_start, pred_end)[源代码]
参数:
  • target_start -- batch_size
  • target_end -- batch_size
  • context_len -- batch_size
  • pred_start -- batch_size x max_len
  • pred_end -- batch_size x max_len
返回:

fastNLP.cache_results(_cache_fp, _refresh=False, _verbose=1)[源代码]

别名 fastNLP.cache_results fastNLP.core.utils.cache_results

cache_results是fastNLP中用于cache数据的装饰器。通过下面的例子看一下如何使用:

import time
import numpy as np
from fastNLP import cache_results

@cache_results('cache.pkl')
def process_data():
    # 一些比较耗时的工作,比如读取数据,预处理数据等,这里用time.sleep()代替耗时
    time.sleep(1)
    return np.random.randint(10, size=(5,))

start_time = time.time()
print("res =",process_data())
print(time.time() - start_time)

start_time = time.time()
print("res =",process_data())
print(time.time() - start_time)

# 输出内容如下,可以看到两次结果相同,且第二次几乎没有花费时间
# Save cache to cache.pkl.
# res = [5 4 9 1 8]
# 1.0042750835418701
# Read cache from cache.pkl.
# res = [5 4 9 1 8]
# 0.0040721893310546875

可以看到第二次运行的时候,只用了0.0001s左右,是由于第二次运行将直接从cache.pkl这个文件读取数据,而不会经过再次预处理:

# 还是以上面的例子为例,如果需要重新生成另一个cache,比如另一个数据集的内容,通过如下的方式调用即可
process_data(_cache_fp='cache2.pkl')  # 完全不影响之前的‘cache.pkl'

上面的_cache_fp是cache_results会识别的参数,它将从'cache2.pkl'这里缓存/读取数据,即这里的'cache2.pkl'覆盖默认的 'cache.pkl'。如果在你的函数前面加上了@cache_results()则你的函数会增加三个参数[_cache_fp, _refresh, _verbose]。 上面的例子即为使用_cache_fp的情况,这三个参数不会传入到你的函数中,当然你写的函数参数名也不可能包含这三个名称:

process_data(_cache_fp='cache2.pkl', _refresh=True)  # 这里强制重新生成一份对预处理的cache。
#  _verbose是用于控制输出信息的,如果为0,则不输出任何内容;如果为1,则会提醒当前步骤是读取的cache还是生成了新的cache
参数:
  • _cache_fp (str) -- 将返回结果缓存到什么位置;或从什么位置读取缓存。如果为None,cache_results没有任何效用,除非在 函数调用的时候传入_cache_fp这个参数。
  • _refresh (bool) -- 是否重新生成cache。
  • _verbose (int) -- 是否打印cache的信息。
返回:

子模块

fastNLP.core

core 模块里实现了 fastNLP 的核心框架,常用的功能都可以从 fastNLP 包中直接 import。当然你也同样可以从 core 模块的子模块中 import, 例如 DataSetIter 组件有两种 import 的方式:

# 直接从 fastNLP 中 import
from fastNLP import DataSetIter

# 从 core 模块的子模块 batch 中 import DataSetIter
from fastNLP.core.batch import DataSetIter

对于常用的功能,你只需要在 fastNLP 中查看即可。如果想了解各个子模块的具体作用,您可以在下面找到每个子模块的具体文档。

子模块
fastNLP.core.batch

batch 模块实现了 fastNLP 所需的 DataSetIter 类。

class fastNLP.core.batch.BatchIter(dataset, batch_size=1, sampler=None, num_workers=0, pin_memory=False, drop_last=False, timeout=0, worker_init_fn=None, collate_fn=None, batch_sampler=None)[源代码]

别名 fastNLP.BatchIter fastNLP.core.batch.BatchIter

Trainer用于迭代数据的类。继承该类,并实现get_num_batches(), get_batch_indices(), num_batches(), __iter__()方法以及dataset属性。

dataset

获取正在参与iterate的dataset

返回:
get_batch_indices()[源代码]

获取最近输出的batch的index。用于溯源当前batch的数据

返回:
static get_num_batches(num_samples, batch_size, drop_last)[源代码]

计算batch的数量。用于前端显示进度

参数:
  • num_samples (int) --
  • batch_size (int) --
  • drop_last (bool) -- 如果最后一个batch没有batch_size这么多,是否就丢掉。
返回:

class fastNLP.core.batch.DataSetIter(dataset, batch_size=1, sampler=None, as_numpy=False, num_workers=0, pin_memory=False, drop_last=False, timeout=0, worker_init_fn=None, batch_sampler=None)[源代码]

基类 fastNLP.BatchIter

别名 fastNLP.DataSetIter fastNLP.core.batch.DataSetIter

DataSetIter 用于从 DataSet 中按一定的顺序, 依次按 batch_size 的大小将数据取出,通过使用DataSetIter,可以不需要考虑
输入的padding(由DataSet中每列的Padder决定了)以及不需要考虑将数据转为tensor。

组成 xy:

batch = DataSetIter(data_set, batch_size=16, sampler=SequentialSampler())
num_batch = len(batch)
for batch_x, batch_y in batch:
    # do stuff ...
__init__(dataset, batch_size=1, sampler=None, as_numpy=False, num_workers=0, pin_memory=False, drop_last=False, timeout=0, worker_init_fn=None, batch_sampler=None)[源代码]
参数:
  • dataset -- DataSet 对象, 数据集
  • batch_size (int) -- 取出的batch大小
  • sampler --

    规定使用的 Sampler 方式. 若为 None , 使用 SequentialSampler.

    Default: None

  • as_numpy (bool) --

    若为 True , 输出batch为 numpy.array. 否则为 torch.Tensor.

    Default: False

  • num_workers (int) -- 使用多少个进程来预处理数据
  • pin_memory (bool) -- 是否将产生的tensor使用pin memory, 可能会加快速度。
  • drop_last (bool) -- 如果最后一个batch没有batch_size这么多sample,就扔掉最后一个
  • timeout -- 生成一个batch的timeout值
  • worker_init_fn -- 在每个worker启动时调用该函数,会传入一个值,该值是worker的index。
  • batch_sampler -- 当每次batch取出的数据数量不一致时,可以使用该sampler。batch_sampler每次iter应该输出一个list的index。 当batch_sampler不为None时,参数batch_size, sampler, drop_last会被忽略。
dataset

获取正在参与iterate的dataset

返回:
get_batch_indices()

获取最近输出的batch的index。用于溯源当前batch的数据

返回:
static get_num_batches(num_samples, batch_size, drop_last)

计算batch的数量。用于前端显示进度

参数:
  • num_samples (int) --
  • batch_size (int) --
  • drop_last (bool) -- 如果最后一个batch没有batch_size这么多,是否就丢掉。
返回:

class fastNLP.core.batch.TorchLoaderIter(dataset, collate_fn, batch_size=1, sampler=None, num_workers=0, pin_memory=False, drop_last=False, timeout=0, worker_init_fn=None, batch_sampler=None)[源代码]

基类 fastNLP.BatchIter

别名 fastNLP.TorchLoaderIter fastNLP.core.batch.TorchLoaderIter

与DataSetIter类似,但可以用于非fastNLP的数据容器对象,以及可以实现完全自定义的生成batch的方式,然后与Trainer,Tester可以实现
与DataSetIter一样的对接。

需要保证传入的数据容器实现了实现了以下的方法

Example:

import random
from fastNLP import TorchLoaderIter
import torch
class UdfDataSet:
    def __init__(self, num_samples):
        self.num_samples = num_samples

    def __getitem__(self, idx):  # 必须实现的方法,输入参数是一个int,范围为[0, len(self))
        x = [random.random() for _ in range(3)]
        y = random.random()
        return x,y

    def __len__(self):  # 需要实现该方法返回值需要是一个int数据
        return self.num_samples

# 需要实现collact_fn将数据转换为tensor
def collate_fn(data_list):
    # [(x1,y1), (x2,y2), ...], 这里的输入实际上是将UdfDataSet的__getitem__输入结合为list
    xs, ys = [], []
    for l in data_list:
        x, y = l
        xs.append(x)
        ys.append(y)
    # 不需要转移到gpu,Trainer或Tester会将其转移到model所在的device
    x,y = torch.FloatTensor(xs), torch.FloatTensor(ys)
    return {'x':x, 'y':y}, {'y':y}  # 第一个dict中内容类似于DataSet中的input列,第二个dict的内容类似于target列

udf_dataset = UdfDataSet(10)
dataset = TorchLoaderIter(udf_dataset, collate_fn=collate_fn)
class Model(nn.Module):
    def __init__(self):
        super().__init__()
        self.fc = nn.Linear(3, 1)
    def forward(self, x, y):
        return {'loss':torch.pow(self.fc(x).squeeze(-1)-y, 2).sum()}
    def predict(self, x):
        return {'pred':self.fc(x).squeeze(0)}
model = Model()
trainer = Trainer(train_data=dataset, model=model, loss=None, print_every=2, dev_data=dataset,
                  metrics=AccuracyMetric(target='y'), use_tqdm=False)
trainer.train(load_best_model=False)

除此之外,还可以通过该方法实现OnTheFly的训练,如下面的代码所示

Example:

import tempfile
import random
import torch
tmp_file_handler, tmp_file_path = tempfile.mkstemp(text=True)
try:
    num_samples, data = 10, []
    for _ in range(num_samples):
        x, y = [random.random() for _ in range(3)], random.random()
        data.append(x + [y])
    with open(tmp_file_path, 'w') as f:
        for d in data:
            f.write(' '.join(map(str, d)) + '\n')

    class FileDataSet:
        def __init__(self, tmp_file):
            num_samples = 0
            line_pos = [0]  # 对应idx是某一行对应的位置
            self.tmp_file_handler = open(tmp_file, 'r', encoding='utf-8')
            line = self.tmp_file_handler.readline()
            while line:
                if line.strip():
                    num_samples += 1
                    line_pos.append(self.tmp_file_handler.tell())
                line = self.tmp_file_handler.readline()
            self.tmp_file_handler.seek(0)
            self.num_samples = num_samples
            self.line_pos = line_pos

        def __getitem__(self, idx):
            line_start, line_end = self.line_pos[idx], self.line_pos[idx + 1]
            self.tmp_file_handler.seek(line_start)
            line = self.tmp_file_handler.read(line_end - line_start).strip()
            values = list(map(float, line.split()))
            x, y = values[:3], values[-1]
            return x, y

        def __len__(self):
            return self.num_samples

    def collate_fn(data_list):
        # [(x1,y1), (x2,y2), ...], 这里的输入实际上是将UdfDataSet的__getitem__输入结合为list
        xs, ys = [], []
        for l in data_list:
            x, y = l
            xs.append(x)
            ys.append(y)
        x, y = torch.FloatTensor(xs), torch.FloatTensor(ys)
        return {'x': x, 'y': y}, {'y': y}  # 第一个dict中内容类似于DataSet中的input列,第二个dict的内容类似于target列

    file_data = FileDataSet(tmp_file_path)
    dataset = TorchLoaderIter(file_data, collate_fn=collate_fn)

    class Model(nn.Module):
        def __init__(self):
            super().__init__()
            self.fc = nn.Linear(3, 1)

        def forward(self, x, y):
            return {'loss': torch.pow(self.fc(x).squeeze(-1) - y, 2).sum()}

        def predict(self, x):
            return {'pred': self.fc(x).squeeze(0)}

    model = Model()
    trainer = Trainer(train_data=dataset, model=model, loss=None, print_every=2, dev_data=dataset,
                      metrics=AccuracyMetric(target='y'), use_tqdm=False, n_epochs=2)
    trainer.train(load_best_model=False)

finally:
    import os
    if os.path.exists(tmp_file_path):
        os.remove(tmp_file_path)
__init__(dataset, collate_fn, batch_size=1, sampler=None, num_workers=0, pin_memory=False, drop_last=False, timeout=0, worker_init_fn=None, batch_sampler=None)[源代码]
参数:
  • dataset -- 实现了__getitem__和__len__方法的数据容器。
  • collate_fn (callable) -- 用于将样本组合成batch的函数。输入为[dataset[idx1], dataset[idx2], ...], 即dataset中 __getitem__返回值组成的list,返回值必须为两个dict,其中第一个dict会被认为是input,第二个dict中的内容被认为是target。 需要转换为tensor的数据,需要在collate_fn中转化,但不需要转移到对应device。
  • batch_size (int) -- 取出的batch大小
  • sampler -- 规定使用的 Sampler 方式. 若为 None , 使用 SequentialSampler. Default: None
  • num_workers (int) -- 使用多少个进程来预处理数据
  • pin_memory (bool) -- 是否将产生的tensor使用pin memory, 可能会加快速度。
  • drop_last (bool) -- 如果最后一个batch没有batch_size这么多sample,就扔掉最后一个
  • timeout -- 生成一个batch的timeout值
  • worker_init_fn -- 在每个worker启动时调用该函数,会传入一个值,该值是worker的index。
  • batch_sampler -- 当每次batch取出的数据数量不一致时,可以使用该sampler。batch_sampler每次iter应该输出一个list的index。 当batch_sampler不为None时,参数batch_size, sampler, drop_last会被忽略。
dataset

获取正在参与iterate的dataset

返回:
get_batch_indices()

获取最近输出的batch的index。用于溯源当前batch的数据

返回:
static get_num_batches(num_samples, batch_size, drop_last)

计算batch的数量。用于前端显示进度

参数:
  • num_samples (int) --
  • batch_size (int) --
  • drop_last (bool) -- 如果最后一个batch没有batch_size这么多,是否就丢掉。
返回:

fastNLP.core.callback

callback模块实现了 fastNLP 中的许多 callback 类,用于增强 Trainer 类。

虽然Trainer本身已经集成了一些功能,但仍然不足以囊括训练过程中可能需要到的功能, 比如负采样,learning rate decay 和 early stop等。 为了解决这个问题,fastNLP引入了callback的机制,Callback 是一种在Trainer训练过程中特定阶段会运行的函数集合。 关于 Trainer 的详细文档,请参见 trainer 模块

我们将 train() 这个函数内部分为以下的阶段,在对应阶段会触发相应的调用:

callback.on_train_begin()  # 开始进行训练
for i in range(1, n_epochs+1):
    callback.on_epoch_begin()  # 开始新的epoch
    for batch_x, batch_y in Batch:
        callback.on_batch_begin(batch_x, batch_y, indices) # batch_x是设置为input的field,batch_y是设置为target的field
        获取模型输出
        callback.on_loss_begin()
        计算loss
        callback.on_backward_begin() # 可以进行一些检查,比如loss是否为None
        反向梯度回传
        callback.on_backward_end() # 进行梯度截断等
        进行参数更新
        callback.on_step_end()
        callback.on_batch_end()
        # 根据设置进行evaluation,比如这是本epoch最后一个batch或者达到一定step
        if do evaluation:
            callback.on_valid_begin()
            进行dev data上的验证
            callback.on_valid_end()  # 可以进行在其它数据集上进行验证
    callback.on_epoch_end()  # epoch结束调用
callback.on_train_end() # 训练结束
callback.on_exception() # 这是一个特殊的步骤,在训练过程中遭遇exception会跳转到这里。

如下面的例子所示,我们可以使用内置的 callback 组件,或者继承 Callback 定义自己的 callback 组件:

from fastNLP import Callback, EarlyStopCallback, Trainer, CrossEntropyLoss, AccuracyMetric
from fastNLP.models import CNNText

start_time = time.time()

class MyCallback(Callback):
    def on_epoch_end(self):
        print('{:d}ms\n\n'.format(round((time.time()-start_time)*1000)))

model = CNNText((len(vocab),50), num_classes=5, padding=2, dropout=0.1)
trainer = Trainer(model=model, train_data=train_data, dev_data=dev_data, loss=CrossEntropyLoss(),
                  metrics=AccuracyMetric(), callbacks=[MyCallback(),EarlyStopCallback(10)])
trainer.train()
class fastNLP.core.callback.Callback[源代码]

别名 fastNLP.Callback fastNLP.core.callback.Callback

Callback是fastNLP中被设计用于增强 Trainer 的类。 如果Callback被传递给了 Trainer , 则 Trainer 会在对应的阶段调用Callback的函数, 具体调用时机可以通过 trainer 模块 查看。 这是Callback的基类,所有的callback必须继承自这个类

batch_per_epoch

每个epoch一共有多少个batch,只有在on_epoch_begin之后才能调用该属性。

batch_size

train和evaluate时的batch_size为多大

epoch

当前运行的epoch数,范围是[1, self.n_epochs+1)

model

正在被Trainer训练的模型

n_epochs

一共会运行多少个epoch

n_steps

Trainer一共会采多少个batch。当Trainer中update_every设置为非1的值时,该值不等于update的次数

on_backward_begin(loss)[源代码]

在loss得到之后,但在反向传播之前。可能可以进行loss是否为NaN的检查。

参数:loss (torch.Tensor) -- 计算得到的loss值
返回:
on_backward_end()[源代码]

反向梯度传播已完成,但由于update_every的设置,可能并不是每一次调用都有梯度。到这一步,还没有更新参数。

返回:
on_batch_begin(batch_x, batch_y, indices)[源代码]

每次采集到一个batch的数据则调用一次。这里对batch_x或batch_y删除添加内容是可以影响到Trainer中内容的。所以在这一步 可以进行一些负采样之类的操作

参数:
  • batch_x (dict) -- DataSet中被设置为input的field的batch。
  • batch_y (dict) -- DataSet中被设置为target的field的batch。
  • indices (list(int)) -- 这次采样使用到的indices,可以通过DataSet[indices]获取出这个batch采出的Instance,在一些 情况下可以帮助定位是哪个Sample导致了错误。仅当num_workers=0时有效。
返回:

on_batch_end()[源代码]

这一步与on_step_end是紧接着的。只是为了对称性加上了这一步。

on_epoch_begin()[源代码]

在每个epoch开始之前调用一次

返回:
on_epoch_end()[源代码]

每个epoch结束将会调用该方法

on_exception(exception)[源代码]

当训练过程出现异常,会触发该方法 :param exception: 某种类型的Exception,比如KeyboardInterrupt等

on_loss_begin(batch_y, predict_y)[源代码]

在计算loss前调用,即这里修改batch_y或predict_y的值是可以影响到loss计算的。

参数:
  • batch_y (dict) -- 在DataSet中被设置为target的field的batch集合。
  • predict_y (dict) -- 模型的forward()返回的结果。
返回:

on_step_end()[源代码]

到这里模型的参数已经按照梯度更新。但可能受update_every影响,并不是每次都更新了。

返回:
on_train_begin()[源代码]

在Train过程开始之前调用。

返回:
on_train_end()[源代码]

训练结束,调用该方法

on_valid_begin()[源代码]

如果Trainer中设置了验证,则发生验证前会调用该函数

返回:
on_valid_end(eval_result, metric_key, optimizer, is_better_eval)[源代码]

每次执行验证集的evaluation后会调用。

参数:
  • Dict[str -- Dict[str: float]] eval_result: , evaluation的结果。一个例子为{'AccuracyMetric':{'acc':1.0}},即 传入的dict是有两层,第一层是metric的名称,第二层是metric的具体指标。
  • metric_key (str) -- 初始化Trainer时传入的metric_key。
  • optimizer (torch.Optimizer) -- Trainer中使用的优化器。
  • is_better_eval (bool) -- 当前dev结果是否比之前的好。
返回:

optimizer

初始化Trainer时传递的Optimizer

pbar

如果在Callback中需要打印内容,请使用self.pbar.write(str)。否则可能出现命令行显示效果不太好的问题。在 on_train_begin(), on_train_end(), on_exception()中请不要使用该属性,通过print输出即可。

step

当前运行到的step, 范围为[1, self.n_steps+1)

trainer

该属性可以通过self.trainer获取到,一般情况下不需要使用这个属性。

update_every

Trainer中的模型多少次反向传播才进行一次梯度更新,在Trainer初始化时传入的。

class fastNLP.core.callback.GradientClipCallback(parameters=None, clip_value=1, clip_type='norm')[源代码]

基类 fastNLP.Callback

别名 fastNLP.GradientClipCallback fastNLP.core.callback.GradientClipCallback

每次backward前,将parameter的gradient clip到某个范围。
__init__(parameters=None, clip_value=1, clip_type='norm')[源代码]
参数:
  • parameters (None,torch.Tensor,List[torch.Tensor]) -- 一般通过model.parameters()获得。 如果为None则默认对Trainer的model中所有参数进行clip
  • clip_value (float) -- 将gradient 限制到[-clip_value, clip_value]。clip_value应该为正数
  • clip_type (str) --

    支持'norm', 'value' 两种:

    1 'norm', 将gradient的norm rescale到[-clip_value, clip_value]
    
    2 'value', 将gradient限制在[-clip_value, clip_value],
        小于-clip_value的gradient被赋值为-clip_value;
        大于clip_value的gradient被赋值为clip_value.
    
batch_per_epoch

每个epoch一共有多少个batch,只有在on_epoch_begin之后才能调用该属性。

batch_size

train和evaluate时的batch_size为多大

epoch

当前运行的epoch数,范围是[1, self.n_epochs+1)

model

正在被Trainer训练的模型

n_epochs

一共会运行多少个epoch

n_steps

Trainer一共会采多少个batch。当Trainer中update_every设置为非1的值时,该值不等于update的次数

on_backward_begin(loss)

在loss得到之后,但在反向传播之前。可能可以进行loss是否为NaN的检查。

参数:loss (torch.Tensor) -- 计算得到的loss值
返回:
on_batch_begin(batch_x, batch_y, indices)

每次采集到一个batch的数据则调用一次。这里对batch_x或batch_y删除添加内容是可以影响到Trainer中内容的。所以在这一步 可以进行一些负采样之类的操作

参数:
  • batch_x (dict) -- DataSet中被设置为input的field的batch。
  • batch_y (dict) -- DataSet中被设置为target的field的batch。
  • indices (list(int)) -- 这次采样使用到的indices,可以通过DataSet[indices]获取出这个batch采出的Instance,在一些 情况下可以帮助定位是哪个Sample导致了错误。仅当num_workers=0时有效。
返回:

on_batch_end()

这一步与on_step_end是紧接着的。只是为了对称性加上了这一步。

on_epoch_begin()

在每个epoch开始之前调用一次

返回:
on_epoch_end()

每个epoch结束将会调用该方法

on_exception(exception)

当训练过程出现异常,会触发该方法 :param exception: 某种类型的Exception,比如KeyboardInterrupt等

on_loss_begin(batch_y, predict_y)

在计算loss前调用,即这里修改batch_y或predict_y的值是可以影响到loss计算的。

参数:
  • batch_y (dict) -- 在DataSet中被设置为target的field的batch集合。
  • predict_y (dict) -- 模型的forward()返回的结果。
返回:

on_step_end()

到这里模型的参数已经按照梯度更新。但可能受update_every影响,并不是每次都更新了。

返回:
on_train_begin()

在Train过程开始之前调用。

返回:
on_train_end()

训练结束,调用该方法

on_valid_begin()

如果Trainer中设置了验证,则发生验证前会调用该函数

返回:
on_valid_end(eval_result, metric_key, optimizer, is_better_eval)

每次执行验证集的evaluation后会调用。

参数:
  • Dict[str -- Dict[str: float]] eval_result: , evaluation的结果。一个例子为{'AccuracyMetric':{'acc':1.0}},即 传入的dict是有两层,第一层是metric的名称,第二层是metric的具体指标。
  • metric_key (str) -- 初始化Trainer时传入的metric_key。
  • optimizer (torch.Optimizer) -- Trainer中使用的优化器。
  • is_better_eval (bool) -- 当前dev结果是否比之前的好。
返回:

optimizer

初始化Trainer时传递的Optimizer

pbar

如果在Callback中需要打印内容,请使用self.pbar.write(str)。否则可能出现命令行显示效果不太好的问题。在 on_train_begin(), on_train_end(), on_exception()中请不要使用该属性,通过print输出即可。

step

当前运行到的step, 范围为[1, self.n_steps+1)

trainer

该属性可以通过self.trainer获取到,一般情况下不需要使用这个属性。

update_every

Trainer中的模型多少次反向传播才进行一次梯度更新,在Trainer初始化时传入的。

class fastNLP.core.callback.EarlyStopCallback(patience)[源代码]

基类 fastNLP.Callback

别名 fastNLP.EarlyStopCallback fastNLP.core.callback.EarlyStopCallback

多少个epoch没有变好就停止训练,相关类 EarlyStopError
__init__(patience)[源代码]
参数:patience (int) -- epoch的数量
batch_per_epoch

每个epoch一共有多少个batch,只有在on_epoch_begin之后才能调用该属性。

batch_size

train和evaluate时的batch_size为多大

epoch

当前运行的epoch数,范围是[1, self.n_epochs+1)

model

正在被Trainer训练的模型

n_epochs

一共会运行多少个epoch

n_steps

Trainer一共会采多少个batch。当Trainer中update_every设置为非1的值时,该值不等于update的次数

on_backward_begin(loss)

在loss得到之后,但在反向传播之前。可能可以进行loss是否为NaN的检查。

参数:loss (torch.Tensor) -- 计算得到的loss值
返回:
on_backward_end()

反向梯度传播已完成,但由于update_every的设置,可能并不是每一次调用都有梯度。到这一步,还没有更新参数。

返回:
on_batch_begin(batch_x, batch_y, indices)

每次采集到一个batch的数据则调用一次。这里对batch_x或batch_y删除添加内容是可以影响到Trainer中内容的。所以在这一步 可以进行一些负采样之类的操作

参数:
  • batch_x (dict) -- DataSet中被设置为input的field的batch。
  • batch_y (dict) -- DataSet中被设置为target的field的batch。
  • indices (list(int)) -- 这次采样使用到的indices,可以通过DataSet[indices]获取出这个batch采出的Instance,在一些 情况下可以帮助定位是哪个Sample导致了错误。仅当num_workers=0时有效。
返回:

on_batch_end()

这一步与on_step_end是紧接着的。只是为了对称性加上了这一步。

on_epoch_begin()

在每个epoch开始之前调用一次

返回:
on_epoch_end()

每个epoch结束将会调用该方法

on_loss_begin(batch_y, predict_y)

在计算loss前调用,即这里修改batch_y或predict_y的值是可以影响到loss计算的。

参数:
  • batch_y (dict) -- 在DataSet中被设置为target的field的batch集合。
  • predict_y (dict) -- 模型的forward()返回的结果。
返回:

on_step_end()

到这里模型的参数已经按照梯度更新。但可能受update_every影响,并不是每次都更新了。

返回:
on_train_begin()

在Train过程开始之前调用。

返回:
on_train_end()

训练结束,调用该方法

on_valid_begin()

如果Trainer中设置了验证,则发生验证前会调用该函数

返回:
optimizer

初始化Trainer时传递的Optimizer

pbar

如果在Callback中需要打印内容,请使用self.pbar.write(str)。否则可能出现命令行显示效果不太好的问题。在 on_train_begin(), on_train_end(), on_exception()中请不要使用该属性,通过print输出即可。

step

当前运行到的step, 范围为[1, self.n_steps+1)

trainer

该属性可以通过self.trainer获取到,一般情况下不需要使用这个属性。

update_every

Trainer中的模型多少次反向传播才进行一次梯度更新,在Trainer初始化时传入的。

class fastNLP.core.callback.FitlogCallback(data=None, tester=None, log_loss_every=0, verbose=0, log_exception=False)[源代码]

基类 fastNLP.Callback

别名 fastNLP.FitlogCallback fastNLP.core.callback.FitlogCallback

该callback可将loss和progress写入到fitlog中; 如果Trainer有dev的数据,将自动把dev的结果写入到log中; 同时还支持传入 一个(或多个)test数据集进行测试(只有在trainer具有dev时才能使用),每次在dev上evaluate之后会在这些数据集上验证一下。 并将验证结果写入到fitlog中。这些数据集的结果是根据dev上最好的结果报道的,即如果dev在第3个epoch取得了最佳,则 fitlog中记录的关于这些数据集的结果就是来自第三个epoch的结果。
__init__(data=None, tester=None, log_loss_every=0, verbose=0, log_exception=False)[源代码]
参数:
  • data (DataSet,Dict[DataSet]) -- 传入DataSet对象,会使用多个Trainer中的metric对数据进行验证。如果需要 传入多个DataSet请通过dict的方式传入,dict的key将作为对应dataset的name传递给fitlog。data的结果的名称以'data'开头。
  • tester (Tester,Dict[Tester]) -- Tester对象,将在on_valid_end时调用。tester的结果的名称以'tester'开头
  • log_loss_every (int) -- 多少个step记录一次loss(记录的是这几个batch的loss平均值),如果数据集较大建议将该值设置得 大一些,不然会导致log文件巨大。默认为0, 即不要记录loss。
  • verbose (int) -- 是否在终端打印evaluation的结果,0不打印。
  • log_exception (bool) -- fitlog是否记录发生的exception信息
batch_per_epoch

每个epoch一共有多少个batch,只有在on_epoch_begin之后才能调用该属性。

batch_size

train和evaluate时的batch_size为多大

epoch

当前运行的epoch数,范围是[1, self.n_epochs+1)

model

正在被Trainer训练的模型

n_epochs

一共会运行多少个epoch

n_steps

Trainer一共会采多少个batch。当Trainer中update_every设置为非1的值时,该值不等于update的次数

on_backward_end()

反向梯度传播已完成,但由于update_every的设置,可能并不是每一次调用都有梯度。到这一步,还没有更新参数。

返回:
on_batch_begin(batch_x, batch_y, indices)

每次采集到一个batch的数据则调用一次。这里对batch_x或batch_y删除添加内容是可以影响到Trainer中内容的。所以在这一步 可以进行一些负采样之类的操作

参数:
  • batch_x (dict) -- DataSet中被设置为input的field的batch。
  • batch_y (dict) -- DataSet中被设置为target的field的batch。
  • indices (list(int)) -- 这次采样使用到的indices,可以通过DataSet[indices]获取出这个batch采出的Instance,在一些 情况下可以帮助定位是哪个Sample导致了错误。仅当num_workers=0时有效。
返回:

on_batch_end()

这一步与on_step_end是紧接着的。只是为了对称性加上了这一步。

on_epoch_begin()

在每个epoch开始之前调用一次

返回:
on_epoch_end()

每个epoch结束将会调用该方法

on_loss_begin(batch_y, predict_y)

在计算loss前调用,即这里修改batch_y或predict_y的值是可以影响到loss计算的。

参数:
  • batch_y (dict) -- 在DataSet中被设置为target的field的batch集合。
  • predict_y (dict) -- 模型的forward()返回的结果。
返回:

on_step_end()

到这里模型的参数已经按照梯度更新。但可能受update_every影响,并不是每次都更新了。

返回:
on_valid_begin()

如果Trainer中设置了验证,则发生验证前会调用该函数

返回:
optimizer

初始化Trainer时传递的Optimizer

pbar

如果在Callback中需要打印内容,请使用self.pbar.write(str)。否则可能出现命令行显示效果不太好的问题。在 on_train_begin(), on_train_end(), on_exception()中请不要使用该属性,通过print输出即可。

step

当前运行到的step, 范围为[1, self.n_steps+1)

trainer

该属性可以通过self.trainer获取到,一般情况下不需要使用这个属性。

update_every

Trainer中的模型多少次反向传播才进行一次梯度更新,在Trainer初始化时传入的。

class fastNLP.core.callback.EvaluateCallback(data=None, tester=None)[源代码]

基类 fastNLP.Callback

别名 fastNLP.EvaluateCallback fastNLP.core.callback.EvaluateCallback

通过使用该Callback可以使得Trainer在evaluate dev之外还可以evaluate其它数据集,比如测试集。每一次验证dev之前都会先验证EvaluateCallback 中的数据。
__init__(data=None, tester=None)[源代码]
参数:
  • data (DataSet,Dict[DataSet]) -- 传入DataSet对象,会使用Trainer中的metric对数据进行验证。如果需要传入多个 DataSet请通过dict的方式传入。
  • tester (Tester,Dict[DataSet]) -- Tester对象, 通过使用Tester对象,可以使得验证的metric与Trainer中 的metric不一样。
batch_per_epoch

每个epoch一共有多少个batch,只有在on_epoch_begin之后才能调用该属性。

batch_size

train和evaluate时的batch_size为多大

epoch

当前运行的epoch数,范围是[1, self.n_epochs+1)

model

正在被Trainer训练的模型

n_epochs

一共会运行多少个epoch

n_steps

Trainer一共会采多少个batch。当Trainer中update_every设置为非1的值时,该值不等于update的次数

on_backward_begin(loss)

在loss得到之后,但在反向传播之前。可能可以进行loss是否为NaN的检查。

参数:loss (torch.Tensor) -- 计算得到的loss值
返回:
on_backward_end()

反向梯度传播已完成,但由于update_every的设置,可能并不是每一次调用都有梯度。到这一步,还没有更新参数。

返回:
on_batch_begin(batch_x, batch_y, indices)

每次采集到一个batch的数据则调用一次。这里对batch_x或batch_y删除添加内容是可以影响到Trainer中内容的。所以在这一步 可以进行一些负采样之类的操作

参数:
  • batch_x (dict) -- DataSet中被设置为input的field的batch。
  • batch_y (dict) -- DataSet中被设置为target的field的batch。
  • indices (list(int)) -- 这次采样使用到的indices,可以通过DataSet[indices]获取出这个batch采出的Instance,在一些 情况下可以帮助定位是哪个Sample导致了错误。仅当num_workers=0时有效。
返回:

on_batch_end()

这一步与on_step_end是紧接着的。只是为了对称性加上了这一步。

on_epoch_begin()

在每个epoch开始之前调用一次

返回:
on_epoch_end()

每个epoch结束将会调用该方法

on_exception(exception)

当训练过程出现异常,会触发该方法 :param exception: 某种类型的Exception,比如KeyboardInterrupt等

on_loss_begin(batch_y, predict_y)

在计算loss前调用,即这里修改batch_y或predict_y的值是可以影响到loss计算的。

参数:
  • batch_y (dict) -- 在DataSet中被设置为target的field的batch集合。
  • predict_y (dict) -- 模型的forward()返回的结果。
返回:

on_step_end()

到这里模型的参数已经按照梯度更新。但可能受update_every影响,并不是每次都更新了。

返回:
on_train_end()

训练结束,调用该方法

on_valid_begin()

如果Trainer中设置了验证,则发生验证前会调用该函数

返回:
optimizer

初始化Trainer时传递的Optimizer

pbar

如果在Callback中需要打印内容,请使用self.pbar.write(str)。否则可能出现命令行显示效果不太好的问题。在 on_train_begin(), on_train_end(), on_exception()中请不要使用该属性,通过print输出即可。

step

当前运行到的step, 范围为[1, self.n_steps+1)

trainer

该属性可以通过self.trainer获取到,一般情况下不需要使用这个属性。

update_every

Trainer中的模型多少次反向传播才进行一次梯度更新,在Trainer初始化时传入的。

class fastNLP.core.callback.LRScheduler(lr_scheduler)[源代码]

基类 fastNLP.Callback

别名 fastNLP.LRScheduler fastNLP.core.callback.LRScheduler

对PyTorch LR Scheduler的包装以使得其可以被Trainer所使用
__init__(lr_scheduler)[源代码]
参数:lr_scheduler (torch.optim.lr_scheduler._LRScheduler) -- PyTorch的lr_scheduler
batch_per_epoch

每个epoch一共有多少个batch,只有在on_epoch_begin之后才能调用该属性。

batch_size

train和evaluate时的batch_size为多大

epoch

当前运行的epoch数,范围是[1, self.n_epochs+1)

model

正在被Trainer训练的模型

n_epochs

一共会运行多少个epoch

n_steps

Trainer一共会采多少个batch。当Trainer中update_every设置为非1的值时,该值不等于update的次数

on_backward_begin(loss)

在loss得到之后,但在反向传播之前。可能可以进行loss是否为NaN的检查。

参数:loss (torch.Tensor) -- 计算得到的loss值
返回:
on_backward_end()

反向梯度传播已完成,但由于update_every的设置,可能并不是每一次调用都有梯度。到这一步,还没有更新参数。

返回:
on_batch_begin(batch_x, batch_y, indices)

每次采集到一个batch的数据则调用一次。这里对batch_x或batch_y删除添加内容是可以影响到Trainer中内容的。所以在这一步 可以进行一些负采样之类的操作

参数:
  • batch_x (dict) -- DataSet中被设置为input的field的batch。
  • batch_y (dict) -- DataSet中被设置为target的field的batch。
  • indices (list(int)) -- 这次采样使用到的indices,可以通过DataSet[indices]获取出这个batch采出的Instance,在一些 情况下可以帮助定位是哪个Sample导致了错误。仅当num_workers=0时有效。
返回:

on_batch_end()

这一步与on_step_end是紧接着的。只是为了对称性加上了这一步。

on_epoch_begin()

在每个epoch开始之前调用一次

返回:
on_exception(exception)

当训练过程出现异常,会触发该方法 :param exception: 某种类型的Exception,比如KeyboardInterrupt等

on_loss_begin(batch_y, predict_y)

在计算loss前调用,即这里修改batch_y或predict_y的值是可以影响到loss计算的。

参数:
  • batch_y (dict) -- 在DataSet中被设置为target的field的batch集合。
  • predict_y (dict) -- 模型的forward()返回的结果。
返回:

on_step_end()

到这里模型的参数已经按照梯度更新。但可能受update_every影响,并不是每次都更新了。

返回:
on_train_begin()

在Train过程开始之前调用。

返回:
on_train_end()

训练结束,调用该方法

on_valid_begin()

如果Trainer中设置了验证,则发生验证前会调用该函数

返回:
on_valid_end(eval_result, metric_key, optimizer, is_better_eval)

每次执行验证集的evaluation后会调用。

参数:
  • Dict[str -- Dict[str: float]] eval_result: , evaluation的结果。一个例子为{'AccuracyMetric':{'acc':1.0}},即 传入的dict是有两层,第一层是metric的名称,第二层是metric的具体指标。
  • metric_key (str) -- 初始化Trainer时传入的metric_key。
  • optimizer (torch.Optimizer) -- Trainer中使用的优化器。
  • is_better_eval (bool) -- 当前dev结果是否比之前的好。
返回:

optimizer

初始化Trainer时传递的Optimizer

pbar

如果在Callback中需要打印内容,请使用self.pbar.write(str)。否则可能出现命令行显示效果不太好的问题。在 on_train_begin(), on_train_end(), on_exception()中请不要使用该属性,通过print输出即可。

step

当前运行到的step, 范围为[1, self.n_steps+1)

trainer

该属性可以通过self.trainer获取到,一般情况下不需要使用这个属性。

update_every

Trainer中的模型多少次反向传播才进行一次梯度更新,在Trainer初始化时传入的。

class fastNLP.core.callback.ControlC(quit_and_do, action=<staticmethod object>)[源代码]

基类 fastNLP.Callback

别名 fastNLP.ControlC fastNLP.core.callback.ControlC

检测到 control+C 时的反馈
__init__(quit_and_do, action=<staticmethod object>)[源代码]
参数:quit_and_do (bool) -- 若为True,则检测到control+C 进行后续操作(默认值为:直接退出程序);否则只退出Trainer。
batch_per_epoch

每个epoch一共有多少个batch,只有在on_epoch_begin之后才能调用该属性。

batch_size

train和evaluate时的batch_size为多大

epoch

当前运行的epoch数,范围是[1, self.n_epochs+1)

model

正在被Trainer训练的模型

n_epochs

一共会运行多少个epoch

n_steps

Trainer一共会采多少个batch。当Trainer中update_every设置为非1的值时,该值不等于update的次数

on_backward_begin(loss)

在loss得到之后,但在反向传播之前。可能可以进行loss是否为NaN的检查。

参数:loss (torch.Tensor) -- 计算得到的loss值
返回:
on_backward_end()

反向梯度传播已完成,但由于update_every的设置,可能并不是每一次调用都有梯度。到这一步,还没有更新参数。

返回:
on_batch_begin(batch_x, batch_y, indices)

每次采集到一个batch的数据则调用一次。这里对batch_x或batch_y删除添加内容是可以影响到Trainer中内容的。所以在这一步 可以进行一些负采样之类的操作

参数:
  • batch_x (dict) -- DataSet中被设置为input的field的batch。
  • batch_y (dict) -- DataSet中被设置为target的field的batch。
  • indices (list(int)) -- 这次采样使用到的indices,可以通过DataSet[indices]获取出这个batch采出的Instance,在一些 情况下可以帮助定位是哪个Sample导致了错误。仅当num_workers=0时有效。
返回:

on_batch_end()

这一步与on_step_end是紧接着的。只是为了对称性加上了这一步。

on_epoch_begin()

在每个epoch开始之前调用一次

返回:
on_epoch_end()

每个epoch结束将会调用该方法

on_loss_begin(batch_y, predict_y)

在计算loss前调用,即这里修改batch_y或predict_y的值是可以影响到loss计算的。

参数:
  • batch_y (dict) -- 在DataSet中被设置为target的field的batch集合。
  • predict_y (dict) -- 模型的forward()返回的结果。
返回:

on_step_end()

到这里模型的参数已经按照梯度更新。但可能受update_every影响,并不是每次都更新了。

返回:
on_train_begin()

在Train过程开始之前调用。

返回:
on_train_end()

训练结束,调用该方法

on_valid_begin()

如果Trainer中设置了验证,则发生验证前会调用该函数

返回:
on_valid_end(eval_result, metric_key, optimizer, is_better_eval)

每次执行验证集的evaluation后会调用。

参数:
  • Dict[str -- Dict[str: float]] eval_result: , evaluation的结果。一个例子为{'AccuracyMetric':{'acc':1.0}},即 传入的dict是有两层,第一层是metric的名称,第二层是metric的具体指标。
  • metric_key (str) -- 初始化Trainer时传入的metric_key。
  • optimizer (torch.Optimizer) -- Trainer中使用的优化器。
  • is_better_eval (bool) -- 当前dev结果是否比之前的好。
返回:

optimizer

初始化Trainer时传递的Optimizer

pbar

如果在Callback中需要打印内容,请使用self.pbar.write(str)。否则可能出现命令行显示效果不太好的问题。在 on_train_begin(), on_train_end(), on_exception()中请不要使用该属性,通过print输出即可。

step

当前运行到的step, 范围为[1, self.n_steps+1)

trainer

该属性可以通过self.trainer获取到,一般情况下不需要使用这个属性。

update_every

Trainer中的模型多少次反向传播才进行一次梯度更新,在Trainer初始化时传入的。

class fastNLP.core.callback.LRFinder(start_lr=1e-06, end_lr=10)[源代码]

基类 fastNLP.Callback

别名 fastNLP.LRFinder fastNLP.core.callback.LRFinder

用第一个 epoch 找最佳的学习率,从第二个epoch开始应用它
__init__(start_lr=1e-06, end_lr=10)[源代码]
参数:
  • start_lr (float) -- 学习率下界
  • end_lr (float) -- 学习率上界
batch_per_epoch

每个epoch一共有多少个batch,只有在on_epoch_begin之后才能调用该属性。

batch_size

train和evaluate时的batch_size为多大

epoch

当前运行的epoch数,范围是[1, self.n_epochs+1)

model

正在被Trainer训练的模型

n_epochs

一共会运行多少个epoch

n_steps

Trainer一共会采多少个batch。当Trainer中update_every设置为非1的值时,该值不等于update的次数

on_backward_end()

反向梯度传播已完成,但由于update_every的设置,可能并不是每一次调用都有梯度。到这一步,还没有更新参数。

返回:
on_batch_begin(batch_x, batch_y, indices)

每次采集到一个batch的数据则调用一次。这里对batch_x或batch_y删除添加内容是可以影响到Trainer中内容的。所以在这一步 可以进行一些负采样之类的操作

参数:
  • batch_x (dict) -- DataSet中被设置为input的field的batch。
  • batch_y (dict) -- DataSet中被设置为target的field的batch。
  • indices (list(int)) -- 这次采样使用到的indices,可以通过DataSet[indices]获取出这个batch采出的Instance,在一些 情况下可以帮助定位是哪个Sample导致了错误。仅当num_workers=0时有效。
返回:

on_exception(exception)

当训练过程出现异常,会触发该方法 :param exception: 某种类型的Exception,比如KeyboardInterrupt等

on_loss_begin(batch_y, predict_y)

在计算loss前调用,即这里修改batch_y或predict_y的值是可以影响到loss计算的。

参数:
  • batch_y (dict) -- 在DataSet中被设置为target的field的batch集合。
  • predict_y (dict) -- 模型的forward()返回的结果。
返回:

on_step_end()

到这里模型的参数已经按照梯度更新。但可能受update_every影响,并不是每次都更新了。

返回:
on_train_begin()

在Train过程开始之前调用。

返回:
on_train_end()

训练结束,调用该方法

on_valid_begin()

如果Trainer中设置了验证,则发生验证前会调用该函数

返回:
on_valid_end(eval_result, metric_key, optimizer, is_better_eval)

每次执行验证集的evaluation后会调用。

参数:
  • Dict[str -- Dict[str: float]] eval_result: , evaluation的结果。一个例子为{'AccuracyMetric':{'acc':1.0}},即 传入的dict是有两层,第一层是metric的名称,第二层是metric的具体指标。
  • metric_key (str) -- 初始化Trainer时传入的metric_key。
  • optimizer (torch.Optimizer) -- Trainer中使用的优化器。
  • is_better_eval (bool) -- 当前dev结果是否比之前的好。
返回:

optimizer

初始化Trainer时传递的Optimizer

pbar

如果在Callback中需要打印内容,请使用self.pbar.write(str)。否则可能出现命令行显示效果不太好的问题。在 on_train_begin(), on_train_end(), on_exception()中请不要使用该属性,通过print输出即可。

step

当前运行到的step, 范围为[1, self.n_steps+1)

trainer

该属性可以通过self.trainer获取到,一般情况下不需要使用这个属性。

update_every

Trainer中的模型多少次反向传播才进行一次梯度更新,在Trainer初始化时传入的。

class fastNLP.core.callback.TensorboardCallback(*options)[源代码]

基类 fastNLP.Callback

别名 fastNLP.TensorboardCallback fastNLP.core.callback.TensorboardCallback

接受以下一个或多个字符串作为参数: - "model" - "loss" - "metric"

警告

fastNLP 已停止对此功能的维护,请等待 fastNLP 兼容 PyTorch1.1 的下一个版本。 或者使用和 fastNLP 高度配合的 fitlog(参见 使用fitlog 辅助 fastNLP 进行科研 )。

batch_per_epoch

每个epoch一共有多少个batch,只有在on_epoch_begin之后才能调用该属性。

batch_size

train和evaluate时的batch_size为多大

epoch

当前运行的epoch数,范围是[1, self.n_epochs+1)

model

正在被Trainer训练的模型

n_epochs

一共会运行多少个epoch

n_steps

Trainer一共会采多少个batch。当Trainer中update_every设置为非1的值时,该值不等于update的次数

on_backward_end()

反向梯度传播已完成,但由于update_every的设置,可能并不是每一次调用都有梯度。到这一步,还没有更新参数。

返回:
on_batch_end()

这一步与on_step_end是紧接着的。只是为了对称性加上了这一步。

on_epoch_begin()

在每个epoch开始之前调用一次

返回:
on_epoch_end()

每个epoch结束将会调用该方法

on_loss_begin(batch_y, predict_y)

在计算loss前调用,即这里修改batch_y或predict_y的值是可以影响到loss计算的。

参数:
  • batch_y (dict) -- 在DataSet中被设置为target的field的batch集合。
  • predict_y (dict) -- 模型的forward()返回的结果。
返回:

on_step_end()

到这里模型的参数已经按照梯度更新。但可能受update_every影响,并不是每次都更新了。

返回:
on_valid_begin()

如果Trainer中设置了验证,则发生验证前会调用该函数

返回:
optimizer

初始化Trainer时传递的Optimizer

pbar

如果在Callback中需要打印内容,请使用self.pbar.write(str)。否则可能出现命令行显示效果不太好的问题。在 on_train_begin(), on_train_end(), on_exception()中请不要使用该属性,通过print输出即可。

step

当前运行到的step, 范围为[1, self.n_steps+1)

trainer

该属性可以通过self.trainer获取到,一般情况下不需要使用这个属性。

update_every

Trainer中的模型多少次反向传播才进行一次梯度更新,在Trainer初始化时传入的。

class fastNLP.core.callback.WarmupCallback(warmup=0.1, schedule='constant')[源代码]

基类 fastNLP.Callback

别名 fastNLP.WarmupCallback fastNLP.core.callback.WarmupCallback

learning rate按照一定的速率从0上升到设置的learning rate。
__init__(warmup=0.1, schedule='constant')[源代码]
参数:
  • warmup (int,float) -- 如果warmup为int,则在该step之前,learning rate根据schedule的策略变化; 如果warmup为float, 如0.1, 则前10%的step是按照schedule策略调整learning rate。
  • schedule (str) -- 以哪种方式调整。 linear: 前warmup的step上升到指定的learning rate(从Trainer中的optimizer处获取的), 后warmup的step下降到0; constant前warmup的step上升到指定learning rate,后面的step保持learning rate.
batch_per_epoch

每个epoch一共有多少个batch,只有在on_epoch_begin之后才能调用该属性。

batch_size

train和evaluate时的batch_size为多大

epoch

当前运行的epoch数,范围是[1, self.n_epochs+1)

model

正在被Trainer训练的模型

n_epochs

一共会运行多少个epoch

n_steps

Trainer一共会采多少个batch。当Trainer中update_every设置为非1的值时,该值不等于update的次数

on_backward_begin(loss)

在loss得到之后,但在反向传播之前。可能可以进行loss是否为NaN的检查。

参数:loss (torch.Tensor) -- 计算得到的loss值
返回:
on_batch_begin(batch_x, batch_y, indices)

每次采集到一个batch的数据则调用一次。这里对batch_x或batch_y删除添加内容是可以影响到Trainer中内容的。所以在这一步 可以进行一些负采样之类的操作

参数:
  • batch_x (dict) -- DataSet中被设置为input的field的batch。
  • batch_y (dict) -- DataSet中被设置为target的field的batch。
  • indices (list(int)) -- 这次采样使用到的indices,可以通过DataSet[indices]获取出这个batch采出的Instance,在一些 情况下可以帮助定位是哪个Sample导致了错误。仅当num_workers=0时有效。
返回:

on_batch_end()

这一步与on_step_end是紧接着的。只是为了对称性加上了这一步。

on_epoch_begin()

在每个epoch开始之前调用一次

返回:
on_epoch_end()

每个epoch结束将会调用该方法

on_exception(exception)

当训练过程出现异常,会触发该方法 :param exception: 某种类型的Exception,比如KeyboardInterrupt等

on_loss_begin(batch_y, predict_y)

在计算loss前调用,即这里修改batch_y或predict_y的值是可以影响到loss计算的。

参数:
  • batch_y (dict) -- 在DataSet中被设置为target的field的batch集合。
  • predict_y (dict) -- 模型的forward()返回的结果。
返回:

on_step_end()

到这里模型的参数已经按照梯度更新。但可能受update_every影响,并不是每次都更新了。

返回:
on_train_end()

训练结束,调用该方法

on_valid_begin()

如果Trainer中设置了验证,则发生验证前会调用该函数

返回:
on_valid_end(eval_result, metric_key, optimizer, is_better_eval)

每次执行验证集的evaluation后会调用。

参数:
  • Dict[str -- Dict[str: float]] eval_result: , evaluation的结果。一个例子为{'AccuracyMetric':{'acc':1.0}},即 传入的dict是有两层,第一层是metric的名称,第二层是metric的具体指标。
  • metric_key (str) -- 初始化Trainer时传入的metric_key。
  • optimizer (torch.Optimizer) -- Trainer中使用的优化器。
  • is_better_eval (bool) -- 当前dev结果是否比之前的好。
返回:

optimizer

初始化Trainer时传递的Optimizer

pbar

如果在Callback中需要打印内容,请使用self.pbar.write(str)。否则可能出现命令行显示效果不太好的问题。在 on_train_begin(), on_train_end(), on_exception()中请不要使用该属性,通过print输出即可。

step

当前运行到的step, 范围为[1, self.n_steps+1)

trainer

该属性可以通过self.trainer获取到,一般情况下不需要使用这个属性。

update_every

Trainer中的模型多少次反向传播才进行一次梯度更新,在Trainer初始化时传入的。

class fastNLP.core.callback.SaveModelCallback(save_dir, top=3, only_param=False, save_on_exception=False)[源代码]

基类 fastNLP.Callback

别名 fastNLP.SaveModelCallback fastNLP.core.callback.SaveModelCallback

由于Trainer在训练过程中只会保存最佳的模型, 该callback可实现多种方式的结果存储。 会根据训练开始的时间戳在save_dir下建立文件夹,再在文件夹下存放多个模型:

-save_dir
    -2019-07-03-15-06-36
        -epoch:0_step:20_{metric_key}:{evaluate_performance}.pt   # metric是给定的metric_key, evaluate_performance是性能
        -epoch:1_step:40_{metric_key}:{evaluate_performance}.pt
    -2019-07-03-15-10-00
        -epoch:0_step:20_{metric_key}:{evaluate_performance}.pt   # metric是给定的metric_key, evaluate_perfomance是性能
__init__(save_dir, top=3, only_param=False, save_on_exception=False)[源代码]
参数:
  • save_dir (str) -- 将模型存放在哪个目录下,会在该目录下创建以时间戳命名的目录,并存放模型。如果save_dir不存在将自动创建
  • top (int) -- 保存dev表现top多少模型。-1为保存所有模型。
  • only_param (bool) -- 是否只保存模型的权重。
  • save_on_exception -- 发生exception时,是否保存一份发生exception的模型。模型名称为epoch:x_step:x_Exception:{exception_name}.
batch_per_epoch

每个epoch一共有多少个batch,只有在on_epoch_begin之后才能调用该属性。

batch_size

train和evaluate时的batch_size为多大

epoch

当前运行的epoch数,范围是[1, self.n_epochs+1)

model

正在被Trainer训练的模型

n_epochs

一共会运行多少个epoch

n_steps

Trainer一共会采多少个batch。当Trainer中update_every设置为非1的值时,该值不等于update的次数

on_backward_begin(loss)

在loss得到之后,但在反向传播之前。可能可以进行loss是否为NaN的检查。

参数:loss (torch.Tensor) -- 计算得到的loss值
返回:
on_backward_end()

反向梯度传播已完成,但由于update_every的设置,可能并不是每一次调用都有梯度。到这一步,还没有更新参数。

返回:
on_batch_begin(batch_x, batch_y, indices)

每次采集到一个batch的数据则调用一次。这里对batch_x或batch_y删除添加内容是可以影响到Trainer中内容的。所以在这一步 可以进行一些负采样之类的操作

参数:
  • batch_x (dict) -- DataSet中被设置为input的field的batch。
  • batch_y (dict) -- DataSet中被设置为target的field的batch。
  • indices (list(int)) -- 这次采样使用到的indices,可以通过DataSet[indices]获取出这个batch采出的Instance,在一些 情况下可以帮助定位是哪个Sample导致了错误。仅当num_workers=0时有效。
返回:

on_batch_end()

这一步与on_step_end是紧接着的。只是为了对称性加上了这一步。

on_epoch_begin()

在每个epoch开始之前调用一次

返回:
on_epoch_end()

每个epoch结束将会调用该方法

on_loss_begin(batch_y, predict_y)

在计算loss前调用,即这里修改batch_y或predict_y的值是可以影响到loss计算的。

参数:
  • batch_y (dict) -- 在DataSet中被设置为target的field的batch集合。
  • predict_y (dict) -- 模型的forward()返回的结果。
返回:

on_step_end()

到这里模型的参数已经按照梯度更新。但可能受update_every影响,并不是每次都更新了。

返回:
on_train_end()

训练结束,调用该方法

on_valid_begin()

如果Trainer中设置了验证,则发生验证前会调用该函数

返回:
optimizer

初始化Trainer时传递的Optimizer

pbar

如果在Callback中需要打印内容,请使用self.pbar.write(str)。否则可能出现命令行显示效果不太好的问题。在 on_train_begin(), on_train_end(), on_exception()中请不要使用该属性,通过print输出即可。

step

当前运行到的step, 范围为[1, self.n_steps+1)

trainer

该属性可以通过self.trainer获取到,一般情况下不需要使用这个属性。

update_every

Trainer中的模型多少次反向传播才进行一次梯度更新,在Trainer初始化时传入的。

exception fastNLP.core.callback.CallbackException(msg)[源代码]

别名 fastNLP.CallbackException fastNLP.core.callback.CallbackException

当需要通过callback跳出训练的时候可以通过抛出CallbackException并在on_exception中捕获这个值。

__init__(msg)[源代码]
参数:msg (str) -- Exception的信息。
with_traceback()

Exception.with_traceback(tb) -- set self.__traceback__ to tb and return self.

exception fastNLP.core.callback.EarlyStopError(msg)[源代码]

基类 fastNLP.CallbackException

别名 fastNLP.EarlyStopError fastNLP.core.callback.EarlyStopError

用于EarlyStop时从Trainer训练循环中跳出。
with_traceback()

Exception.with_traceback(tb) -- set self.__traceback__ to tb and return self.

fastNLP.core.const

fastNLP包当中的field命名均符合一定的规范,该规范由fastNLP.Const类进行定义。

class fastNLP.core.const.Const[源代码]

别名 fastNLP.Const fastNLP.core.const.Const

fastNLP中field命名常量。

具体列表:

INPUT       模型的序列输入      words(具有多列words时,依次使用words1, words2, )
CHAR_INPUT  模型character输入  chars(具有多列chars时,依次使用chars1, chars2)
INPUT_LEN   序列长度           seq_len(具有多列seq_len时,依次使用seq_len1,seq_len2)
OUTPUT      模型输出           pred(具有多列pred时,依次使用pred1, pred2)
TARGET      真实目标           target(具有多列target时,依次使用target1,target2)
LOSS        损失函数           loss (具有多列loss时,依次使用loss1,loss2)
RAW_WORD    原文的词           raw_words  (具有多列raw_words时,依次使用raw_words1, raw_words2)
RAW_CHAR    原文的字           raw_chars  (具有多列raw_chars时,依次使用raw_chars1, raw_chars2)
CHAR_INPUT = 'chars'
static CHAR_INPUTS(i)[源代码]

得到第 i 个 CHAR_INPUT 的命名

INPUT = 'words'
static INPUTS(i)[源代码]

得到第 i 个 INPUT 的命名

INPUT_LEN = 'seq_len'
static INPUT_LENS(i)[源代码]

得到第 i 个 INPUT_LEN 的命名

LOSS = 'loss'
static LOSSES(i)[源代码]

得到第 i 个 LOSS 的命名

OUTPUT = 'pred'
static OUTPUTS(i)[源代码]

得到第 i 个 OUTPUT 的命名

RAW_CHAR = 'raw_chars'
static RAW_CHARS(i)[源代码]

得到第 i 个 RAW_CHARS 的命名

RAW_WORD = 'raw_words'
static RAW_WORDS(i)[源代码]

得到第 i 个 RAW_WORDS 的命名

TARGET = 'target'
static TARGETS(i)[源代码]

得到第 i 个 TARGET 的命名

__init__

Initialize self. See help(type(self)) for accurate signature.

fastNLP.core.dataset

DataSet 是fastNLP中用于承载数据的容器。可以将DataSet看做是一个表格, 每一行是一个sample (在fastNLP中被称为 instance ), 每一列是一个feature (在fastNLP中称为 field )。

Following is a demo layout of DataSet
sentence words seq_len
This is the first instance . [This, is, the, first, instance, .] 6
Second instance . [Second, instance, .] 3
Third instance . [Third, instance, .] 3
... [...] ...

在fastNLP内部每一行是一个 Instance 对象; 每一列是一个 FieldArray 对象。

1.DataSet的创建

创建DataSet主要有以下的3种方式

1.1 传入dict
1.2 通过 Instance 构建
1.3 通过 List[Instance] 构建
2.DataSet与预处理

常见的预处理有如下几种

2.1 从某个文本文件读取内容

注解

直接读取特定数据集的数据请参考 使用Loader和Pipe加载并处理数据集

2.2 对DataSet中的内容处理
2.3 删除DataSet的内容
2.4 遍历DataSet的内容
2.5 一些其它操作
3.DataSet与自然语言处理(NLP)

在目前深度学习的模型中,大都依赖于随机梯度下降法(SGD)进行模型的优化。随机梯度下降需要将数据切分成一个个的 batch, 一个batch进行一次前向计算(forward)与梯度后向传播(backward)。在自然语言处理的场景下,往往还需要对数据进行pad。这是 由于句子的长度一般是不同的,但是一次batch中的每个field都必须是一个tensor,所以需要将所有句子都补齐到相同的长度。

3.1 DataSet与DataSetIter

我们先看fastNLP中如何将数据分成一个一个的batch的例子, 这里我们使用随机生成的数据来模拟一个二分类文本分类任务, words和characters是输入,labels是文本类别

其中 DataSetIter 是用于从DataSet中按照batch_size为大小取出batch的迭代器, SequentialSampler 用于指示 DataSetIter 以怎样的 顺序从DataSet中取出instance以组成一个batch, 更详细的说明请参照 DataSetIterSequentialSampler 文档。

通过 DataSet.set_input('words', 'chars') , fastNLP将认为 wordschars 这两个field都是input,并将它们都放入迭代器 生成的第一个dict中; DataSet.set_target('labels') , fastNLP将认为 labels 这个field是target,并将其放入到迭代器的第 二个dict中。如上例中所打印结果。分为input和target的原因是由于它们在被 Trainer 所使用时会有所差异, 详见 Trainer

当把某个field设置为 target 或者 input 的时候(两者不是互斥的,可以同时设为两种),fastNLP不仅仅只是将其放 置到不同的dict中,而还会对被设置为 inputtarget 的 field 进行类型检查。类型检查的目的是为了看能否把该 field 转为 pytorch的 torch.LongTensortorch.FloatTensor 类型 (也可以在 DataSetIter 中设置输出numpy类型,参考 DataSetIter )。

如上例所示,fastNLP已将 wordscharslabel 转为了 Tensor 类型。 如果 field 在每个 instance 都拥有相同的维度(不能超过两维),且最内层的元素都为相同的 type(int, float, np.int*, np.float*), 则fastNLP默认将对该 field 进行pad。也支持全为str的field作为target和input,这种情况下,fastNLP默认不进行pad。 另外,当某个 field 已经被设置为了 target 或者 input 后,之后 appendinstance 对应的 field 必须要和前面已有的内容一致,否则会报错。

可以查看field的dtype:

from fastNLP import DataSet

d = DataSet({'a': [0, 1, 3], 'b':[[1.0, 2.0], [0.1, 0.2], [3]]})
d.set_input('a', 'b')
d.a.dtype
>> numpy.int64
d.b.dtype
>> numpy.float64
# 默认情况下'a'这个field将被转换为torch.LongTensor,但如果需要其为torch.FloatTensor可以手动修改dtype
d.a.dtype = float  #  请确保该field的确可以全部转换为float。

如果某个field中出现了多种类型混合(比如一部分为str,一部分为int)的情况,fastNLP无法判断该field的类型,会报如下的 错误:

from fastNLP import DataSet

d = DataSet({'data': [1, 'a']})
d.set_input('data')
>> RuntimeError: Mixed data types in Field data: [<class 'str'>, <class 'int'>]

可以通过设置以忽略对该field进行类型检查:

from fastNLP import DataSet
d = DataSet({'data': [1, 'a']})
d.set_ignore_type('data')
d.set_input('data')

当某个field被设置为忽略type之后,fastNLP将不对其进行pad。

3.2 DataSet与pad
在fastNLP里,pad是与一个field绑定的。即不同的field可以使用不同的pad方式,比如在英文任务中word需要的pad和 character的pad方式往往是不同的。fastNLP是通过一个叫做 Padder 的子类来完成的。 默认情况下,所有field使用 AutoPadder 。可以通过使用以下方式设置Padder(如果将padder设置为None,则该field不会进行pad操作)。 大多数情况下直接使用 AutoPadder 就可以了。 如果 AutoPadderEngChar2DPadder 无法满足需求, 也可以自己写一个 Padder
3.3 根据DataSet中多个field合成新的field
DataSet支持在进行batch时,默认只能看到当前的field的值,但在某些训练中可能存在以下的情况: (1)需要两个field拼接成为一个field; (2)需要在batch中进行负采样。这时候就需要能够同时利用多个field进行batch的操作,DataSet中的add_collate_fn()函数支持添加 自定义涉及多个field的collate_fn函数。例如下例中将两个field拼接成一个field的场景
class fastNLP.core.dataset.DataSet(data=None)[源代码]

别名 fastNLP.DataSet fastNLP.core.dataset.DataSet

fastNLP的数据容器,详细的使用方法见文档 fastNLP.core.dataset

__init__(data=None)[源代码]
参数:data -- 如果为dict类型,则每个key的value应该为等长的list; 如果为list, 每个元素应该为具有相同field的 Instance
add_collate_fn(fn, name=None)[源代码]

添加 CollateFn,collate_fn允许在生成的batch的过程中动态生成一些数据(在DataSetIter作为迭代器的情况下有效,默认情况下就是用的 这个)。支持依次添加多个collate_fn, 如果相同的key,后面的collate_fn的结果覆盖前面的collate_fn的结果。

参数:
  • fn (callable) -- 传入一个可调用的function, 该function可接受的参数为List[(ind1, instance1), (ind2, instance2)] (某个batch被选中的所有的indice以及instance),其中ind1/ind2是该instance在dataset中的index,instance1/instance2是 这次batch取出来的数据,包含了所有的field。返回值需要为两个dict,第一个dict的值将被认为是input,第二个dict的值被认为是 target,返回的值至多允许一个空dict。若返回的dict中包含了被设置为input或target的field的名称,将覆盖dataset中的field。 fastNLP不会将collate_fn的返回结果pad和转换为tensor,需要在collate_fn中完成pad和转换为tensor(不需要将tensor移动到 gpu中,fastNLP会自动将其移动到特定gpu)。不要修改传入collate_fn中的数据,否则可能导致未知问题。
  • name (str,int) -- collate_fn的名称,如果不传入,默认使用自增长的数字作为key。相同的name会覆盖之前的collate_fn。
add_field(field_name, fields, padder=<fastNLP.core.field.AutoPadder object>, is_input=False, is_target=False, ignore_type=False)[源代码]

新增一个field

参数:
  • field_name (str) -- 新增的field的名称
  • fields (list) -- 需要新增的field的内容
  • padder (None,Padder) -- 如果为None,则不进行pad,默认使用 AutoPadder 自动判断是否需要做pad。
  • is_input (bool) -- 新加入的field是否是input
  • is_target (bool) -- 新加入的field是否是target
  • ignore_type (bool) -- 是否忽略对新加入的field的类型检查
add_fieldarray(field_name, fieldarray)[源代码]

将fieldarray添加到DataSet中.

参数:
  • field_name (str) -- 新加入的field的名称
  • fieldarray (FieldArray) -- 需要加入DataSet的field的内容
返回:

add_seq_len(field_name: str, new_field_name='seq_len')[源代码]

将使用len()直接对field_name中每个元素作用,将其结果作为sequence length, 并放入seq_len这个field。

参数:
  • field_name -- str.
  • new_field_name -- str. 新的field_name
返回:

append(instance)[源代码]

将一个instance对象append到DataSet后面。

参数:instance (Instance) -- 若DataSet不为空,则instance应该拥有和DataSet完全一样的field。
apply(func, new_field_name=None, **kwargs)[源代码]

将DataSet中每个instance传入到func中,并获取它的返回值.

参数:
  • func (callable) -- 参数是 DataSet 中的 Instance
  • new_field_name (None,str) -- 将func返回的内容放入到 new_field_name 这个field中,如果名称与已有的field相同,则覆 盖之前的field。如果为None则不创建新的field。
  • kwargs (optional) --

    支持输入is_input,is_target,ignore_type

    1. is_input: bool, 如果为True则将 new_field_name 的field设置为input
    2. is_target: bool, 如果为True则将 new_field_name 的field设置为target
    3. ignore_type: bool, 如果为True则将 new_field_name 的field的ignore_type设置为true, 忽略其类型
Return List[Any]:
 

里面的元素为func的返回值,所以list长度为DataSet的长度

apply_field(func, field_name, new_field_name=None, **kwargs)[源代码]

将DataSet中的每个instance中的名为 field_name 的field传给func,并获取它的返回值。

参数:
  • func (callable) -- input是instance中名为 field_name 的field的内容。
  • field_name (str) -- 传入func的是哪个field。
  • new_field_name (None,str) -- 将func返回的内容放入到 new_field_name 这个field中,如果名称与已有的field相同,则覆 盖之前的field。如果为None则不创建新的field。
  • kwargs (optional) --

    支持输入is_input,is_target,ignore_type

    1. is_input: bool, 如果为True则将名为 new_field_name 的field设置为input
    2. is_target: bool, 如果为True则将名为 new_field_name 的field设置为target
    3. ignore_type: bool, 如果为True则将名为 new_field_name 的field的ignore_type设置为true, 忽略其类型
Return List[Any]:
 

里面的元素为func的返回值,所以list长度为DataSet的长度

apply_field_more(func, field_name, modify_fields=True, **kwargs)[源代码]

DataSet 中的每个 Instance 中的名为 field_name 的field 传给 func,并获取它的返回值。 func 可以返回一个或多个 field 上的结果。

注解

apply_field_moreapply_field 的区别参考 apply_more() 中关于 apply_moreapply 区别的介绍。

参数:
  • func (callable) -- 参数是 DataSet 中的 Instance ,返回值是一个字典,key 是field 的名字,value 是对应的结果
  • field_name (str) -- 传入func的是哪个field。
  • modify_fields (bool) -- 是否用结果修改 DataSet 中的 Field, 默认为 True
  • kwargs (optional) --

    支持输入is_input,is_target,ignore_type

    1. is_input: bool, 如果为True则将被修改的field设置为input
    2. is_target: bool, 如果为True则将被修改的field设置为target
    3. ignore_type: bool, 如果为True则将被修改的field的ignore_type设置为true, 忽略其类型

:return Dict[int:Field]: 返回一个字典

apply_more(func, modify_fields=True, **kwargs)[源代码]

DataSet 中每个 Instance 传入到func中,并获取它的返回值。func可以返回一个或多个 field 上的结果。

注解

apply_moreapply 的区别:

  1. apply_more 可以返回多个 field 的结果, apply 只可以返回一个field 的结果;
  2. apply_more 的返回值是一个字典,每个 key-value 对中的 key 表示 field 的名字,value 表示计算结果;
  3. apply_more 默认修改 DataSet 中的 field ,apply 默认不修改。
参数:
  • func (callable) -- 参数是 DataSet 中的 Instance ,返回值是一个字典,key 是field 的名字,value 是对应的结果
  • modify_fields (bool) -- 是否用结果修改 DataSet 中的 Field , 默认为 True
  • kwargs (optional) --

    支持输入is_input,is_target,ignore_type

    1. is_input: bool, 如果为True则将被修改的的field设置为input
    2. is_target: bool, 如果为True则将被修改的的field设置为target
    3. ignore_type: bool, 如果为True则将被修改的的field的ignore_type设置为true, 忽略其类型

:return Dict[int:Field]: 返回一个字典

copy_field(field_name, new_field_name)[源代码]

深度copy名为field_name的field到new_field_name

参数:
  • field_name (str) -- 需要copy的field。
  • new_field_name (str) -- copy生成的field名称
返回:

self

delete_collate_fn(name=None)[源代码]

删除某个collate_fn

参数:name (str,int) -- 如果为None,则删除最近加入的collate_fn
返回:
delete_field(field_name)[源代码]

删除名为field_name的field

参数:field_name (str) -- 需要删除的field的名称.
delete_instance(index)[源代码]

删除第index个instance

参数:index (int) -- 需要删除的instance的index,序号从0开始。
drop(func, inplace=True)[源代码]

func接受一个Instance,返回bool值。返回值为True时,该Instance会被移除或者不会包含在返回的DataSet中。

参数:
  • func (callable) -- 接受一个Instance作为参数,返回bool值。为True时删除该instance
  • inplace (bool) -- 是否在当前DataSet中直接删除instance;如果为False,将返回一个新的DataSet。
返回:

DataSet

get_all_fields()[源代码]

返回一个dict,key为field_name, value为对应的 FieldArray

Return dict:返回如上所述的字典
get_field(field_name)[源代码]

获取field_name这个field

参数:field_name (str) -- field的名称
返回:FieldArray
get_field_names() → list[源代码]

返回一个list,包含所有 field 的名字

Return list:返回如上所述的列表
get_input_name()[源代码]

返回所有is_input被设置为True的field名称

Return list:里面的元素为被设置为input的field名称
get_length()[源代码]

获取DataSet的元素数量

返回:int: DataSet中Instance的个数。
get_target_name()[源代码]

返回所有is_target被设置为True的field名称

Return list:里面的元素为被设置为target的field名称
has_field(field_name)[源代码]

判断DataSet中是否有名为field_name这个field

参数:field_name (str) -- field的名称
Return bool:表示是否有名为field_name这个field
static load(path)[源代码]

从保存的DataSet pickle文件的路径中读取DataSet

参数:path (str) -- 从哪里读取DataSet
返回:读取后的 读取后的DataSet
print_field_meta()[源代码]

输出当前field的meta信息, 形似下列的输出:

+-------------+-------+-------+
| field_names |   x   |   y   |
+=============+=======+=======+
|   is_input  |  True | False |
|  is_target  | False | False |
| ignore_type | False |       |
|  pad_value  |   0   |       |
+-------------+-------+-------+
参数:
  • field_names -- DataSet中field的名称
  • is_input -- field是否为input
  • is_target -- field是否为target
  • ignore_type -- 是否忽略该field的type, 一般仅在该field至少为input或target时才有意义
  • pad_value -- 该field的pad的值,仅在该field为input或target时有意义
返回:

rename_field(field_name, new_field_name)[源代码]

将某个field重新命名.

参数:
  • field_name (str) -- 原来的field名称。
  • new_field_name (str) -- 修改为new_name。
save(path)[源代码]

保存DataSet.

参数:path (str) -- 将DataSet存在哪个路径
set_ignore_type(*field_names, flag=True)[源代码]

将field设置为忽略类型状态。当某个field被设置了ignore_type, 则在被设置为target或者input时将不进行类型检查, 默认情况下也不进行pad。如果仍需要pad该field,可通过自定义Padder实现,若该field需要转换为tensor,需要在padder 中转换,但不需要在padder中移动到gpu。

参数:
  • field_names (str) -- field的名称
  • flag (bool) -- 将field_name的ignore_type状态设置为flag
返回:

set_input(*field_names, flag=True, use_1st_ins_infer_dim_type=True)[源代码]

将field_names的field设置为input:

dataset.set_input('words', 'seq_len')   # 将words和seq_len这两个field的input属性设置为True
dataset.set_input('words', flag=False)  # 将words这个field的input属性设置为False
参数:
  • field_names (str) -- field的名称
  • flag (bool) -- 将field_name的input状态设置为flag
  • use_1st_ins_infer_dim_type (bool) -- 如果为True,将不会check该列是否所有数据都是同样的维度,同样的类型。将直接使用第一 行的数据进行类型和维度推断本列的数据的类型和维度。
set_pad_val(field_name, pad_val)[源代码]

为某个field设置对应的pad_val.

参数:
  • field_name (str) -- 修改该field的pad_val
  • pad_val (int) -- 该field的padder会以pad_val作为padding index
set_padder(field_name, padder)[源代码]

为field_name设置padder:

from fastNLP import EngChar2DPadder
padder = EngChar2DPadder()
dataset.set_padder('chars', padder)  # 则chars这个field会使用EngChar2DPadder进行pad操作
参数:
  • field_name (str) -- 设置field的padding方式为padder
  • padder (None,Padder) -- 设置为None即删除padder, 即对该field不进行pad操作。
set_target(*field_names, flag=True, use_1st_ins_infer_dim_type=True)[源代码]

将field_names的field设置为target

Example:

dataset.set_target('labels', 'seq_len')  # 将labels和seq_len这两个field的target属性设置为True
dataset.set_target('labels', 'seq_lens', flag=False) # 将labels和seq_len的target属性设置为False
参数:
  • field_names (str) -- field的名称
  • flag (bool) -- 将field_name的target状态设置为flag
  • use_1st_ins_infer_dim_type (bool) -- 如果为True,将不会check该列是否所有数据都是同样的维度,同样的类型。将直接使用第一 行的数据进行类型和维度推断本列的数据的类型和维度。
split(ratio, shuffle=True)[源代码]

将DataSet按照ratio的比例拆分,返回两个DataSet

参数:
  • ratio (float) -- 0<ratio<1, 返回的第一个DataSet拥有 (1-ratio) 这么多数据,第二个DataSet拥有`ratio`这么多数据
  • shuffle (bool) -- 在split前是否shuffle一下
返回:

[ 读取后的DataSet , 读取后的DataSet ]

fastNLP.core.field
class fastNLP.core.field.Padder(pad_val=0, **kwargs)[源代码]

别名 fastNLP.Padder fastNLP.core.field.Padder

所有padder都需要继承这个类,并覆盖__call__方法。 用于对batch进行padding操作。传入的element是inplace的,即直接修改element可能导致数据变化,建议inplace修改之前deepcopy一份。

__call__(self, contents, field_name, field_ele_dtype):
__init__(pad_val=0, **kwargs)[源代码]
参数:
  • contents (List[Any]) -- 传入的element是inplace的,即直接修改element可能导致数据变化,建议inplace修改之前 deepcopy一份。
  • field_name (str,) -- field的名称。
  • field_ele_dtype (np.int64,np.float64,np.str,None,) -- 该field的内层元素的类型。如果该field的ignore_type为True,该这个值为None。
返回:

np.array([padded_element])

class fastNLP.core.field.AutoPadder(pad_val=0)[源代码]

基类 fastNLP.Padder

别名 fastNLP.AutoPadder fastNLP.core.field.AutoPadder

根据contents的数据自动判定是否需要做padding。

1 如果元素类型(元素类型是指field中最里层元素的数据类型, 可以通过FieldArray.dtype查看,比如['This', 'is', ...]的元素类 型为str, [[1,2], ...]的元素类型为int)的数据不为数值类型则不会进行pad

2 如果元素类型为数值类型,比如np.int64, np.float64, int, float, torch.int64等

2.1 如果该field的内容为数值类型(包括int, float等),比如为seq_len, 则不进行padding

2.2 如果该field的内容等价于一维list, 那么会将Batch中的List pad为一样长。

2.3 如果该field的内容等价于二维list,那么会按照英语character padding的方式进行padding。如果是character padding建议使用
class:fastNLP.EngChar2DPadder.
2.4 如果该field的内容等价于三维list,则如果每个instance在每个维度上相等,会组成一个batch的tensor返回,这种情况应该是为图片
的情况。

3 其它情况不进行处理,返回一个np.array类型。

class fastNLP.core.field.EngChar2DPadder(pad_val=0, pad_length=0)[源代码]

基类 fastNLP.Padder

别名 fastNLP.EngChar2DPadder fastNLP.core.field.EngChar2DPadder

用于为英语执行character级别的2D padding操作。对应的field内容应该类似[['T', 'h', 'i', 's'], ['a'], ['d', 'e', 'm', 'o']], 但这个Padder只能处理index为int的情况。

padded过后的batch内容,形状为(batch_size, max_sentence_length, max_word_length). max_sentence_length为这个batch中最大句 子长度;max_word_length为这个batch中最长的word的长度:

from fastNLP import DataSet
from fastNLP import EngChar2DPadder
from fastNLP import Vocabulary
dataset = DataSet({'sent': ['This is the first demo', 'This is the second demo']})
dataset.apply(lambda ins:[list(word) for word in ins['sent'].split()], new_field_name='chars')
vocab = Vocabulary()
vocab.from_dataset(dataset, field_name='chars')
vocab.index_dataset(dataset, field_name='chars')
dataset.set_input('chars')
padder = EngChar2DPadder()
dataset.set_padder('chars', padder)  # chars这个field的设置为了EnChar2DPadder
__init__(pad_val=0, pad_length=0)[源代码]
参数:
  • pad_val -- int, pad的位置使用该index
  • pad_length -- int, 如果为0则取一个batch中最大的单词长度作为padding长度。如果为大于0的数,则将所有单词的长度 都pad或截取到该长度.
fastNLP.core.instance

instance 模块实现了Instance 类在fastNLP中对应sample。一个sample可以认为是一个Instance类型的对象。 便于理解的例子可以参考文档 fastNLP.core.dataset 中的表格

class fastNLP.core.instance.Instance(**fields)[源代码]

别名 fastNLP.Instance fastNLP.core.instance.Instance

Instance是fastNLP中对应一个sample的类。每个sample在fastNLP中是一个Instance对象。 Instance一般与 DataSet 一起使用, Instance的初始化如下面的Example所示:

>>>from fastNLP import Instance
>>>ins = Instance(field_1=[1, 1, 1], field_2=[2, 2, 2])
>>>ins["field_1"]
[1, 1, 1]
>>>ins.add_field("field_3", [3, 3, 3])
>>>ins = Instance(**{'x1': 1, 'x2':np.zeros((3, 4))})
add_field(field_name, field)[源代码]

向Instance中增加一个field

参数:
  • field_name (str) -- 新增field的名称
  • field (Any) -- 新增field的内容
items()[源代码]

返回一个迭代器,迭代器返回两个内容,第一个内容是field_name, 第二个内容是field_value

返回:一个迭代器
fastNLP.core.losses

losses 模块定义了 fastNLP 中所需的各种损失函数,一般做为 Trainer 的参数使用。

class fastNLP.core.losses.LossBase[源代码]

别名 fastNLP.LossBase fastNLP.core.losses.LossBase

所有loss的基类。如果想了解其中的原理,请查看源码。

class fastNLP.core.losses.LossFunc(func, key_map=None, **kwargs)[源代码]

基类 fastNLP.LossBase

别名 fastNLP.LossFunc fastNLP.core.losses.LossFunc

提供给用户使用自定义损失函数的类

param func:用户自行定义的损失函数,应当为一个函数或者callable(func)为True的ojbect
param dict key_map:
 参数映射表。键为Model/DataSet参数名,值为损失函数参数名。 fastNLP的trainer将在训练时从模型返回值或者训练数据DataSet的target=True的field中 找到相对应的参数名为value的参数,并传入func中作为参数名为key的参数
param kwargs:除了参数映射表以外可以用key word args的方式设置参数映射关系

使用方法:

func = torch.nn.CrossEntropyLoss()
loss_func = LossFunc(func, input="pred", target="label")
# 这表示构建了一个损失函数类,由func计算损失函数,其中将从模型返回值或者DataSet的target=True的field
# 当中找到一个参数名为`pred`的参数传入func一个参数名为`input`的参数;找到一个参数名为`label`的参数
# 传入func作为一个名为`target`的参数
class fastNLP.core.losses.LossInForward(loss_key='loss')[源代码]

基类 fastNLP.LossBase

别名 fastNLP.LossInForward fastNLP.core.losses.LossInForward

从forward()函数返回结果中获取loss
__init__(loss_key='loss')[源代码]
参数:loss_key (str) -- 在forward函数中loss的键名,默认为loss
class fastNLP.core.losses.CrossEntropyLoss(pred=None, target=None, seq_len=None, class_in_dim=-1, padding_idx=-100, reduction='mean')[源代码]

基类 fastNLP.LossBase

别名 fastNLP.CrossEntropyLoss fastNLP.core.losses.CrossEntropyLoss

交叉熵损失函数

param pred:参数映射表中 pred 的映射关系,None表示映射关系为 pred -> pred
param target:参数映射表中 target 的映射关系,None表示映射关系为 target -> target
param seq_len:句子的长度, 长度之外的token不会计算loss。
param int class_in_dim:
 在序列标注的场景中,pred可能的shape为(batch_size, max_len, num_classes) 或(batch_size, num_classes, max_len), CrossEntropyLoss需要知道哪一维是class的维度以计算loss。如果为-1,就根据pred的第 二维是否等于target的第二维来判断是否需要交换pred的第二维和第三维,因为target的第二维是length的维度,如果这一维度上和pred相等, 那么pred可能第二维也是长度维(存在误判的可能,如果有误判的情况,请显示设置该值)。其它大于0的值则认为该维度是class的维度。
param padding_idx:
 padding的index,在计算loss时将忽略target中标号为padding_idx的内容, 可以通过该值代替 传入seq_len.
param str reduction:
 支持 meansumnone .

Example:

loss = CrossEntropyLoss(pred='pred', target='label', padding_idx=0)
class fastNLP.core.losses.BCELoss(pred=None, target=None, reduction='mean')[源代码]

基类 fastNLP.LossBase

别名 fastNLP.BCELoss fastNLP.core.losses.BCELoss

二分类交叉熵损失函数

param pred:参数映射表中 pred 的映射关系,None表示映射关系为 pred -> pred
param target:参数映射表中 target 的映射关系,None表示映射关系为 target -> target
param str reduction:
 支持 meansumnone .
class fastNLP.core.losses.L1Loss(pred=None, target=None, reduction='mean')[源代码]

基类 fastNLP.LossBase

别名 fastNLP.L1Loss fastNLP.core.losses.L1Loss

L1损失函数

param pred:参数映射表中 pred 的映射关系,None表示映射关系为 pred -> pred
param target:参数映射表中 target 的映射关系,None表示映射关系为 target >`target`
param str reduction:
 支持'mean','sum'和'none'.
class fastNLP.core.losses.NLLLoss(pred=None, target=None, ignore_idx=-100, reduction='mean')[源代码]

基类 fastNLP.LossBase

别名 fastNLP.NLLLoss fastNLP.core.losses.NLLLoss

负对数似然损失函数
__init__(pred=None, target=None, ignore_idx=-100, reduction='mean')[源代码]
参数:
  • pred -- 参数映射表中 pred 的映射关系,None表示映射关系为 pred -> pred
  • target -- 参数映射表中 target 的映射关系,None表示映射关系为 target -> target
  • ignore_idx -- ignore的index,在计算loss时将忽略target中标号为ignore_idx的内容, 可以通过该值代替 传入seq_len.
  • reduction (str) -- 支持 meansumnone .
class fastNLP.core.losses.CMRC2018Loss(target_start=None, target_end=None, context_len=None, pred_start=None, pred_end=None, reduction='mean')[源代码]

基类 fastNLP.LossBase

别名 fastNLP.CMRC2018Loss fastNLP.core.losses.CMRC2018Loss

用于计算CMRC2018中文问答任务。
get_loss(target_start, target_end, context_len, pred_start, pred_end)[源代码]
参数:
  • target_start -- batch_size
  • target_end -- batch_size
  • context_len -- batch_size
  • pred_start -- batch_size x max_len
  • pred_end -- batch_size x max_len
返回:

fastNLP.core.metrics

metrics 模块实现了 fastNLP 所需的各种常用衡量指标,一般做为 Trainer 的参数使用。

class fastNLP.core.metrics.MetricBase[源代码]

别名 fastNLP.MetricBase fastNLP.core.metrics.MetricBase

所有metrics的基类,所有的传入到Trainer, Tester的Metric需要继承自该对象,需要覆盖写入evaluate(), get_metric()方法。

evaluate(xxx)中传入的是一个batch的数据。

get_metric(xxx)当所有数据处理完毕,调用该方法得到最终的metric值

以分类问题中,Accuracy计算为例 假设model的forward返回dict中包含 pred 这个key, 并且该key需要用于Accuracy:

class Model(nn.Module):
    def __init__(xxx):
        # do something
    def forward(self, xxx):
        # do something
        return {'pred': pred, 'other_keys':xxx} # pred's shape: batch_size x num_classes

假设dataset中 label 这个field是需要预测的值,并且该field被设置为了target 对应的AccMetric可以按如下的定义, version1, 只使用这一次:

class AccMetric(MetricBase):
    def __init__(self):
        super().__init__()

        # 根据你的情况自定义指标
        self.corr_num = 0
        self.total = 0

    def evaluate(self, label, pred): # 这里的名称需要和dataset中target field与model返回的key是一样的,不然找不到对应的value
        # dev或test时,每个batch结束会调用一次该方法,需要实现如何根据每个batch累加metric
        self.total += label.size(0)
        self.corr_num += label.eq(pred).sum().item()

    def get_metric(self, reset=True): # 在这里定义如何计算metric
        acc = self.corr_num/self.total
        if reset: # 是否清零以便重新计算
            self.corr_num = 0
            self.total = 0
        return {'acc': acc} # 需要返回一个dict,key为该metric的名称,该名称会显示到Trainer的progress bar中

version2,如果需要复用Metric,比如下一次使用AccMetric时,dataset中目标field不叫label而叫y,或者model的输出不是pred:

class AccMetric(MetricBase):
    def __init__(self, label=None, pred=None):
        # 假设在另一场景使用时,目标field叫y,model给出的key为pred_y。则只需要在初始化AccMetric时,
        #   acc_metric = AccMetric(label='y', pred='pred_y')即可。
        # 当初始化为acc_metric = AccMetric(),即label=None, pred=None, fastNLP会直接使用'label', 'pred'作为key去索取对
        #   应的的值
        super().__init__()
        self._init_param_map(label=label, pred=pred) # 该方法会注册label和pred. 仅需要注册evaluate()方法会用到的参数名即可
        # 如果没有注册该则效果与version1就是一样的

        # 根据你的情况自定义指标
        self.corr_num = 0
        self.total = 0

    def evaluate(self, label, pred): # 这里的参数名称需要和self._init_param_map()注册时一致。
        # dev或test时,每个batch结束会调用一次该方法,需要实现如何根据每个batch累加metric
        self.total += label.size(0)
        self.corr_num += label.eq(pred).sum().item()

    def get_metric(self, reset=True): # 在这里定义如何计算metric
        acc = self.corr_num/self.total
        if reset: # 是否清零以便重新计算
            self.corr_num = 0
            self.total = 0
        return {'acc': acc} # 需要返回一个dict,key为该metric的名称,该名称会显示到Trainer的progress bar中

MetricBase 将会在输入的字典 pred_dicttarget_dict 中进行检查. pred_dict 是模型当中 forward() 函数或者 predict() 函数的返回值. target_dict 是DataSet当中的ground truth, 判定ground truth的条件是field的 is_target 被设置为True.

MetricBase 会进行以下的类型检测:

  1. self.evaluate当中是否有varargs, 这是不支持的.
  2. self.evaluate当中所需要的参数是否既不在 pred_dict 也不在 target_dict .
  3. self.evaluate当中所需要的参数是否既在 pred_dict 也在 target_dict .

除此以外,在参数被传入self.evaluate以前,这个函数会检测 pred_dicttarget_dict 当中没有被用到的参数 如果kwargs是self.evaluate的参数,则不会检测

self.evaluate将计算一个批次(batch)的评价指标,并累计。 没有返回值 self.get_metric将统计当前的评价指标并返回评价结果, 返回值需要是一个dict, key是指标名称,value是指标的值

get_metric_name()[源代码]

返回metric的名称

返回:
set_metric_name(name: str)[源代码]

设置metric的名称,默认是Metric的class name.

参数:name (str) --
返回:self
class fastNLP.core.metrics.AccuracyMetric(pred=None, target=None, seq_len=None)[源代码]

基类 fastNLP.MetricBase

别名 fastNLP.AccuracyMetric fastNLP.core.metrics.AccuracyMetric

准确率Metric(其它的Metric参见 fastNLP.core.metrics
__init__(pred=None, target=None, seq_len=None)[源代码]
参数:
  • pred -- 参数映射表中 pred 的映射关系,None表示映射关系为 pred -> pred
  • target -- 参数映射表中 target 的映射关系,None表示映射关系为 target -> target
  • seq_len -- 参数映射表中 seq_len 的映射关系,None表示映射关系为 seq_len -> seq_len
evaluate(pred, target, seq_len=None)[源代码]

evaluate函数将针对一个批次的预测结果做评价指标的累计

参数:
  • pred (torch.Tensor) -- 预测的tensor, tensor的形状可以是torch.Size([B,]), torch.Size([B, n_classes]), torch.Size([B, max_len]), 或者torch.Size([B, max_len, n_classes])
  • target (torch.Tensor) -- 真实值的tensor, tensor的形状可以是Element's can be: torch.Size([B,]), torch.Size([B,]), torch.Size([B, max_len]), 或者torch.Size([B, max_len])
  • seq_len (torch.Tensor) -- 序列长度标记, 标记的形状可以是None, None, torch.Size([B]), 或者torch.Size([B]). 如果mask也被传进来的话seq_len会被忽略.
get_metric(reset=True)[源代码]

get_metric函数将根据evaluate函数累计的评价指标统计量来计算最终的评价结果.

参数:reset (bool) -- 在调用完get_metric后是否清空评价指标统计量.
Return dict evaluate_result:
 {"acc": float}
get_metric_name()

返回metric的名称

返回:
set_metric_name(name: str)

设置metric的名称,默认是Metric的class name.

参数:name (str) --
返回:self
class fastNLP.core.metrics.SpanFPreRecMetric(tag_vocab, pred=None, target=None, seq_len=None, encoding_type=None, ignore_labels=None, only_gross=True, f_type='micro', beta=1)[源代码]

基类 fastNLP.MetricBase

别名 fastNLP.SpanFPreRecMetric fastNLP.core.metrics.SpanFPreRecMetric

在序列标注问题中,以span的方式计算F, pre, rec. 比如中文Part of speech中,会以character的方式进行标注,句子 中国在亚洲 对应的POS可能为(以BMES为例) ['B-NN', 'E-NN', 'S-DET', 'B-NN', 'E-NN']。该metric就是为类似情况下的F1计算。 最后得到的metric结果为:

{
    'f': xxx, # 这里使用f考虑以后可以计算f_beta值
    'pre': xxx,
    'rec':xxx
}

若only_gross=False, 即还会返回各个label的metric统计值:

{
    'f': xxx,
    'pre': xxx,
    'rec':xxx,
    'f-label': xxx,
    'pre-label': xxx,
    'rec-label':xxx,
    ...
}
__init__(tag_vocab, pred=None, target=None, seq_len=None, encoding_type=None, ignore_labels=None, only_gross=True, f_type='micro', beta=1)[源代码]
参数:
  • tag_vocab -- 标签的 Vocabulary 。支持的标签为"B"(没有label);或"B-xxx"(xxx为某种label,比如POS中的NN), 在解码时,会将相同xxx的认为是同一个label,比如['B-NN', 'E-NN']会被合并为一个'NN'.
  • pred (str) -- 用该key在evaluate()时从传入dict中取出prediction数据。 为None,则使用 pred 取数据
  • target (str) -- 用该key在evaluate()时从传入dict中取出target数据。 为None,则使用 target 取数据
  • seq_len (str) -- 用该key在evaluate()时从传入dict中取出sequence length数据。为None,则使用 seq_len 取数据。
  • encoding_type (str) -- 目前支持bio, bmes, bmeso, bioes。默认为None,通过tag_vocab自动判断.
  • ignore_labels (list) -- str 组成的list. 这个list中的class不会被用于计算。例如在POS tagging时传入['NN'],则不会计算'NN'个label
  • only_gross (bool) -- 是否只计算总的f1, precision, recall的值;如果为False,不仅返回总的f1, pre, rec, 还会返回每个label的f1, pre, rec
  • f_type (str) -- micromacro . micro :通过先计算总体的TP,FN和FP的数量,再计算f, precision, recall; macro : 分布计算每个类别的f, precision, recall,然后做平均(各类别f的权重相同)
  • beta (float) -- f_beta分数, \(f_{beta} = \frac{(1 + {beta}^{2})*(pre*rec)}{({beta}^{2}*pre + rec)}\) . 常用为 beta=0.5, 1, 2 若为0.5则精确率的权重高于召回率;若为1,则两者平等;若为2,则召回率权重高于精确率。
evaluate(pred, target, seq_len)[源代码]

evaluate函数将针对一个批次的预测结果做评价指标的累计

参数:
  • pred -- [batch, seq_len] 或者 [batch, seq_len, len(tag_vocab)], 预测的结果
  • target -- [batch, seq_len], 真实值
  • seq_len -- [batch] 文本长度标记
返回:

get_metric(reset=True)[源代码]

get_metric函数将根据evaluate函数累计的评价指标统计量来计算最终的评价结果.

get_metric_name()

返回metric的名称

返回:
set_metric_name(name: str)

设置metric的名称,默认是Metric的class name.

参数:name (str) --
返回:self
class fastNLP.core.metrics.CMRC2018Metric(answers=None, raw_chars=None, context_len=None, pred_start=None, pred_end=None)[源代码]

基类 fastNLP.MetricBase

别名 fastNLP.CMRC2018Metric fastNLP.core.metrics.CMRC2018Metric

CRMC2018任务的评价metric
evaluate(answers, raw_chars, pred_start, pred_end, context_len=None)[源代码]
参数:
  • answers (list[str]) -- 如[["答案1", "答案2", "答案3"], [...], ...]
  • raw_chars (list[str]) -- [["这", "是", ...], [...]]
  • pred_start (tensor) -- batch_size x length 或 batch_size,
  • pred_end (tensor) -- batch_size x length 或 batch_size(是闭区间,包含end位置),
  • context_len (tensor) -- context长度, batch_size
返回:

get_metric_name()

返回metric的名称

返回:
set_metric_name(name: str)

设置metric的名称,默认是Metric的class name.

参数:name (str) --
返回:self
class fastNLP.core.metrics.ClassifyFPreRecMetric(tag_vocab=None, pred=None, target=None, seq_len=None, ignore_labels=None, only_gross=True, f_type='micro', beta=1)[源代码]

基类 fastNLP.MetricBase

别名 fastNLP.ClassifyFPreRecMetric fastNLP.core.metrics.ClassifyFPreRecMetric

分类问题计算FPR值的Metric(其它的Metric参见 fastNLP.core.metrics

最后得到的metric结果为:

{
    'f': xxx, # 这里使用f考虑以后可以计算f_beta值
    'pre': xxx,
    'rec':xxx
}

若only_gross=False, 即还会返回各个label的metric统计值:

{
    'f': xxx,
    'pre': xxx,
    'rec':xxx,
    'f-label': xxx,
    'pre-label': xxx,
    'rec-label':xxx,
    ...
}
__init__(tag_vocab=None, pred=None, target=None, seq_len=None, ignore_labels=None, only_gross=True, f_type='micro', beta=1)[源代码]
参数:
  • tag_vocab -- 标签的 Vocabulary . 默认值为None。若为None则使用数字来作为标签内容,否则使用vocab来作为标签内容。
  • pred (str) -- 用该key在evaluate()时从传入dict中取出prediction数据。 为None,则使用 pred 取数据
  • target (str) -- 用该key在evaluate()时从传入dict中取出target数据。 为None,则使用 target 取数据
  • seq_len (str) -- 用该key在evaluate()时从传入dict中取出sequence length数据。为None,则使用 seq_len 取数据。
  • ignore_labels (list) -- str 组成的list. 这个list中的class不会被用于计算。例如在POS tagging时传入['NN'],则不会计算'NN'个label
  • only_gross (bool) -- 是否只计算总的f1, precision, recall的值;如果为False,不仅返回总的f1, pre, rec, 还会返回每个label的f1, pre, rec
  • f_type (str) -- micromacro . micro :通过先计算总体的TP,FN和FP的数量,再计算f, precision, recall; macro : 分布计算每个类别的f, precision, recall,然后做平均(各类别f的权重相同)
  • beta (float) -- f_beta分数, \(f_{beta} = \frac{(1 + {beta}^{2})*(pre*rec)}{({beta}^{2}*pre + rec)}\) . 常用为 beta=0.5, 1, 2 若为0.5则精确率的权重高于召回率;若为1,则两者平等;若为2,则召回率权重高于精确率。
evaluate(pred, target, seq_len=None)[源代码]

evaluate函数将针对一个批次的预测结果做评价指标的累计

参数:
  • pred (torch.Tensor) -- 预测的tensor, tensor的形状可以是torch.Size([B,]), torch.Size([B, n_classes]), torch.Size([B, max_len]), 或者torch.Size([B, max_len, n_classes])
  • target (torch.Tensor) -- 真实值的tensor, tensor的形状可以是Element's can be: torch.Size([B,]), torch.Size([B,]), torch.Size([B, max_len]), 或者torch.Size([B, max_len])
  • seq_len (torch.Tensor) -- 序列长度标记, 标记的形状可以是None, None, torch.Size([B]), 或者torch.Size([B]). 如果mask也被传进来的话seq_len会被忽略.
get_metric(reset=True)[源代码]

get_metric函数将根据evaluate函数累计的评价指标统计量来计算最终的评价结果.

参数:reset (bool) -- 在调用完get_metric后是否清空评价指标统计量.
Return dict evaluate_result:
 {"acc": float}
get_metric_name()

返回metric的名称

返回:
set_metric_name(name: str)

设置metric的名称,默认是Metric的class name.

参数:name (str) --
返回:self
class fastNLP.core.metrics.ConfusionMatrixMetric(vocab=None, pred=None, target=None, seq_len=None, print_ratio=False)[源代码]

基类 fastNLP.MetricBase

别名 fastNLP.ConfusionMatrixMetric fastNLP.core.metrics.ConfusionMatrixMetric

分类问题计算混淆矩阵的Metric(其它的Metric参见 fastNLP.core.metrics ) 最后返回结果为:

dict,{'confusion_matrix': ConfusionMatrix实例}

ConfusionMatrix实例的print()函数将输出矩阵字符串。

pred_dict = {"pred": torch.Tensor([2,1,3])}
target_dict = {'target': torch.Tensor([2,2,1])}
metric = ConfusionMatrixMetric()
metric(pred_dict=pred_dict, target_dict=target_dict, )
print(metric.get_metric())
{'confusion_matrix':
 target  1.0     2.0     3.0     all
   pred
    1.0    0       1       0       1
    2.0    0       1       0       1
    3.0    1       0       0       1
    all    1       2       0       3
}
__init__(vocab=None, pred=None, target=None, seq_len=None, print_ratio=False)[源代码]
参数:
  • vocab -- vocab词表类,要求有to_word()方法。
  • pred -- 参数映射表中 pred 的映射关系,None表示映射关系为 pred -> pred
  • target -- 参数映射表中 target 的映射关系,None表示映射关系为 target -> target
  • seq_len -- 参数映射表中 seq_len 的映射关系,None表示映射关系为 seq_len -> seq_len
  • print_ratio -- 限制print的输出,false only for result, true for result, percent(dim=0), percent(dim = 1)
evaluate(pred, target, seq_len=None)[源代码]

evaluate函数将针对一个批次的预测结果做评价指标的累计

参数:
  • pred (torch.Tensor) -- 预测的tensor, tensor的形状可以是torch.Size([B,]), torch.Size([B, n_classes]), torch.Size([B, max_len]), 或者torch.Size([B, max_len, n_classes])
  • target (torch.Tensor) -- 真实值的tensor, tensor的形状可以是Element's can be: torch.Size([B,]), torch.Size([B,]), torch.Size([B, max_len]), 或者torch.Size([B, max_len])
  • seq_len (torch.Tensor) -- 序列长度标记, 标记的形状可以是None, torch.Size([B]), 或者torch.Size([B]).
get_metric(reset=True)[源代码]

get_metric函数将根据evaluate函数累计的评价指标统计量来计算最终的评价结果. :param bool reset: 在调用完get_metric后是否清空评价指标统计量. :return dict evaluate_result: {"confusion_matrix": ConfusionMatrix}

get_metric_name()

返回metric的名称

返回:
set_metric_name(name: str)

设置metric的名称,默认是Metric的class name.

参数:name (str) --
返回:self
fastNLP.core.optimizer

optimizer 模块定义了 fastNLP 中所需的各种优化器,一般做为 Trainer 的参数使用。

class fastNLP.core.optimizer.Optimizer(model_params, **kwargs)[源代码]

别名 fastNLP.Optimizer fastNLP.core.optimizer.Optimizer

Optimizer

__init__(model_params, **kwargs)[源代码]
参数:
  • model_params -- a generator. E.g. model.parameters() for PyTorch models.
  • kwargs -- additional parameters.
class fastNLP.core.optimizer.SGD(lr=0.001, momentum=0, model_params=None)[源代码]

基类 fastNLP.Optimizer

别名 fastNLP.SGD fastNLP.core.optimizer.SGD

SGD
__init__(lr=0.001, momentum=0, model_params=None)[源代码]
参数:
  • lr (float) -- learning rate. Default: 0.01
  • momentum (float) -- momentum. Default: 0
  • model_params -- a generator. E.g. model.parameters() for PyTorch models.
class fastNLP.core.optimizer.Adam(lr=0.001, weight_decay=0, betas=(0.9, 0.999), eps=1e-08, amsgrad=False, model_params=None)[源代码]

基类 fastNLP.Optimizer

别名 fastNLP.Adam fastNLP.core.optimizer.Adam

Adam
__init__(lr=0.001, weight_decay=0, betas=(0.9, 0.999), eps=1e-08, amsgrad=False, model_params=None)[源代码]
参数:
  • lr (float) -- learning rate
  • weight_decay (float) --
  • eps --
  • amsgrad --
  • model_params -- a generator. E.g. model.parameters() for PyTorch models.
class fastNLP.core.optimizer.AdamW(params, lr=0.001, betas=(0.9, 0.999), eps=1e-08, weight_decay=0.01, amsgrad=False)[源代码]

别名 fastNLP.AdamW fastNLP.core.optimizer.AdamW

对AdamW的实现,该实现在pytorch 1.2.0版本中已经出现,https://github.com/pytorch/pytorch/pull/21250。 这里加入以适配低版本的pytorch

The original Adam algorithm was proposed in Adam: A Method for Stochastic Optimization. The AdamW variant was proposed in Decoupled Weight Decay Regularization.

__init__(params, lr=0.001, betas=(0.9, 0.999), eps=1e-08, weight_decay=0.01, amsgrad=False)[源代码]
参数:
  • (iterable) (params) -- iterable of parameters to optimize or dicts defining parameter groups
  • (float, optional) (weight_decay) -- learning rate (default: 1e-3)
  • (Tuple[float, float], optional) (betas) -- coefficients used for computing running averages of gradient and its square (default: (0.9, 0.99))
  • (float, optional) -- term added to the denominator to improve numerical stability (default: 1e-8)
  • (float, optional) -- weight decay coefficient (default: 1e-2) algorithm from the paper On the Convergence of Adam and Beyond (default: False)
add_param_group(param_group)

Add a param group to the Optimizer s param_groups.

This can be useful when fine tuning a pre-trained network as frozen layers can be made trainable and added to the Optimizer as training progresses.

Arguments:
param_group (dict): Specifies what Tensors should be optimized along with group specific optimization options.
load_state_dict(state_dict)

Loads the optimizer state.

Arguments:
state_dict (dict): optimizer state. Should be an object returned
from a call to state_dict().
state_dict()

Returns the state of the optimizer as a dict.

It contains two entries:

  • state - a dict holding current optimization state. Its content
    differs between optimizer classes.
  • param_groups - a dict containing all parameter groups
step(closure=None)[源代码]

Performs a single optimization step.

参数:closure -- (callable, optional) A closure that reevaluates the model and returns the loss.
zero_grad()

Clears the gradients of all optimized torch.Tensor s.

fastNLP.core.sampler

sampler 子类实现了 fastNLP 所需的各种采样器。

class fastNLP.core.sampler.Sampler[源代码]

别名 fastNLP.Sampler fastNLP.core.sampler.Sampler

Sampler 类的基类. 规定以何种顺序取出data中的元素

子类必须实现 __call__ 方法. 输入 DataSet 对象, 返回其中元素的下标序列

__init__

Initialize self. See help(type(self)) for accurate signature.

class fastNLP.core.sampler.BucketSampler(num_buckets=10, batch_size=None, seq_len_field_name='seq_len')[源代码]

基类 fastNLP.Sampler

别名 fastNLP.BucketSampler fastNLP.core.sampler.BucketSampler

带Bucket的 Random Sampler. 可以随机地取出长度相似的元素
__init__(num_buckets=10, batch_size=None, seq_len_field_name='seq_len')[源代码]
参数:
  • num_buckets (int) -- bucket的数量
  • batch_size (int) -- batch的大小. 默认为None,Trainer在调用BucketSampler时,会将该值正确设置,如果是非Trainer场景使用,需 要显示传递该值
  • seq_len_field_name (str) -- 对应序列长度的 field 的名字
set_batch_size(batch_size)[源代码]
参数:batch_size (int) -- 每个batch的大小
返回:
class fastNLP.core.sampler.SequentialSampler[源代码]

基类 fastNLP.Sampler

别名 fastNLP.SequentialSampler fastNLP.core.sampler.SequentialSampler

顺序取出元素的 Sampler
__init__

Initialize self. See help(type(self)) for accurate signature.

class fastNLP.core.sampler.RandomSampler[源代码]

基类 fastNLP.Sampler

别名 fastNLP.RandomSampler fastNLP.core.sampler.RandomSampler

随机化取元素的 Sampler
__init__

Initialize self. See help(type(self)) for accurate signature.

fastNLP.core.tester

tester模块实现了 fastNLP 所需的Tester类,能在提供数据、模型以及metric的情况下进行性能测试。

这里Metric的映射规律是和 fastNLP.Trainer 中一致的,具体使用请参考 trainer 模块 的1.3部分。 Tester在验证进行之前会调用model.eval()提示当前进入了evaluation阶段,即会关闭nn.Dropout()等,在验证结束之后会调用model.train()恢复到训练状态。

class fastNLP.core.tester.Tester(data, model, metrics, batch_size=16, num_workers=0, device=None, verbose=1, use_tqdm=True)[源代码]

别名 fastNLP.Tester fastNLP.core.tester.Tester

Tester是在提供数据,模型以及metric的情况下进行性能测试的类。需要传入模型,数据以及metric进行验证。

__init__(data, model, metrics, batch_size=16, num_workers=0, device=None, verbose=1, use_tqdm=True)[源代码]
参数:
  • data (DataSet,BatchIter) -- 需要测试的数据集
  • model (torch.nn.Module) -- 使用的模型
  • metrics (MetricBase,List[MetricBase]) -- 测试时使用的metrics
  • batch_size (int) -- evaluation时使用的batch_size有多大。
  • device (str,int,torch.device,list(int)) --

    将模型load到哪个设备。默认为None,即Trainer不对模型 的计算位置进行管理。支持以下的输入:

    1. str: ['cpu', 'cuda', 'cuda:0', 'cuda:1', ...] 依次为'cpu'中, 可见的第一个GPU中,可见的第一个GPU中,可见的第二个GPU中;
    2. torch.device:将模型装载到torch.device上。
    3. int: 将使用device_id为该值的gpu进行训练
    4. list(int):如果多于1个device,将使用torch.nn.DataParallel包裹model, 并使用传入的device。
    5. None. 为None则不对模型进行任何处理,如果传入的model为torch.nn.DataParallel该值必须为None。

    如果模型是通过predict()进行预测的话,那么将不能使用多卡(DataParallel)进行验证,只会使用第一张卡上的模型。

  • verbose (int) -- 如果为0不输出任何信息; 如果为1,打印出验证结果。
  • use_tqdm (bool) -- 是否使用tqdm来显示测试进度; 如果为False,则不会显示任何内容。
test()[源代码]

开始进行验证,并返回验证结果。

Return Dict[Dict]:
 dict的二层嵌套结构,dict的第一层是metric的名称; 第二层是这个metric的指标。一个AccuracyMetric的例子为{'AccuracyMetric': {'acc': 1.0}}。
fastNLP.core.trainer

Trainer在fastNLP中用于组织单任务的训练过程,可以避免用户在不同训练任务中重复撰以下步骤的代码

  1. epoch循环;
  2. 将数据分成不同的Batch;
  3. 对Batch进行pad;
  4. 每个epoch结束或一定step后进行验证集验证;
  5. 保存获得更好验证性能的模型。
1. Trainer的基本使用

下面的例子是使用神经网络来进行预测一个序列中是否有偶数个1。

import numpy as np
from torch import nn
import torch
import torch.nn.functional as F
from torch.optim import SGD

from fastNLP import DataSet
from fastNLP import Trainer
from fastNLP import CrossEntropyLoss
from fastNLP import AccuracyMetric
from fastNLP.modules.decoder import MLP

# 模型
class Model(nn.Module):
    def __init__(self, input_num):
        super().__init__()
        self.fcs = MLP([input_num, 40, 40, 2], 'relu')

    def forward(self, x):
        x = self.fcs(x)
        return {'pred': x}
model = Model(10)

# 生成数据
def generate_psedo_dataset(num_samples):
    dataset = DataSet()
    data = np.random.randint(2, size=(num_samples, 10))
    label = np.sum(data, axis=1)%2
    dataset = DataSet({'x':data.astype(float), 'label': label})
    dataset.set_input('x')
    dataset.set_target('label')
    return dataset
tr_dataset = generate_psedo_dataset(1000)
dev_data = generate_psedo_dataset(100)

# 训练
trainer = Trainer(tr_dataset, model, loss=CrossEntropyLoss(target='label'),
                   optimizer=SGD(model.parameters(), lr=0.1),n_epochs=1000,
                   dev_data = dev_data, metrics=AccuracyMetric(target='label'))
trainer.train()

由上面的例子可以看出通过使用Trainer,可以使得训练部分的代码大幅减少。 使用Trainer需要满足以下几个条件:

1.1 模型

1 模型的forward()的参数名需要与DataSet中的名字对应。实际上fastNLP在将DataSet中的数据传递给模型forward()时,是 通过匹配名称实现的。所以上例中,如果Model的forward函数修改为forward(self, data), 则DataSet中的'x'这个field就应该 改名为'data'。

2 传递给forward()的参数是DataSet中被设置为input的那些field。但如果forward()中没有对应的参数,则不会将数据传递 给forward()。例如,DataSet中'x1', 'x2'都是input,但是模型的函数为forward(self, x1), 那么'x2'不会传递给forward()。

3 模型的forward()返回值需要为一个dict。

1.2 Loss

fastNLP中的为了不限制forward函数的返回内容数量(比如一些复杂任务需要返回多个内容,如Dependency Parsing, LossMetric 都使用了通过名称来匹配相应内容的策略。如上面的例子中

trainer = Trainer(tr_dataset, model, loss=CrossEntropyLoss(target='label'),
           optimizer=SGD(model.parameters(), lr=0.1),n_epochs=1000,
           dev_data = dev_data, metrics=AccuracyMetric(target='label'))

loss被设置为了 CrossEntropyLoss , 但在初始化的时候传入了target='label'这个参数, CrossEntropyLoss 的初始化参数为(pred=None, target=None, padding_idx=-100)。

这里的两个参数分别为计算CrossEntropy时需要使用到的模型的预测值与真实值。 其中 pred 一般来自于模型forward()的返回结果,target 一般是来自于DataSet中被设置为target的field。 由于每个人对真实值或者model的返回值取名并不一样,所以fastNLP的 Loss 提供一种类似于映射的机制来匹配对应的值, 比如这里 CrossEntropyLoss 将尝试找到名为'label'的内容来作为真实值得到loss; 而pred=None, 则 CrossEntropyLoss 使用'pred'作为名称匹配预测值, 正好forward的返回值也叫pred,所以这里不需要申明pred。

尽管fastNLP使用了映射机制来使得loss的计算变得比较灵活,但有些情况下loss必须在模型中进行计算,比如使用了CRF的模型。 fastNLP中提供了 LossInForward 这个loss。 这个loss的原理是直接在forward()的返回结果中找到loss_key(默认寻找'loss')指定的那个tensor,并使用它作为loss。 如果Trainer初始化没有提供loss则默认使用 LossInForward

1.3 Metric

Metric 使用了与上述Loss一样的策略,即使用名称进行匹配。 AccuracyMetric(target='label')的情况与CrossEntropyLoss 是同理的。

在进行验证时,可能用到的计算与forward()中不太一致,没有办法直接从forward()的结果中得到预测值,这时模型可以提供一个predict()方法, 如果提供的模型具有predict方法,则在模型验证时将调用predict()方法获取预测结果, 传入到predict()的参数也是从DataSet中被设置为input的field中选择出来的; 与forward()一样,返回值需要为一个dict。

2. Trainer的代码检查

由于在fastNLP中采取了映射的机制,所以难免可能存在对应出错的情况。Trainer提供一种映射检查机制,可以通过check_code_level来进行控制 比如下面的例子中,由于各种原因产生的报错

Example2.1
import numpy as np
from torch import nn
import torch
from torch.optim import SGD
from fastNLP import Trainer
from fastNLP import DataSet

class Model(nn.Module):
    def __init__(self):
        super().__init__()
        self.fc = nn.Linear(1, 1)
    def forward(self, x, b):
        loss = torch.mean((self.fc(x)-b)**2)
        return {'loss': loss}
model = Model()

dataset = DataSet({'a': np.arange(10), 'b':np.arange(10)*2})
dataset.set_input('a', 'b')

trainer = Trainer(dataset, model, loss=None, optimizer=SGD(model.parameters(), lr=0.001))

trainer = Trainer(dataset, model, SGD(model.parameters()))
#  会报以下的错误
# input fields after batch(if batch size is 2):
#     a: (1)type:torch.Tensor (2)dtype:torch.int64, (3)shape:torch.Size([2])
#     b: (1)type:torch.Tensor (2)dtype:torch.int64, (3)shape:torch.Size([2])
# There is no target field.
# ....
# NameError:
# Problems occurred when calling Model.forward(self, x, b)
#     missing param: ['x']
#     unused field: ['a']
#     Suggestion: You need to provide ['x'] in DataSet and set it as input.

这里就是由于在Trainer初始化的时候,fastNLP会尝试使用一个batch_size=2的batch去运行一遍forward()以及backward()。这里有两类 信息可以为你提供参考

1 'input fields after batch...'这部分显示的是train dataset经过Batch操作后,每个field对应的类型以及进行shape。这里 因为train dataset没有target所以没有显示。根据这里可以看出是否正确将需要的内容设置为了input或target。

2 NameError,NameError发生在映射出错的情况。这里报错的原因是由于尝试进行forward计算时(可以通过Model.forward(self, x, b)判断 出当前是在调取forward),却没有获取到forward()函数中需要的'x';在报错信息中同时指出了缺'x',而'a'没有被使用,那么可能 就是由于field的名称不对。这里将dataset中'a'这个field的名称改为'x',或者model的参数从'x'修改为'a'都可以解决问题。

下面的例子是由于loss计算的时候找不到需要的值

Example2.2
import numpy as np
from torch import nn
from torch.optim import SGD
from fastNLP import Trainer
from fastNLP import DataSet
from fastNLP import L1Loss
import torch

class Model(nn.Module):
    def __init__(self):
        super().__init__()
        self.fc = nn.Linear(1, 1)
    def forward(self, a):
        return {'pred_b': self.fc(a.unsqueeze(1)).squeeze(1), 'No use':1}

model = Model()

dataset = DataSet({'a': np.arange(10, dtype=float), 'b':np.arange(10, dtype=float)*2})

dataset.set_input('a')
dataset.set_target('b')

trainer = Trainer(dataset, model, loss=L1Loss(target='label'), optimizer=SGD(model.parameters(), lr=0.001))
# 报错信息如下
# input fields after batch(if batch size is 2):
#     a: (1)type:torch.Tensor (2)dtype:torch.float32, (3)shape:torch.Size([2])
# target fields after batch(if batch size is 2):
#     b: (1)type:torch.Tensor (2)dtype:torch.float32, (3)shape:torch.Size([2])
# ....
# NameError:
# Problems occurred when calling L1Loss.get_loss(self, pred, target)
#     missing param: ['pred(assign to `pred` in `L1Loss`)', 'label(assign to `target` in `L1Loss`)']
#     unused field: ['b']
#     unused param: ['pred_b', 'No use']
#     target field: ['b']
#     param from Model.forward(self, a): ['pred_b', 'No use']
#     Suggestion: (1). Check key assignment for `target` when initialize L1Loss. Or provide `label` in DataSet or output of Model.forward(self, a).
#             (2). Check key assignment for `pred` when initialize L1Loss. Or provide `pred` in DataSet or output of Model.forward(self, a).

报错信息也包含两部分:

1 第一部分与上面是一样的

2 这里报错的原因是由于计算loss的时候找不到相应的值(通过L1Loss.get_loss(self, pred, target)判断出来的); 报错的原因是因为 predlabel (我们在初始化L1Loss时将target指定为了label)都没有找到。 这里'unused field'是DataSet中出现了,但却没有被设置为input或者target的field; 'unused param'是forward()中返回且没有被使用到的内容;'target field'是被设置为了target的field; 'param from Model.forward(self, a)'是forward()返回的所有key。"Suggestion"是关于当前错误处理的建议。

但是在一些情况下,比如forward()返回值只有一个,target也只有一个,fastNLP不会进行匹配,而直接将forward()的结果作为pred, 将DataSet中的target设置为target。上面的例子在返回值中加入了一个'No use'则只是为了使得Loss去匹配结果。

下面是带有dev dataset时如果出现错误会发生的报错,

Example2.3
import numpy as np
from torch import nn
from torch.optim import SGD
from fastNLP import Trainer
from fastNLP import DataSet
from fastNLP import AccuracyMetric
import torch

class Model(nn.Module):
    def __init__(self):
        super().__init__()
        self.fc = nn.Linear(1, 1)
    def forward(self, a, b):
        loss = torch.mean((self.fc(a.float().unsqueeze(1))-b.float())**2)
        return {'loss': loss}
    def predict(self, a):  # 使用predict()进行验证
        return {'output':self.fc(a.float().unsqueeze(1))} #这里return的值不包含'pred'这个key
model = Model()

dataset = DataSet({'a': np.arange(10), 'b':np.arange(10)*2})
dev_data = DataSet({'a': np.arange(10, 20), 'b':np.arange(10, 20)*2})

dataset.set_input('a', 'b')
dev_data.set_input('a')  # 这里没有设置target

trainer = Trainer(dataset, model, loss=None, optimizer=SGD(model.parameters(), lr=0.001),
                 dev_data=dev_data, metrics=AccuracyMetric())

# 报错信息
# ...
# NameError:
# Problems occurred when calling AccuracyMetric.evaluate(self, pred, target, seq_len=None)
#     missing param: ['pred(assign to `pred` in `AccuracyMetric`)', 'target(assign to `target` in `AccuracyMetric`)']
#     unused param: ['output']
#     target field: []
#     param from Model.predict(self, a): ['output']
#     Suggestion: (1). Check key assignment for `pred` when initialize AccuracyMetric. Or provide `pred` in DataSet or output of Model.predict(self, a).
#             (2). Check key assignment for `target` when initialize AccuracyMetric. Or provide `target` in DataSet or output of Model.predict(self, a).

报错信息和前面都是类似的,但是可以通过'AccuracyMetric.evaluate(self, pred, target, seq_len=None)'看出这里是evaluation 的时候发生了错误。这样避免了需要在完成一整个epoch的训练才能发现evaluation弄错的情况。这里的修改是通过在初始化metric的时候 指明通过'output'获取`pred`, 即AccuracyMetric(pred='output')。

可以通过check_code_level调节检查的强度。默认为0,即进行检查。

3. Trainer与callback

虽然Trainer本身已经集成了一些功能,但仍然不足以囊括训练过程中可能需要到的功能,比如负采样,learning rate decay, Early Stop等。 为了解决这个问题fastNLP引入了callback的机制,Callback 是一种在Trainer训练过程中特定阶段会运行的函数集合, 所有的 Callback 都具有on_*(比如on_train_start, on_backward_begin)等函数。 如果 Callback 实现了该函数,则Trainer运行至对应阶段,会进行调用,例如:

from fastNLP import Callback, EarlyStopCallback, Trainer, CrossEntropyLoss, AccuracyMetric
from fastNLP.models import CNNText

start_time = time.time()

class MyCallback(Callback):
    def on_epoch_end(self):
        print('{:d}ms\n\n'.format(round((time.time()-start_time)*1000)))

model = CNNText((len(vocab),50), num_classes=5, padding=2, dropout=0.1)
trainer = Trainer(model=model, train_data=train_data, dev_data=dev_data, loss=CrossEntropyLoss(),
                  metrics=AccuracyMetric(), callbacks=[MyCallback(),EarlyStopCallback(10)])
trainer.train()

这里,我们通过继承 Callback 类定义了自己的 callback 的,并和内置的 EarlyStopCallback 一起传给了 Trainer ,增强了 Trainer 的功能

fastNLP已经自带了很多callback函数供使用,可以参考 fastNLP.core.callback

class fastNLP.core.trainer.Trainer(train_data, model, optimizer=None, loss=None, batch_size=32, sampler=None, drop_last=False, update_every=1, num_workers=0, n_epochs=10, print_every=5, dev_data=None, metrics=None, metric_key=None, validate_every=-1, save_path=None, use_tqdm=True, device=None, callbacks=None, check_code_level=0, **kwargs)[源代码]

别名 fastNLP.Trainer fastNLP.core.trainer.Trainer

Trainer在fastNLP中用于组织单任务的训练过程,可以避免用户在不同训练任务中重复撰写
  1. epoch循环;
  2. 将数据分成不同的Batch;
  3. 对Batch进行pad;
  4. 每个epoch结束或一定step后进行验证集验证;
  5. 保存获得更好验证性能的模型等。

详细的介绍参见 fastNLP.core.trainer

__init__(train_data, model, optimizer=None, loss=None, batch_size=32, sampler=None, drop_last=False, update_every=1, num_workers=0, n_epochs=10, print_every=5, dev_data=None, metrics=None, metric_key=None, validate_every=-1, save_path=None, use_tqdm=True, device=None, callbacks=None, check_code_level=0, **kwargs)[源代码]
参数:
  • train_data -- 训练集, DataSet 类型或 BatchIter 的子类
  • model (nn.modules) -- 待训练的模型
  • optimizer -- torch.optim.Optimizer 优化器。如果为None,则Trainer使用默认的Adam(model.parameters(), lr=4e-3)这个优化器
  • batch_size (int) -- 训练和验证的时候的batch大小。
  • loss -- 使用的 LossBase 对象。当为None时,默认使用 LossInForward
  • sampler -- Batch数据生成的顺序, Sampler 类型。如果为None,默认使用 RandomSampler
  • drop_last -- 如果最后一个batch没有正好为batch_size这么多数据,就扔掉最后一个batch
  • num_workers -- int, 有多少个线程来进行数据pad处理。
  • update_every -- int, 多少步更新一次梯度。用于希望累计梯度的场景,比如需要128的batch_size, 但是直接设为128 会导致内存不足,通过设置batch_size=32, update_every=4达到目的。当optimizer为None时,该参数无效。
  • n_epochs (int) -- 需要优化迭代多少次。
  • print_every (int) -- 多少次反向传播更新tqdm显示的loss; 如果use_tqdm=False, 则多少次反向传播打印loss。
  • dev_data -- 用于做验证的DataSet, DataSet 类型。
  • metrics -- 验证的评估函数。可以只使用一个 Metric , 也可以使用多个 Metric ,通过列表传入。 如验证时取得了更好的验证结果(如果有多个Metric,以列表中第一个Metric为准),且save_path不为None, 则保存当前模型。Metric种类详见 metrics模块 。仅在传入dev_data时有效。
  • metric_key (str,None) -- Metric 有时会有多个指标, 比如 SpanFPreRecMetric 中包含了'f', 'pre', 'rec'。此时需 要指定以哪个指标为准。另外有些指标是越小效果越好,比如语言模型的困惑度,这种情况下,在key前面增加一个'-'来表 明验证时,值越小越好(比如: "-ppl")。仅在传入dev_data时有效。
  • validate_every (int) -- 多少个step在验证集上验证一次; 如果为-1,则每个epoch结束验证一次。仅在传入dev_data时有效。
  • save_path (str,None) -- 将模型保存路径,如果路径不存在,将自动创建文件夹。如果为None,则不保存模型。如果dev_data为None,则保存 最后一次迭代的模型。保存的时候不仅保存了参数,还保存了模型结构。即便使用DataParallel,这里也只保存模型。
  • use_tqdm (bool) -- 是否使用tqdm来显示训练进度; 如果为False,则将loss打印在终端中。
  • device (str,int,torch.device,list(int)) --

    将模型load到哪个设备。默认为None,即Trainer不对模型 的计算位置进行管理。支持以下的输入:

    1. str: ['cpu', 'cuda', 'cuda:0', 'cuda:1', ...] 依次为'cpu'中, 可见的第一个GPU中, 可见的第一个GPU中, 可见的第二个GPU中;

    1. torch.device:将模型装载到torch.device上。
    2. int: 将使用device_id为该值的gpu进行训练
    3. list(int):如果多于1个device,将使用torch.nn.DataParallel包裹model, 并使用传入的device。
    4. None. 为None则不对模型进行任何处理,如果传入的model为torch.nn.DataParallel该值必须为None。

    已知可能会出现的问题:Adagrad优化器可能无法正常使用这个参数,请手动管理模型位置。

  • callbacks (list(callbacks)) -- 用于在train过程中起调节作用的回调函数。比如early stop,negative sampling等可以 通过callback机制实现。 可使用的callback参见 callback模块
  • check_code_level (int) -- 模型检查等级. -1: 不进行检查; 0: 仅出现错误时停止; 1: 如果有field没有被使用, 报告警告信息; 2: 有任何field没有被使用都报错. 检查的原理是通过使用很小的batch(默认2个sample)来运行代码,但是 这个过程理论上不会修改任何参数,只是会检查能否运行。但如果(1)模型中存在将batch_size写为某个固定值的情况; (2)模型中存在累加前向计算次数的,可能会多计算1次。以上情况建议将check_code_level设置为-1。
is_master

是否是主进程

train(load_best_model=True, on_exception='auto')[源代码]

使用该函数使Trainer开始训练。

参数:
  • load_best_model (bool) -- 该参数只有在初始化提供了dev_data的情况下有效,如果True, trainer将在返回之前重新加载dev表现 最好的模型参数。
  • on_exception (str) -- 在训练过程遭遇exception,并被 :py:class:Callback 的on_exception()处理后,是否继续抛出异常。 支持'ignore','raise', 'auto': 'ignore'将捕获异常,写在Trainer.train()后面的代码将继续运行; 'raise'将异常抛出; 'auto'将ignore以下两种Exception: CallbackException与KeyboardInterrupt, raise其它exception.
Return dict:

返回一个字典类型的数据, 内含以下内容:

seconds: float, 表示训练时长
以下三个内容只有在提供了dev_data的情况下会有。
best_eval: Dict of Dict, 表示evaluation的结果。第一层的key为Metric的名称,
            第二层的key为具体的Metric
best_epoch: int,在第几个epoch取得的最佳值
best_step: int, 在第几个step(batch)更新取得的最佳值
fastNLP.core.utils

utils模块实现了 fastNLP 内部和外部所需的很多工具。其中用户可以使用的是 cache_results() 修饰器。

fastNLP.core.utils.cache_results(_cache_fp, _refresh=False, _verbose=1)[源代码]

别名 fastNLP.cache_results fastNLP.core.utils.cache_results

cache_results是fastNLP中用于cache数据的装饰器。通过下面的例子看一下如何使用:

import time
import numpy as np
from fastNLP import cache_results

@cache_results('cache.pkl')
def process_data():
    # 一些比较耗时的工作,比如读取数据,预处理数据等,这里用time.sleep()代替耗时
    time.sleep(1)
    return np.random.randint(10, size=(5,))

start_time = time.time()
print("res =",process_data())
print(time.time() - start_time)

start_time = time.time()
print("res =",process_data())
print(time.time() - start_time)

# 输出内容如下,可以看到两次结果相同,且第二次几乎没有花费时间
# Save cache to cache.pkl.
# res = [5 4 9 1 8]
# 1.0042750835418701
# Read cache from cache.pkl.
# res = [5 4 9 1 8]
# 0.0040721893310546875

可以看到第二次运行的时候,只用了0.0001s左右,是由于第二次运行将直接从cache.pkl这个文件读取数据,而不会经过再次预处理:

# 还是以上面的例子为例,如果需要重新生成另一个cache,比如另一个数据集的内容,通过如下的方式调用即可
process_data(_cache_fp='cache2.pkl')  # 完全不影响之前的‘cache.pkl'

上面的_cache_fp是cache_results会识别的参数,它将从'cache2.pkl'这里缓存/读取数据,即这里的'cache2.pkl'覆盖默认的 'cache.pkl'。如果在你的函数前面加上了@cache_results()则你的函数会增加三个参数[_cache_fp, _refresh, _verbose]。 上面的例子即为使用_cache_fp的情况,这三个参数不会传入到你的函数中,当然你写的函数参数名也不可能包含这三个名称:

process_data(_cache_fp='cache2.pkl', _refresh=True)  # 这里强制重新生成一份对预处理的cache。
#  _verbose是用于控制输出信息的,如果为0,则不输出任何内容;如果为1,则会提醒当前步骤是读取的cache还是生成了新的cache
参数:
  • _cache_fp (str) -- 将返回结果缓存到什么位置;或从什么位置读取缓存。如果为None,cache_results没有任何效用,除非在 函数调用的时候传入_cache_fp这个参数。
  • _refresh (bool) -- 是否重新生成cache。
  • _verbose (int) -- 是否打印cache的信息。
返回:

fastNLP.core.utils.seq_len_to_mask(seq_len, max_len=None)[源代码]

别名 fastNLP.seq_len_to_mask fastNLP.core.utils.seq_len_to_mask

将一个表示sequence length的一维数组转换为二维的mask,不包含的位置为0。 转变 1-d seq_len到2-d mask.

参数:
  • seq_len (np.ndarray,torch.LongTensor) -- shape将是(B,)
  • max_len (int) -- 将长度pad到这个长度。默认(None)使用的是seq_len中最长的长度。但在nn.DataParallel的场景下可能不同卡的seq_len会有 区别,所以需要传入一个max_len使得mask的长度是pad到该长度。
返回:

np.ndarray, torch.Tensor 。shape将是(B, max_length), 元素类似为bool或torch.uint8

fastNLP.core.utils.get_seq_len(words, pad_value=0)[源代码]

别名 fastNLP.get_seq_len fastNLP.core.utils.get_seq_len

给定batch_size x max_len的words矩阵,返回句子长度

参数:words -- batch_size x max_len
返回:(batch_size,)
fastNLP.core.vocabulary
class fastNLP.core.vocabulary.Vocabulary(max_size=None, min_freq=None, padding='<pad>', unknown='<unk>')[源代码]

别名 fastNLP.Vocabulary fastNLP.core.vocabulary.Vocabulary

用于构建, 存储和使用 strint 的一一映射:

vocab = Vocabulary()
word_list = "this is a word list".split()
vocab.update(word_list)
vocab["word"] # str to int
vocab.to_word(5) # int to str
__init__(max_size=None, min_freq=None, padding='<pad>', unknown='<unk>')[源代码]
参数:
  • max_size (int) -- Vocabulary 的最大大小, 即能存储词的最大数量 若为 None , 则不限制大小. Default: None
  • min_freq (int) -- 能被记录下的词在文本中的最小出现频率, 应大于或等于 1. 若小于该频率, 词语将被视为 unknown. 若为 None , 所有文本中的词都被记录. Default: None
  • optional padding (str) -- padding的字符. 如果设置为 None , 则vocabulary中不考虑padding, 也不计入词表大小,为 None 的情况多在为label建立Vocabulary的情况. Default: '<pad>'
  • optional unknown (str) -- unknown的字符,所有未被记录的词在转为 int 时将被视为unknown. 如果设置为 None ,则vocabulary中不考虑unknow, 也不计入词表大小. 为 None 的情况多在为label建立Vocabulary的情况. Default: '<unk>'
add(word, no_create_entry=False)[源代码]

增加一个新词在词典中的出现频率

参数:
  • word (str) -- 新词
  • no_create_entry (bool) -- 在使用fastNLP.TokenEmbedding加载预训练模型时,没有从预训练词表中找到这个词的处理方式。 如果为True,则不会有这个词语创建一个单独的entry,它将一直被指向unk的表示; 如果为False,则为这个词创建一个单独 的entry。如果这个word来自于dev或者test,一般设置为True,如果来自与train一般设置为False。以下两种情况: 如果新 加入一个word,且no_create_entry为True,但这个词之前已经在Vocabulary中且并不是no_create_entry的,则还是会为这 个词创建一个单独的vector; 如果no_create_entry为False,但这个词之前已经在Vocabulary中且并不是no_create_entry的, 则这个词将认为是需要创建单独的vector的。
add_word(word, no_create_entry=False)[源代码]

增加一个新词在词典中的出现频率

参数:
  • word (str) -- 新词
  • no_create_entry (bool) -- 在使用fastNLP.TokenEmbedding加载预训练模型时,没有从预训练词表中找到这个词的处理方式。 如果为True,则不会有这个词语创建一个单独的entry,它将一直被指向unk的表示; 如果为False,则为这个词创建一个单独 的entry。如果这个word来自于dev或者test,一般设置为True,如果来自与train一般设置为False。以下两种情况: 如果新 加入一个word,且no_create_entry为True,但这个词之前已经在Vocabulary中且并不是no_create_entry的,则还是会为这 个词创建一个单独的vector; 如果no_create_entry为False,但这个词之前已经在Vocabulary中且并不是no_create_entry的, 则这个词将认为是需要创建单独的vector的。
add_word_lst(word_lst, no_create_entry=False)[源代码]

依次增加序列中词在词典中的出现频率

参数:
  • word_lst (list[str]) -- 词的序列
  • no_create_entry (bool) -- 在使用fastNLP.TokenEmbedding加载预训练模型时,没有从预训练词表中找到这个词的处理方式。 如果为True,则不会有这个词语创建一个单独的entry,它将一直被指向unk的表示; 如果为False,则为这个词创建一个单独 的entry。如果这个word来自于dev或者test,一般设置为True,如果来自与train一般设置为False。以下两种情况: 如果新 加入一个word,且no_create_entry为True,但这个词之前已经在Vocabulary中且并不是no_create_entry的,则还是会为这 个词创建一个单独的vector; 如果no_create_entry为False,但这个词之前已经在Vocabulary中且并不是no_create_entry的, 则这个词将认为是需要创建单独的vector的。
build_reverse_vocab()[源代码]

基于 word to index dict, 构建 index to word dict.

build_vocab()[源代码]

根据已经出现的词和出现频率构建词典. 注意: 重复构建可能会改变词典的大小, 但已经记录在词典中的词, 不会改变对应的 int

clear()[源代码]

删除Vocabulary中的词表数据。相当于重新初始化一下。

返回:
from_dataset(*datasets, field_name, no_create_entry_dataset=None)[源代码]

使用dataset的对应field中词构建词典:

# remember to use `field_name`
vocab.from_dataset(train_data1, train_data2, field_name='words')
参数:
  • datasets (DataSet,List[DataSet]) -- 需要转index的一个或多个数据集
  • field_name (str,List[str]) -- 可为 strList[str] . 构建词典所使用的 field(s), 支持一个或多个field,若有多个 DataSet, 每个DataSet都必须有这些field. 目前支持的field结构 : str , List[str]
  • no_create_entry_dataset -- 可以传入DataSet, List[DataSet]或者None(默认),该选项用在接下来的模型会使用pretrain 的embedding(包括glove, word2vec, elmo与bert)且会finetune的情况。如果仅使用来自于train的数据建立vocabulary,会导致test与dev 中的数据无法充分利用到来自于预训练embedding的信息,所以在建立词表的时候将test与dev考虑进来会使得最终的结果更好。 如果一个词出现在了train中,但是没在预训练模型中,embedding会为它用unk初始化,但它是单独的一个vector,如果 finetune embedding的话,这个词在更新之后可能会有更好的表示; 而如果这个词仅出现在了dev或test中,那么就不能为它们单独建立vector, 而应该让它指向unk这个vector的值。所以只位于no_create_entry_dataset中的token,将首先从预训练的词表中寻找它的表示, 如果找到了,就使用该表示; 如果没有找到,则认为该词的表示应该为unk的表示。
Return self:
has_word(w)[源代码]

检查词是否被记录:

has_abc = vocab.has_word('abc')
# equals to
has_abc = 'abc' in vocab
参数:item -- the word
返回:True or False
index_dataset(*datasets, field_name, new_field_name=None)[源代码]

将DataSet中对应field的词转为数字,Example:

# remember to use `field_name`
vocab.index_dataset(train_data, dev_data, test_data, field_name='words')
参数:
  • datasets (DataSet,List[DataSet]) -- 需要转index的一个或多个数据集
  • field_name (list,str) -- 需要转index的field, 若有多个 DataSet, 每个DataSet都必须有此 field. 目前支持 str , List[str]
  • new_field_name (list,str) -- 保存结果的field_name. 若为 None , 将覆盖原field. Default: None.
static load(filepath)[源代码]
参数:filepath (str) -- Vocabulary的读取路径
返回:Vocabulary
padding_idx

padding 对应的数字

save(filepath)[源代码]
参数:filepath (str) -- Vocabulary的储存路径
返回:
to_index(w)[源代码]

将词转为数字. 若词不再词典中被记录, 将视为 unknown, 若 unknown=None , 将抛出 ValueError

index = vocab.to_index('abc')
# equals to
index = vocab['abc']
参数:w (str) -- a word
Return int index:
 the number
to_word(idx)[源代码]

给定一个数字, 将其转为对应的词.

参数:idx (int) -- the index
Return str word:
 the word
unknown_idx

unknown 对应的数字.

update(word_lst, no_create_entry=False)[源代码]

依次增加序列中词在词典中的出现频率

参数:
  • word_lst (list) -- a list of strings
  • no_create_entry (bool) -- 在使用fastNLP.TokenEmbedding加载预训练模型时,没有从预训练词表中找到这个词的处理方式。 如果为True,则不会有这个词语创建一个单独的entry,它将一直被指向unk的表示; 如果为False,则为这个词创建一个单独 的entry。如果这个word来自于dev或者test,一般设置为True,如果来自与train一般设置为False。以下两种情况: 如果新 加入一个word,且no_create_entry为True,但这个词之前已经在Vocabulary中且并不是no_create_entry的,则还是会为这 个词创建一个单独的vector; 如果no_create_entry为False,但这个词之前已经在Vocabulary中且并不是no_create_entry的, 则这个词将认为是需要创建单独的vector的。
fastNLP.embeddings

embeddings 模块主要用于从各种预训练的模型中获取词语的分布式表示,目前支持的预训练模型包括word2vec, glove, ELMO, BERT等。这里所有 embedding的forward输入都是形状为 (batch_size, max_len) 的torch.LongTensor,输出都是 (batch_size, max_len, embedding_dim) 的 torch.FloatTensor。所有的embedding都可以使用 self.num_embedding 获取最大的输入index范围, 用 self.embeddig_dimself.embed_size 获取embedding的 输出维度。

class fastNLP.embeddings.Embedding(init_embed, word_dropout=0, dropout=0.0, unk_index=None)[源代码]

别名 fastNLP.embeddings.Embedding fastNLP.embeddings.embedding.Embedding

词向量嵌入,支持输入多种方式初始化. 可以通过self.num_embeddings获取词表大小; self.embedding_dim获取embedding的维度.

Example:

>>> import numpy as np
>>> from fastNLP.embeddings import Embedding
>>> init_embed = (2000, 100)
>>> embed = Embedding(init_embed)  # 随机初始化一个具有2000个词,每个词表示为100维的词向量
>>> init_embed = np.zeros((2000, 100))
>>> embed = Embedding(init_embed)  # 使用numpy.ndarray的值作为初始化值初始化一个Embedding
__init__(init_embed, word_dropout=0, dropout=0.0, unk_index=None)[源代码]
参数:
  • init_embed (tuple(int,int),torch.FloatTensor,nn.Embedding,numpy.ndarray) -- 支持传入Embedding的大小(传入tuple(int, int), 第一个int为vocab_zie, 第二个int为embed_dim); 或传入Tensor, Embedding, numpy.ndarray等则直接使用该值初始化Embedding;
  • word_dropout (float) -- 按照一定概率随机将word设置为unk_index,这样可以使得unk这个token得到足够的训练, 且会对网络有 一定的regularize的作用。设置该值时,必须同时设置unk_index
  • dropout (float) -- 对Embedding的输出的dropout。
  • unk_index (int) -- drop word时替换为的index。fastNLP的Vocabulary的unk_index默认为1。
forward(words)[源代码]
参数:words (torch.LongTensor) -- [batch, seq_len]
返回:torch.Tensor : [batch, seq_len, embed_dim]
requires_grad

Embedding的参数是否允许优化。True: 所有参数运行优化; False: 所有参数不允许优化; None: 部分允许优化、部分不允许 :return:

class fastNLP.embeddings.TokenEmbedding(vocab, word_dropout=0.0, dropout=0.0)[源代码]

别名 fastNLP.embeddings.TokenEmbedding fastNLP.embeddings.embedding.TokenEmbedding

fastNLP中各种Embedding的基类

drop_word(words)[源代码]

按照设定随机将words设置为unknown_index。

参数:words (torch.LongTensor) -- batch_size x max_len
返回:
dropout(words)[源代码]

对embedding后的word表示进行drop。

参数:words (torch.FloatTensor) -- batch_size x max_len x embed_size
返回:
get_word_vocab()[源代码]

返回embedding的词典。

返回:Vocabulary
num_embedding

这个值可能会大于实际的embedding矩阵的大小。 :return:

requires_grad

Embedding的参数是否允许优化。True: 所有参数运行优化; False: 所有参数不允许优化; None: 部分允许优化、部分不允许 :return:

class fastNLP.embeddings.StaticEmbedding(vocab: fastNLP.core.vocabulary.Vocabulary, model_dir_or_name: str = 'en', embedding_dim=-1, requires_grad: bool = True, init_method=None, lower=False, dropout=0, word_dropout=0, normalize=False, min_freq=1, **kwargs)[源代码]

基类 fastNLP.embeddings.TokenEmbedding

别名 fastNLP.embeddings.StaticEmbedding fastNLP.embeddings.static_embedding.StaticEmbedding

StaticEmbedding组件. 给定预训练embedding的名称或路径,根据vocab从embedding中抽取相应的数据(只会将出现在vocab中的词抽取出来, 如果没有找到,则会随机初始化一个值(但如果该word是被标记为no_create_entry的话,则不会单独创建一个值,而是会被指向unk的index))。 当前支持自动下载的预训练vector有:

en: 实际为en-glove-840b-300d(常用)
en-glove-6b-50d: glove官方的50d向量
en-glove-6b-100d: glove官方的100d向量
en-glove-6b-200d: glove官方的200d向量
en-glove-6b-300d: glove官方的300d向量
en-glove-42b-300d: glove官方使用42B数据训练版本
en-glove-840b-300d:
en-glove-twitter-27b-25d:
en-glove-twitter-27b-50d:
en-glove-twitter-27b-100d:
en-glove-twitter-27b-200d:
en-word2vec-300d: word2vec官方发布的300d向量
en-fasttext-crawl: fasttext官方发布的300d英文预训练
cn-char-fastnlp-100d: fastNLP训练的100d的character embedding
cn-bi-fastnlp-100d: fastNLP训练的100d的bigram embedding
cn-tri-fastnlp-100d: fastNLP训练的100d的trigram embedding
cn-fasttext: fasttext官方发布的300d中文预训练embedding

Example:

>>> from fastNLP import Vocabulary
>>> from fastNLP.embeddings import StaticEmbedding
>>> vocab = Vocabulary().add_word_lst("The whether is good .".split())
>>> embed = StaticEmbedding(vocab, model_dir_or_name='en-glove-50d')

>>> vocab = Vocabulary().add_word_lst(["The", 'the', "THE"])
>>> embed = StaticEmbedding(vocab, model_dir_or_name="en-glove-50d", lower=True)
>>> # "the", "The", "THE"它们共用一个vector,且将使用"the"在预训练词表中寻找它们的初始化表示。

>>> vocab = Vocabulary().add_word_lst(["The", "the", "THE"])
>>> embed = StaticEmbedding(vocab, model_dir_or_name=None, embedding_dim=5, lower=True)
>>> words = torch.LongTensor([[vocab.to_index(word) for word in ["The", "the", "THE"]]])
>>> embed(words)
>>> tensor([[[ 0.5773,  0.7251, -0.3104,  0.0777,  0.4849],
             [ 0.5773,  0.7251, -0.3104,  0.0777,  0.4849],
             [ 0.5773,  0.7251, -0.3104,  0.0777,  0.4849]]],
           grad_fn=<EmbeddingBackward>)  # 每种word的输出是一致的。
__init__(vocab: fastNLP.core.vocabulary.Vocabulary, model_dir_or_name: str = 'en', embedding_dim=-1, requires_grad: bool = True, init_method=None, lower=False, dropout=0, word_dropout=0, normalize=False, min_freq=1, **kwargs)[源代码]
参数:
  • vocab -- Vocabulary. 若该项为None则会读取所有的embedding。
  • model_dir_or_name -- 可以有两种方式调用预训练好的static embedding:第一种是传入embedding文件夹(文件夹下应该只有一个 以.txt作为后缀的文件)或文件路径;第二种是传入embedding的名称,第二种情况将自动查看缓存中是否存在该模型,没有的话将自动下载。 如果输入为None则使用embedding_dim的维度随机初始化一个embedding。
  • embedding_dim (int) -- 随机初始化的embedding的维度,当该值为大于0的值时,将忽略model_dir_or_name。
  • requires_grad (bool) -- 是否需要gradient. 默认为True
  • init_method (callable) -- 如何初始化没有找到的值。可以使用torch.nn.init.*中各种方法, 传入的方法应该接受一个tensor,并 inplace地修改其值。
  • lower (bool) -- 是否将vocab中的词语小写后再和预训练的词表进行匹配。如果你的词表中包含大写的词语,或者就是需要单独 为大写的词语开辟一个vector表示,则将lower设置为False。
  • dropout (float) -- 以多大的概率对embedding的表示进行Dropout。0.1即随机将10%的值置为0。
  • word_dropout (float) -- 以多大的概率将一个词替换为unk。这样既可以训练unk也是一定的regularize。
  • normalize (bool) -- 是否对vector进行normalize,使得每个vector的norm为1。
  • min_freq (int) -- Vocabulary词频数小于这个数量的word将被指向unk。
  • kwargs (dict) -- bool only_train_min_freq: 仅对train中的词语使用min_freq筛选; bool only_norm_found_vector: 是否仅对在预训练中找到的词语使用normalize; bool only_use_pretrain_word: 仅使用出现在pretrain词表中的词,如果该词没有在预训练的词表中出现则为unk。如果embedding不需要更新建议设置为True。
forward(words)[源代码]

传入words的index

参数:words -- torch.LongTensor, [batch_size, max_len]
返回:torch.FloatTensor, [batch_size, max_len, embed_size]
class fastNLP.embeddings.ElmoEmbedding(vocab: fastNLP.core.vocabulary.Vocabulary, model_dir_or_name: str = 'en', layers: str = '2', requires_grad: bool = True, word_dropout=0.0, dropout=0.0, cache_word_reprs: bool = False)[源代码]

基类 fastNLP.embeddings.ContextualEmbedding

别名 fastNLP.embeddings.ElmoEmbedding fastNLP.embeddings.elmo_embedding.ElmoEmbedding

使用ELMo的embedding。初始化之后,只需要传入words就可以得到对应的embedding。 当前支持的使用名称初始化的模型:

en: 即en-medium hidden_size 1024; output_size 12
en-medium: hidden_size 2048; output_size 256
en-origial: hidden_size 4096; output_size 512
en-original-5.5b: hidden_size 4096; output_size 512
en-small: hidden_size 1024; output_size 128

Example:

>>> import torch
>>> from fastNLP import Vocabulary
>>> from fastNLP.embeddings import ElmoEmbedding
>>> vocab = Vocabulary().add_word_lst("The whether is good .".split())
>>> # 使用不同层的concat的结果
>>> embed = ElmoEmbedding(vocab, model_dir_or_name='en', layers='1,2', requires_grad=False)
>>> words = torch.LongTensor([[vocab.to_index(word) for word in "The whether is good .".split()]])
>>> outputs = embed(words)
>>> outputs.size()
>>> # torch.Size([1, 5, 2048])

>>> # 使用不同层的weighted sum。
>>> embed = ElmoEmbedding(vocab, model_dir_or_name='en', layers='mix', requires_grad=False)
>>> embed.set_mix_weights_requires_grad()  # 使得weighted的权重是可以学习的,但ELMO的LSTM部分是不更新
__init__(vocab: fastNLP.core.vocabulary.Vocabulary, model_dir_or_name: str = 'en', layers: str = '2', requires_grad: bool = True, word_dropout=0.0, dropout=0.0, cache_word_reprs: bool = False)[源代码]
参数:
  • vocab -- 词表
  • model_dir_or_name -- 可以有两种方式调用预训练好的ELMo embedding:第一种是传入ELMo所在文件夹,该文件夹下面应该有两个文件, 其中一个是以json为后缀的配置文件,另一个是以pkl为后缀的权重文件;第二种是传入ELMo版本的名称,将自动查看缓存中是否存在该模型, 没有的话将自动下载并缓存。
  • layers -- str, 指定返回的层数(从0开始), 以,隔开不同的层。如果要返回第二层的结果'2', 返回后两层的结果'1,2'。不同的层的结果 按照这个顺序concat起来,默认为'2'。'mix'会使用可学习的权重结合不同层的表示(权重是否可训练与requires_grad保持一致, 初始化权重对三层结果进行mean-pooling, 可以通过ElmoEmbedding.set_mix_weights_requires_grad()方法只将mix weights设置为可学习。)
  • requires_grad -- bool, 该层是否需要gradient, 默认为False.
  • word_dropout (float) -- 以多大的概率将一个词替换为unk。这样既可以训练unk也是一定的regularize。
  • dropout (float) -- 以多大的概率对embedding的表示进行Dropout。0.1即随机将10%的值置为0。
  • cache_word_reprs -- 可以选择对word的表示进行cache; 设置为True的话,将在初始化的时候为每个word生成对应的embedding, 并删除character encoder,之后将直接使用cache的embedding。默认为False。
forward(words: torch.LongTensor)[源代码]

计算words的elmo embedding表示。根据elmo文章中介绍的ELMO实际上是有2L+1层结果,但是为了让结果比较容易拆分,token的 被重复了一次,使得实际上layer=0的结果是[token_embedding;token_embedding], 而layer=1的结果是[forward_hiddens; backward_hiddens].

参数:words -- batch_size x max_len
返回:torch.FloatTensor. batch_size x max_len x (512*len(self.layers))
set_mix_weights_requires_grad(flag=True)[源代码]

当初始化ElmoEmbedding时layers被设置为mix时,可以通过调用该方法设置mix weights是否可训练。如果layers不是mix,调用 该方法没有用。

参数:flag (bool) -- 混合不同层表示的结果是否可以训练。
返回:
class fastNLP.embeddings.BertEmbedding(vocab: fastNLP.core.vocabulary.Vocabulary, model_dir_or_name: str = 'en-base-uncased', layers: str = '-1', pool_method: str = 'first', word_dropout=0, dropout=0, include_cls_sep: bool = False, pooled_cls=True, requires_grad: bool = True, auto_truncate: bool = False, **kwargs)[源代码]

基类 fastNLP.embeddings.ContextualEmbedding

别名 fastNLP.embeddings.BertEmbedding fastNLP.embeddings.bert_embedding.BertEmbedding

使用BERT对words进行编码的Embedding。建议将输入的words长度限制在430以内,而不要使用512(根据预训练模型参数,可能有变化)。这是由于 预训练的bert模型长度限制为512个token,而因为输入的word是未进行word piece分割的(word piece的分割有BertEmbedding在输入word 时切分),在分割之后长度可能会超过最大长度限制。

BertEmbedding可以支持自动下载权重,当前支持的模型:
en: base-cased en-base-uncased: en-large-cased-wwm: en-large-cased: en-large-uncased: en-large-uncased-wwm cn: 中文BERT wwm by HIT cn-base: 中文BERT base-chinese cn-wwm-ext: 中文BERT wwm by HIT with extra data pretrain. multi-base-cased: multilingual cased multi-base-uncased: multilingual uncased

Example:

>>> import torch
>>> from fastNLP import Vocabulary
>>> from fastNLP.embeddings import BertEmbedding
>>> vocab = Vocabulary().add_word_lst("The whether is good .".split())
>>> embed = BertEmbedding(vocab, model_dir_or_name='en-base-uncased', requires_grad=False, layers='4,-2,-1')
>>> words = torch.LongTensor([[vocab.to_index(word) for word in "The whether is good .".split()]])
>>> outputs = embed(words)
>>> outputs.size()
>>> # torch.Size([1, 5, 2304])
__init__(vocab: fastNLP.core.vocabulary.Vocabulary, model_dir_or_name: str = 'en-base-uncased', layers: str = '-1', pool_method: str = 'first', word_dropout=0, dropout=0, include_cls_sep: bool = False, pooled_cls=True, requires_grad: bool = True, auto_truncate: bool = False, **kwargs)[源代码]
参数:
  • vocab (Vocabulary) -- 词表
  • model_dir_or_name (str) -- 模型所在目录或者模型的名称。当传入模型所在目录时,目录中应该包含一个词表文件(以.txt作为后缀名), 权重文件(以.bin作为文件后缀名), 配置文件(以.json作为后缀名)。
  • layers (str) -- 输出embedding表示来自于哪些层,不同层的结果按照layers中的顺序在最后一维concat起来。以','隔开层数,层的序号是 从0开始,可以以负数去索引倒数几层。 layer=0为embedding层(包括wordpiece embedding, position embedding和segment embedding)
  • pool_method (str) -- 因为在bert中,每个word会被表示为多个word pieces, 当获取一个word的表示的时候,怎样从它的word pieces 中计算得到它对应的表示。支持 last , first , avg , max
  • word_dropout (float) -- 以多大的概率将一个词替换为unk。这样既可以训练unk也是一定的regularize。
  • dropout (float) -- 以多大的概率对embedding的表示进行Dropout。0.1即随机将10%的值置为0。
  • include_cls_sep (bool) -- bool,在bert计算句子的表示的时候,需要在前面加上[CLS]和[SEP], 是否在结果中保留这两个内容。 这样 会使得word embedding的结果比输入的结果长两个token。如果该值为True,则在使用 :class::StackEmbedding 可能会与其它类型的 embedding长度不匹配。
  • pooled_cls (bool) -- 返回的[CLS]是否使用预训练中的BertPool映射一下,仅在include_cls_sep时有效。如果下游任务只取[CLS]做预测, 一般该值为True。
  • requires_grad (bool) -- 是否需要gradient以更新Bert的权重。
  • auto_truncate (bool) -- 当句子words拆分为word pieces长度超过bert最大允许长度(一般为512), 自动截掉拆分后的超过510个 word pieces后的内容,并将第512个word piece置为[SEP]。超过长度的部分的encode结果直接全部置零。一般仅有只使用[CLS] 来进行分类的任务将auto_truncate置为True。
  • kwargs --
    bool only_use_pretrain_bpe: 仅使用出现在pretrain词表中的bpe,如果该词没法tokenize则使用unk。如果embedding不需要更新
    建议设置为True。

    int min_freq: 仅在only_use_pretrain_bpe为False有效,大于等于该次数的词会被新加入BERT的BPE词表中 bool truncate_embed: 是否仅保留用到的bpe(这样会减内存占用和加快速度)

drop_word(words)[源代码]

按照设定随机将words设置为unknown_index。

参数:words (torch.LongTensor) -- batch_size x max_len
返回:
forward(words)[源代码]
计算words的bert embedding表示。计算之前会在每句话的开始增加[CLS]在结束增加[SEP], 并根据include_cls_sep判断要不要
删除这两个token的表示。
参数:words (torch.LongTensor) -- [batch_size, max_len]
返回:torch.FloatTensor. batch_size x max_len x (768*len(self.layers))
class fastNLP.embeddings.BertWordPieceEncoder(model_dir_or_name: str = 'en-base-uncased', layers: str = '-1', pooled_cls: bool = False, word_dropout=0, dropout=0, requires_grad: bool = True)[源代码]

别名 fastNLP.embeddings.BertWordPieceEncoder fastNLP.embeddings.bert_embedding.BertWordPieceEncoder

读取bert模型,读取之后调用index_dataset方法在dataset中生成word_pieces这一列。

BertWordPieceEncoder可以支持自动下载权重,当前支持的模型:
en: base-cased en-large-cased-wwm: en-large-cased: en-large-uncased: en-large-uncased-wwm cn: 中文BERT wwm by HIT cn-base: 中文BERT base-chinese cn-wwm-ext: 中文BERT wwm by HIT with extra data pretrain. multi-base-cased: multilingual cased multi-base-uncased: multilingual uncased
__init__(model_dir_or_name: str = 'en-base-uncased', layers: str = '-1', pooled_cls: bool = False, word_dropout=0, dropout=0, requires_grad: bool = True)[源代码]
参数:
  • model_dir_or_name (str) -- 模型所在目录或者模型的名称。默认值为 en-base-uncased
  • layers (str) -- 最终结果中的表示。以','隔开层数,可以以负数去索引倒数几层。layer=0为embedding层(包括wordpiece embedding, position embedding和segment embedding)
  • pooled_cls (bool) -- 返回的句子开头的[CLS]是否使用预训练中的BertPool映射一下。如果下游任务取[CLS]做预测,一般该值为True。
  • word_dropout (float) -- 以多大的概率将一个词替换为unk。这样既可以训练unk也是一定的regularize。
  • dropout (float) -- 以多大的概率对embedding的表示进行Dropout。0.1即随机将10%的值置为0。
  • requires_grad (bool) -- 是否需要gradient。
drop_word(words)[源代码]

按照设定随机将words设置为unknown_index。

参数:words (torch.LongTensor) -- batch_size x max_len
返回:
forward(word_pieces, token_type_ids=None)[源代码]

计算words的bert embedding表示。传入的words中应该自行包含[CLS]与[SEP]的tag。

参数:
  • words -- batch_size x max_len
  • token_type_ids -- batch_size x max_len, 用于区分前一句和后一句话. 如果不传入,则自动生成(大部分情况,都不需要输入), 第一个[SEP]及之前为0, 第二个[SEP]及到第一个[SEP]之间为1; 第三个[SEP]及到第二个[SEP]之间为0,依次往后推。
返回:

torch.FloatTensor. batch_size x max_len x (768*len(self.layers))

index_datasets(*datasets, field_name, add_cls_sep=True)[源代码]

使用bert的tokenizer新生成word_pieces列加入到datasets中,并将他们设置为input,且将word_pieces这一列的pad value设置为了 bert的pad value。

参数:
  • datasets (DataSet) -- DataSet对象
  • field_name (str) -- 基于哪一列的内容生成word_pieces列。这一列中每个数据应该是List[str]的形式。
  • add_cls_sep (bool) -- 如果首尾不是[CLS]与[SEP]会在首尾额外加入[CLS]与[SEP]。
返回:

class fastNLP.embeddings.StackEmbedding(embeds: List[fastNLP.embeddings.embedding.TokenEmbedding], word_dropout=0, dropout=0)[源代码]

基类 fastNLP.embeddings.TokenEmbedding

别名 fastNLP.embeddings.StackEmbedding fastNLP.embeddings.stack_embedding.StackEmbedding

支持将多个embedding集合成一个embedding。

Example:

>>> from fastNLP import Vocabulary
>>> from fastNLP.embeddings import StaticEmbedding, StackEmbedding
>>> vocab =  Vocabulary().add_word_lst("The whether is good .".split())
>>> embed_1 = StaticEmbedding(vocab, model_dir_or_name='en-glove-6b-50d', requires_grad=True)
>>> embed_2 = StaticEmbedding(vocab, model_dir_or_name='en-word2vec-300', requires_grad=True)
>>> embed = StackEmbedding([embed_1, embed_2])
__init__(embeds: List[fastNLP.embeddings.embedding.TokenEmbedding], word_dropout=0, dropout=0)[源代码]
参数:
  • embeds -- 一个由若干个TokenEmbedding组成的list,要求每一个TokenEmbedding的词表都保持一致
  • word_dropout (float) -- 以多大的概率将一个词替换为unk。这样既可以训练unk也是一定的regularize。不同embedidng会在相同的位置 被设置为unknown。如果这里设置了dropout,则组成的embedding就不要再设置dropout了。
  • dropout (float) -- 以多大的概率对embedding的表示进行Dropout。0.1即随机将10%的值置为0。
append(embed: fastNLP.embeddings.embedding.TokenEmbedding)[源代码]

添加一个embedding到结尾。 :param embed: :return:

embed_size

该Embedding输出的vector的最后一维的维度。 :return:

forward(words)[源代码]

得到多个embedding的结果,并把结果按照顺序concat起来。

参数:words -- batch_size x max_len
返回:返回的shape和当前这个stack embedding中embedding的组成有关
pop()[源代码]

弹出最后一个embed :return:

class fastNLP.embeddings.LSTMCharEmbedding(vocab: fastNLP.core.vocabulary.Vocabulary, embed_size: int = 50, char_emb_size: int = 50, word_dropout: float = 0, dropout: float = 0, hidden_size=50, pool_method: str = 'max', activation='relu', min_char_freq: int = 2, bidirectional=True, pre_train_char_embed: str = None, requires_grad: bool = True, include_word_start_end: bool = True)[源代码]

基类 fastNLP.embeddings.TokenEmbedding

别名 fastNLP.embeddings.LSTMCharEmbedding fastNLP.embeddings.char_embedding.LSTMCharEmbedding

使用LSTM的方式对character进行encode. embed(x) -> Dropout(x) -> LSTM(x) -> activation(x) -> pool -> Dropout

Example:

>>> import torch
>>> from fastNLP import Vocabulary
>>> from fastNLP.embeddings import LSTMCharEmbedding
>>> vocab = Vocabulary().add_word_lst("The whether is good .".split())
>>> embed = LSTMCharEmbedding(vocab, embed_size=50)
>>> words = torch.LongTensor([[vocab.to_index(word) for word in "The whether is good .".split()]])
>>> outputs = embed(words)
>>> outputs.size()
>>> # torch.Size([1, 5,50])
__init__(vocab: fastNLP.core.vocabulary.Vocabulary, embed_size: int = 50, char_emb_size: int = 50, word_dropout: float = 0, dropout: float = 0, hidden_size=50, pool_method: str = 'max', activation='relu', min_char_freq: int = 2, bidirectional=True, pre_train_char_embed: str = None, requires_grad: bool = True, include_word_start_end: bool = True)[源代码]
参数:
  • vocab -- 词表
  • embed_size -- LSTMCharEmbedding的输出维度。默认值为50.
  • char_emb_size -- character的embedding的维度。默认值为50.
  • word_dropout (float) -- 以多大的概率将一个词替换为unk。这样既可以训练unk也是一定的regularize。
  • dropout -- 以多大概率drop character embedding的输出以及最终的word的输出。
  • hidden_size -- LSTM的中间hidden的大小,如果为bidirectional的,hidden会除二,默认为50.
  • pool_method -- 支持'max', 'avg'。
  • activation -- 激活函数,支持'relu', 'sigmoid', 'tanh', 或者自定义函数.
  • min_char_freq -- character的最小出现次数。默认值为2.
  • bidirectional -- 是否使用双向的LSTM进行encode。默认值为True。
  • pre_train_char_embed -- 可以有两种方式调用预训练好的character embedding:第一种是传入embedding文件夹 (文件夹下应该只有一个以.txt作为后缀的文件)或文件路径;第二种是传入embedding的名称,第二种情况将自动查看缓存中是否存在该模型, 没有的话将自动下载。如果输入为None则使用embedding_dim的维度随机初始化一个embedding.
  • requires_grad -- 是否更新权重
  • include_word_start_end -- 是否在每个word开始的character前和结束的character增加特殊标示符号;
forward(words)[源代码]

输入words的index后,生成对应的words的表示。

参数:words -- [batch_size, max_len]
返回:[batch_size, max_len, embed_size]
class fastNLP.embeddings.CNNCharEmbedding(vocab: fastNLP.core.vocabulary.Vocabulary, embed_size: int = 50, char_emb_size: int = 50, word_dropout: float = 0, dropout: float = 0, filter_nums: List[int] = (40, 30, 20), kernel_sizes: List[int] = (5, 3, 1), pool_method: str = 'max', activation='relu', min_char_freq: int = 2, pre_train_char_embed: str = None, requires_grad: bool = True, include_word_start_end: bool = True)[源代码]

基类 fastNLP.embeddings.TokenEmbedding

别名 fastNLP.embeddings.CNNCharEmbedding fastNLP.embeddings.char_embedding.CNNCharEmbedding

使用CNN生成character embedding。CNN的结构为, embed(x) -> Dropout(x) -> CNN(x) -> activation(x) -> pool -> fc -> Dropout. 不同的kernel大小的fitler结果是concat起来然后通过一层fully connected layer, 然后输出word的表示。

Example:

>>> import torch
>>> from fastNLP import Vocabulary
>>> from fastNLP.embeddings import CNNCharEmbedding
>>> vocab = Vocabulary().add_word_lst("The whether is good .".split())
>>> embed = CNNCharEmbedding(vocab, embed_size=50)
>>> words = torch.LongTensor([[vocab.to_index(word) for word in "The whether is good .".split()]])
>>> outputs = embed(words)
>>> outputs.size()
>>> # torch.Size([1, 5,50])
__init__(vocab: fastNLP.core.vocabulary.Vocabulary, embed_size: int = 50, char_emb_size: int = 50, word_dropout: float = 0, dropout: float = 0, filter_nums: List[int] = (40, 30, 20), kernel_sizes: List[int] = (5, 3, 1), pool_method: str = 'max', activation='relu', min_char_freq: int = 2, pre_train_char_embed: str = None, requires_grad: bool = True, include_word_start_end: bool = True)[源代码]
参数:
  • vocab -- 词表
  • embed_size -- 该CNNCharEmbedding的输出维度大小,默认值为50.
  • char_emb_size -- character的embed的维度。character是从vocab中生成的。默认值为50.
  • word_dropout (float) -- 以多大的概率将一个词替换为unk。这样既可以训练unk也是一定的regularize。
  • dropout (float) -- 以多大的概率drop分布式表示与char embedding的输出。
  • filter_nums -- filter的数量. 长度需要和kernels一致。默认值为[40, 30, 20].
  • kernel_sizes -- kernel的大小. 默认值为[5, 3, 1].
  • pool_method -- character的表示在合成一个表示时所使用的pool方法,支持'avg', 'max'.
  • activation -- CNN之后使用的激活方法,支持'relu', 'sigmoid', 'tanh' 或者自定义函数.
  • min_char_freq -- character的最少出现次数。默认值为2.
  • pre_train_char_embed -- 可以有两种方式调用预训练好的character embedding:第一种是传入embedding文件夹 (文件夹下应该只有一个以.txt作为后缀的文件)或文件路径;第二种是传入embedding的名称,第二种情况将自动查看缓存中是否存在该模型, 没有的话将自动下载。如果输入为None则使用embedding_dim的维度随机初始化一个embedding.
  • requires_grad -- 是否更新权重
  • include_word_start_end -- 是否在每个word开始的character前和结束的character增加特殊标示符号;
forward(words)[源代码]

输入words的index后,生成对应的words的表示。

参数:words -- [batch_size, max_len]
返回:[batch_size, max_len, embed_size]
fastNLP.embeddings.get_embeddings(init_embed)[源代码]

别名 fastNLP.embeddings.get_embeddings fastNLP.embeddings.utils.get_embeddings

根据输入的init_embed返回Embedding对象。如果输入是tuple, 则随机初始化一个nn.Embedding; 如果输入是numpy.ndarray, 则按照ndarray 的值将nn.Embedding初始化; 如果输入是torch.Tensor, 则按该值初始化nn.Embedding; 如果输入是fastNLP中的embedding将不做处理 返回原对象。

参数:init_embed -- 可以是 tuple:(num_embedings, embedding_dim), 即embedding的大小和每个词的维度;也可以传入 nn.Embedding 对象, 此时就以传入的对象作为embedding; 传入np.ndarray也行,将使用传入的ndarray作为作为Embedding初始化; 传入torch.Tensor, 将使用传入的值作为Embedding初始化。
Return nn.Embedding:
 embeddings
子模块
fastNLP.embeddings.bert_embedding
class fastNLP.embeddings.bert_embedding.BertEmbedding(vocab: fastNLP.core.vocabulary.Vocabulary, model_dir_or_name: str = 'en-base-uncased', layers: str = '-1', pool_method: str = 'first', word_dropout=0, dropout=0, include_cls_sep: bool = False, pooled_cls=True, requires_grad: bool = True, auto_truncate: bool = False, **kwargs)[源代码]

基类 fastNLP.embeddings.ContextualEmbedding

别名 fastNLP.embeddings.BertEmbedding fastNLP.embeddings.bert_embedding.BertEmbedding

使用BERT对words进行编码的Embedding。建议将输入的words长度限制在430以内,而不要使用512(根据预训练模型参数,可能有变化)。这是由于 预训练的bert模型长度限制为512个token,而因为输入的word是未进行word piece分割的(word piece的分割有BertEmbedding在输入word 时切分),在分割之后长度可能会超过最大长度限制。

BertEmbedding可以支持自动下载权重,当前支持的模型:
en: base-cased en-base-uncased: en-large-cased-wwm: en-large-cased: en-large-uncased: en-large-uncased-wwm cn: 中文BERT wwm by HIT cn-base: 中文BERT base-chinese cn-wwm-ext: 中文BERT wwm by HIT with extra data pretrain. multi-base-cased: multilingual cased multi-base-uncased: multilingual uncased

Example:

>>> import torch
>>> from fastNLP import Vocabulary
>>> from fastNLP.embeddings import BertEmbedding
>>> vocab = Vocabulary().add_word_lst("The whether is good .".split())
>>> embed = BertEmbedding(vocab, model_dir_or_name='en-base-uncased', requires_grad=False, layers='4,-2,-1')
>>> words = torch.LongTensor([[vocab.to_index(word) for word in "The whether is good .".split()]])
>>> outputs = embed(words)
>>> outputs.size()
>>> # torch.Size([1, 5, 2304])
__init__(vocab: fastNLP.core.vocabulary.Vocabulary, model_dir_or_name: str = 'en-base-uncased', layers: str = '-1', pool_method: str = 'first', word_dropout=0, dropout=0, include_cls_sep: bool = False, pooled_cls=True, requires_grad: bool = True, auto_truncate: bool = False, **kwargs)[源代码]
参数:
  • vocab (Vocabulary) -- 词表
  • model_dir_or_name (str) -- 模型所在目录或者模型的名称。当传入模型所在目录时,目录中应该包含一个词表文件(以.txt作为后缀名), 权重文件(以.bin作为文件后缀名), 配置文件(以.json作为后缀名)。
  • layers (str) -- 输出embedding表示来自于哪些层,不同层的结果按照layers中的顺序在最后一维concat起来。以','隔开层数,层的序号是 从0开始,可以以负数去索引倒数几层。 layer=0为embedding层(包括wordpiece embedding, position embedding和segment embedding)
  • pool_method (str) -- 因为在bert中,每个word会被表示为多个word pieces, 当获取一个word的表示的时候,怎样从它的word pieces 中计算得到它对应的表示。支持 last , first , avg , max
  • word_dropout (float) -- 以多大的概率将一个词替换为unk。这样既可以训练unk也是一定的regularize。
  • dropout (float) -- 以多大的概率对embedding的表示进行Dropout。0.1即随机将10%的值置为0。
  • include_cls_sep (bool) -- bool,在bert计算句子的表示的时候,需要在前面加上[CLS]和[SEP], 是否在结果中保留这两个内容。 这样 会使得word embedding的结果比输入的结果长两个token。如果该值为True,则在使用 :class::StackEmbedding 可能会与其它类型的 embedding长度不匹配。
  • pooled_cls (bool) -- 返回的[CLS]是否使用预训练中的BertPool映射一下,仅在include_cls_sep时有效。如果下游任务只取[CLS]做预测, 一般该值为True。
  • requires_grad (bool) -- 是否需要gradient以更新Bert的权重。
  • auto_truncate (bool) -- 当句子words拆分为word pieces长度超过bert最大允许长度(一般为512), 自动截掉拆分后的超过510个 word pieces后的内容,并将第512个word piece置为[SEP]。超过长度的部分的encode结果直接全部置零。一般仅有只使用[CLS] 来进行分类的任务将auto_truncate置为True。
  • kwargs --
    bool only_use_pretrain_bpe: 仅使用出现在pretrain词表中的bpe,如果该词没法tokenize则使用unk。如果embedding不需要更新
    建议设置为True。

    int min_freq: 仅在only_use_pretrain_bpe为False有效,大于等于该次数的词会被新加入BERT的BPE词表中 bool truncate_embed: 是否仅保留用到的bpe(这样会减内存占用和加快速度)

drop_word(words)[源代码]

按照设定随机将words设置为unknown_index。

参数:words (torch.LongTensor) -- batch_size x max_len
返回:
forward(words)[源代码]
计算words的bert embedding表示。计算之前会在每句话的开始增加[CLS]在结束增加[SEP], 并根据include_cls_sep判断要不要
删除这两个token的表示。
参数:words (torch.LongTensor) -- [batch_size, max_len]
返回:torch.FloatTensor. batch_size x max_len x (768*len(self.layers))
class fastNLP.embeddings.bert_embedding.BertWordPieceEncoder(model_dir_or_name: str = 'en-base-uncased', layers: str = '-1', pooled_cls: bool = False, word_dropout=0, dropout=0, requires_grad: bool = True)[源代码]

别名 fastNLP.embeddings.BertWordPieceEncoder fastNLP.embeddings.bert_embedding.BertWordPieceEncoder

读取bert模型,读取之后调用index_dataset方法在dataset中生成word_pieces这一列。

BertWordPieceEncoder可以支持自动下载权重,当前支持的模型:
en: base-cased en-large-cased-wwm: en-large-cased: en-large-uncased: en-large-uncased-wwm cn: 中文BERT wwm by HIT cn-base: 中文BERT base-chinese cn-wwm-ext: 中文BERT wwm by HIT with extra data pretrain. multi-base-cased: multilingual cased multi-base-uncased: multilingual uncased
__init__(model_dir_or_name: str = 'en-base-uncased', layers: str = '-1', pooled_cls: bool = False, word_dropout=0, dropout=0, requires_grad: bool = True)[源代码]
参数:
  • model_dir_or_name (str) -- 模型所在目录或者模型的名称。默认值为 en-base-uncased
  • layers (str) -- 最终结果中的表示。以','隔开层数,可以以负数去索引倒数几层。layer=0为embedding层(包括wordpiece embedding, position embedding和segment embedding)
  • pooled_cls (bool) -- 返回的句子开头的[CLS]是否使用预训练中的BertPool映射一下。如果下游任务取[CLS]做预测,一般该值为True。
  • word_dropout (float) -- 以多大的概率将一个词替换为unk。这样既可以训练unk也是一定的regularize。
  • dropout (float) -- 以多大的概率对embedding的表示进行Dropout。0.1即随机将10%的值置为0。
  • requires_grad (bool) -- 是否需要gradient。
drop_word(words)[源代码]

按照设定随机将words设置为unknown_index。

参数:words (torch.LongTensor) -- batch_size x max_len
返回:
forward(word_pieces, token_type_ids=None)[源代码]

计算words的bert embedding表示。传入的words中应该自行包含[CLS]与[SEP]的tag。

参数:
  • words -- batch_size x max_len
  • token_type_ids -- batch_size x max_len, 用于区分前一句和后一句话. 如果不传入,则自动生成(大部分情况,都不需要输入), 第一个[SEP]及之前为0, 第二个[SEP]及到第一个[SEP]之间为1; 第三个[SEP]及到第二个[SEP]之间为0,依次往后推。
返回:

torch.FloatTensor. batch_size x max_len x (768*len(self.layers))

index_datasets(*datasets, field_name, add_cls_sep=True)[源代码]

使用bert的tokenizer新生成word_pieces列加入到datasets中,并将他们设置为input,且将word_pieces这一列的pad value设置为了 bert的pad value。

参数:
  • datasets (DataSet) -- DataSet对象
  • field_name (str) -- 基于哪一列的内容生成word_pieces列。这一列中每个数据应该是List[str]的形式。
  • add_cls_sep (bool) -- 如果首尾不是[CLS]与[SEP]会在首尾额外加入[CLS]与[SEP]。
返回:

fastNLP.embeddings.char_embedding

该文件中主要包含的是character的Embedding,包括基于CNN与LSTM的character Embedding。与其它Embedding一样,这里的Embedding输入也是 词的index而不需要使用词语中的char的index来获取表达。

class fastNLP.embeddings.char_embedding.CNNCharEmbedding(vocab: fastNLP.core.vocabulary.Vocabulary, embed_size: int = 50, char_emb_size: int = 50, word_dropout: float = 0, dropout: float = 0, filter_nums: List[int] = (40, 30, 20), kernel_sizes: List[int] = (5, 3, 1), pool_method: str = 'max', activation='relu', min_char_freq: int = 2, pre_train_char_embed: str = None, requires_grad: bool = True, include_word_start_end: bool = True)[源代码]

基类 fastNLP.embeddings.TokenEmbedding

别名 fastNLP.embeddings.CNNCharEmbedding fastNLP.embeddings.char_embedding.CNNCharEmbedding

使用CNN生成character embedding。CNN的结构为, embed(x) -> Dropout(x) -> CNN(x) -> activation(x) -> pool -> fc -> Dropout. 不同的kernel大小的fitler结果是concat起来然后通过一层fully connected layer, 然后输出word的表示。

Example:

>>> import torch
>>> from fastNLP import Vocabulary
>>> from fastNLP.embeddings import CNNCharEmbedding
>>> vocab = Vocabulary().add_word_lst("The whether is good .".split())
>>> embed = CNNCharEmbedding(vocab, embed_size=50)
>>> words = torch.LongTensor([[vocab.to_index(word) for word in "The whether is good .".split()]])
>>> outputs = embed(words)
>>> outputs.size()
>>> # torch.Size([1, 5,50])
__init__(vocab: fastNLP.core.vocabulary.Vocabulary, embed_size: int = 50, char_emb_size: int = 50, word_dropout: float = 0, dropout: float = 0, filter_nums: List[int] = (40, 30, 20), kernel_sizes: List[int] = (5, 3, 1), pool_method: str = 'max', activation='relu', min_char_freq: int = 2, pre_train_char_embed: str = None, requires_grad: bool = True, include_word_start_end: bool = True)[源代码]
参数:
  • vocab -- 词表
  • embed_size -- 该CNNCharEmbedding的输出维度大小,默认值为50.
  • char_emb_size -- character的embed的维度。character是从vocab中生成的。默认值为50.
  • word_dropout (float) -- 以多大的概率将一个词替换为unk。这样既可以训练unk也是一定的regularize。
  • dropout (float) -- 以多大的概率drop分布式表示与char embedding的输出。
  • filter_nums -- filter的数量. 长度需要和kernels一致。默认值为[40, 30, 20].
  • kernel_sizes -- kernel的大小. 默认值为[5, 3, 1].
  • pool_method -- character的表示在合成一个表示时所使用的pool方法,支持'avg', 'max'.
  • activation -- CNN之后使用的激活方法,支持'relu', 'sigmoid', 'tanh' 或者自定义函数.
  • min_char_freq -- character的最少出现次数。默认值为2.
  • pre_train_char_embed -- 可以有两种方式调用预训练好的character embedding:第一种是传入embedding文件夹 (文件夹下应该只有一个以.txt作为后缀的文件)或文件路径;第二种是传入embedding的名称,第二种情况将自动查看缓存中是否存在该模型, 没有的话将自动下载。如果输入为None则使用embedding_dim的维度随机初始化一个embedding.
  • requires_grad -- 是否更新权重
  • include_word_start_end -- 是否在每个word开始的character前和结束的character增加特殊标示符号;
forward(words)[源代码]

输入words的index后,生成对应的words的表示。

参数:words -- [batch_size, max_len]
返回:[batch_size, max_len, embed_size]
class fastNLP.embeddings.char_embedding.LSTMCharEmbedding(vocab: fastNLP.core.vocabulary.Vocabulary, embed_size: int = 50, char_emb_size: int = 50, word_dropout: float = 0, dropout: float = 0, hidden_size=50, pool_method: str = 'max', activation='relu', min_char_freq: int = 2, bidirectional=True, pre_train_char_embed: str = None, requires_grad: bool = True, include_word_start_end: bool = True)[源代码]

基类 fastNLP.embeddings.TokenEmbedding

别名 fastNLP.embeddings.LSTMCharEmbedding fastNLP.embeddings.char_embedding.LSTMCharEmbedding

使用LSTM的方式对character进行encode. embed(x) -> Dropout(x) -> LSTM(x) -> activation(x) -> pool -> Dropout

Example:

>>> import torch
>>> from fastNLP import Vocabulary
>>> from fastNLP.embeddings import LSTMCharEmbedding
>>> vocab = Vocabulary().add_word_lst("The whether is good .".split())
>>> embed = LSTMCharEmbedding(vocab, embed_size=50)
>>> words = torch.LongTensor([[vocab.to_index(word) for word in "The whether is good .".split()]])
>>> outputs = embed(words)
>>> outputs.size()
>>> # torch.Size([1, 5,50])
__init__(vocab: fastNLP.core.vocabulary.Vocabulary, embed_size: int = 50, char_emb_size: int = 50, word_dropout: float = 0, dropout: float = 0, hidden_size=50, pool_method: str = 'max', activation='relu', min_char_freq: int = 2, bidirectional=True, pre_train_char_embed: str = None, requires_grad: bool = True, include_word_start_end: bool = True)[源代码]
参数:
  • vocab -- 词表
  • embed_size -- LSTMCharEmbedding的输出维度。默认值为50.
  • char_emb_size -- character的embedding的维度。默认值为50.
  • word_dropout (float) -- 以多大的概率将一个词替换为unk。这样既可以训练unk也是一定的regularize。
  • dropout -- 以多大概率drop character embedding的输出以及最终的word的输出。
  • hidden_size -- LSTM的中间hidden的大小,如果为bidirectional的,hidden会除二,默认为50.
  • pool_method -- 支持'max', 'avg'。
  • activation -- 激活函数,支持'relu', 'sigmoid', 'tanh', 或者自定义函数.
  • min_char_freq -- character的最小出现次数。默认值为2.
  • bidirectional -- 是否使用双向的LSTM进行encode。默认值为True。
  • pre_train_char_embed -- 可以有两种方式调用预训练好的character embedding:第一种是传入embedding文件夹 (文件夹下应该只有一个以.txt作为后缀的文件)或文件路径;第二种是传入embedding的名称,第二种情况将自动查看缓存中是否存在该模型, 没有的话将自动下载。如果输入为None则使用embedding_dim的维度随机初始化一个embedding.
  • requires_grad -- 是否更新权重
  • include_word_start_end -- 是否在每个word开始的character前和结束的character增加特殊标示符号;
forward(words)[源代码]

输入words的index后,生成对应的words的表示。

参数:words -- [batch_size, max_len]
返回:[batch_size, max_len, embed_size]
fastNLP.embeddings.contextual_embedding
class fastNLP.embeddings.contextual_embedding.ContextualEmbedding(vocab: fastNLP.core.vocabulary.Vocabulary, word_dropout: float = 0.0, dropout: float = 0.0)[源代码]

ContextualEmbedding组件. BertEmbedding与ElmoEmbedding的基类

add_sentence_cache(*datasets, batch_size=32, device='cpu', delete_weights: bool = True)[源代码]

由于动态embedding生成比较耗时,所以可以把每句话embedding缓存下来,这样就不需要每次都运行生成过程。

参数:
  • datasets -- DataSet对象
  • batch_size -- int, 生成cache的sentence表示时使用的batch的大小
  • device -- 参考 :class::fastNLP.Trainer 的device
  • delete_weights -- 似乎在生成了cache之后删除权重,在不需要finetune动态模型的情况下,删除权重会大量减少内存占用。
返回:

remove_sentence_cache()[源代码]

删除缓存的句子表示. 删除之后如果模型权重没有被删除,将开始使用动态计算权重。

返回:
fastNLP.embeddings.elmo_embedding
class fastNLP.embeddings.elmo_embedding.ElmoEmbedding(vocab: fastNLP.core.vocabulary.Vocabulary, model_dir_or_name: str = 'en', layers: str = '2', requires_grad: bool = True, word_dropout=0.0, dropout=0.0, cache_word_reprs: bool = False)[源代码]

基类 fastNLP.embeddings.ContextualEmbedding

别名 fastNLP.embeddings.ElmoEmbedding fastNLP.embeddings.elmo_embedding.ElmoEmbedding

使用ELMo的embedding。初始化之后,只需要传入words就可以得到对应的embedding。 当前支持的使用名称初始化的模型:

en: 即en-medium hidden_size 1024; output_size 12
en-medium: hidden_size 2048; output_size 256
en-origial: hidden_size 4096; output_size 512
en-original-5.5b: hidden_size 4096; output_size 512
en-small: hidden_size 1024; output_size 128

Example:

>>> import torch
>>> from fastNLP import Vocabulary
>>> from fastNLP.embeddings import ElmoEmbedding
>>> vocab = Vocabulary().add_word_lst("The whether is good .".split())
>>> # 使用不同层的concat的结果
>>> embed = ElmoEmbedding(vocab, model_dir_or_name='en', layers='1,2', requires_grad=False)
>>> words = torch.LongTensor([[vocab.to_index(word) for word in "The whether is good .".split()]])
>>> outputs = embed(words)
>>> outputs.size()
>>> # torch.Size([1, 5, 2048])

>>> # 使用不同层的weighted sum。
>>> embed = ElmoEmbedding(vocab, model_dir_or_name='en', layers='mix', requires_grad=False)
>>> embed.set_mix_weights_requires_grad()  # 使得weighted的权重是可以学习的,但ELMO的LSTM部分是不更新
__init__(vocab: fastNLP.core.vocabulary.Vocabulary, model_dir_or_name: str = 'en', layers: str = '2', requires_grad: bool = True, word_dropout=0.0, dropout=0.0, cache_word_reprs: bool = False)[源代码]
参数:
  • vocab -- 词表
  • model_dir_or_name -- 可以有两种方式调用预训练好的ELMo embedding:第一种是传入ELMo所在文件夹,该文件夹下面应该有两个文件, 其中一个是以json为后缀的配置文件,另一个是以pkl为后缀的权重文件;第二种是传入ELMo版本的名称,将自动查看缓存中是否存在该模型, 没有的话将自动下载并缓存。
  • layers -- str, 指定返回的层数(从0开始), 以,隔开不同的层。如果要返回第二层的结果'2', 返回后两层的结果'1,2'。不同的层的结果 按照这个顺序concat起来,默认为'2'。'mix'会使用可学习的权重结合不同层的表示(权重是否可训练与requires_grad保持一致, 初始化权重对三层结果进行mean-pooling, 可以通过ElmoEmbedding.set_mix_weights_requires_grad()方法只将mix weights设置为可学习。)
  • requires_grad -- bool, 该层是否需要gradient, 默认为False.
  • word_dropout (float) -- 以多大的概率将一个词替换为unk。这样既可以训练unk也是一定的regularize。
  • dropout (float) -- 以多大的概率对embedding的表示进行Dropout。0.1即随机将10%的值置为0。
  • cache_word_reprs -- 可以选择对word的表示进行cache; 设置为True的话,将在初始化的时候为每个word生成对应的embedding, 并删除character encoder,之后将直接使用cache的embedding。默认为False。
forward(words: torch.LongTensor)[源代码]

计算words的elmo embedding表示。根据elmo文章中介绍的ELMO实际上是有2L+1层结果,但是为了让结果比较容易拆分,token的 被重复了一次,使得实际上layer=0的结果是[token_embedding;token_embedding], 而layer=1的结果是[forward_hiddens; backward_hiddens].

参数:words -- batch_size x max_len
返回:torch.FloatTensor. batch_size x max_len x (512*len(self.layers))
set_mix_weights_requires_grad(flag=True)[源代码]

当初始化ElmoEmbedding时layers被设置为mix时,可以通过调用该方法设置mix weights是否可训练。如果layers不是mix,调用 该方法没有用。

参数:flag (bool) -- 混合不同层表示的结果是否可以训练。
返回:
fastNLP.embeddings.embedding

该模块中的Embedding主要用于随机初始化的embedding(更推荐使用 fastNLP.embeddings.StaticEmbedding ),或按照预训练权重初始化Embedding。

class fastNLP.embeddings.embedding.Embedding(init_embed, word_dropout=0, dropout=0.0, unk_index=None)[源代码]

别名 fastNLP.embeddings.Embedding fastNLP.embeddings.embedding.Embedding

词向量嵌入,支持输入多种方式初始化. 可以通过self.num_embeddings获取词表大小; self.embedding_dim获取embedding的维度.

Example:

>>> import numpy as np
>>> from fastNLP.embeddings import Embedding
>>> init_embed = (2000, 100)
>>> embed = Embedding(init_embed)  # 随机初始化一个具有2000个词,每个词表示为100维的词向量
>>> init_embed = np.zeros((2000, 100))
>>> embed = Embedding(init_embed)  # 使用numpy.ndarray的值作为初始化值初始化一个Embedding
__init__(init_embed, word_dropout=0, dropout=0.0, unk_index=None)[源代码]
参数:
  • init_embed (tuple(int,int),torch.FloatTensor,nn.Embedding,numpy.ndarray) -- 支持传入Embedding的大小(传入tuple(int, int), 第一个int为vocab_zie, 第二个int为embed_dim); 或传入Tensor, Embedding, numpy.ndarray等则直接使用该值初始化Embedding;
  • word_dropout (float) -- 按照一定概率随机将word设置为unk_index,这样可以使得unk这个token得到足够的训练, 且会对网络有 一定的regularize的作用。设置该值时,必须同时设置unk_index
  • dropout (float) -- 对Embedding的输出的dropout。
  • unk_index (int) -- drop word时替换为的index。fastNLP的Vocabulary的unk_index默认为1。
forward(words)[源代码]
参数:words (torch.LongTensor) -- [batch, seq_len]
返回:torch.Tensor : [batch, seq_len, embed_dim]
requires_grad

Embedding的参数是否允许优化。True: 所有参数运行优化; False: 所有参数不允许优化; None: 部分允许优化、部分不允许 :return:

class fastNLP.embeddings.embedding.TokenEmbedding(vocab, word_dropout=0.0, dropout=0.0)[源代码]

别名 fastNLP.embeddings.TokenEmbedding fastNLP.embeddings.embedding.TokenEmbedding

fastNLP中各种Embedding的基类

drop_word(words)[源代码]

按照设定随机将words设置为unknown_index。

参数:words (torch.LongTensor) -- batch_size x max_len
返回:
dropout(words)[源代码]

对embedding后的word表示进行drop。

参数:words (torch.FloatTensor) -- batch_size x max_len x embed_size
返回:
get_word_vocab()[源代码]

返回embedding的词典。

返回:Vocabulary
num_embedding

这个值可能会大于实际的embedding矩阵的大小。 :return:

requires_grad

Embedding的参数是否允许优化。True: 所有参数运行优化; False: 所有参数不允许优化; None: 部分允许优化、部分不允许 :return:

fastNLP.embeddings.stack_embedding
class fastNLP.embeddings.stack_embedding.StackEmbedding(embeds: List[fastNLP.embeddings.embedding.TokenEmbedding], word_dropout=0, dropout=0)[源代码]

基类 fastNLP.embeddings.TokenEmbedding

别名 fastNLP.embeddings.StackEmbedding fastNLP.embeddings.stack_embedding.StackEmbedding

支持将多个embedding集合成一个embedding。

Example:

>>> from fastNLP import Vocabulary
>>> from fastNLP.embeddings import StaticEmbedding, StackEmbedding
>>> vocab =  Vocabulary().add_word_lst("The whether is good .".split())
>>> embed_1 = StaticEmbedding(vocab, model_dir_or_name='en-glove-6b-50d', requires_grad=True)
>>> embed_2 = StaticEmbedding(vocab, model_dir_or_name='en-word2vec-300', requires_grad=True)
>>> embed = StackEmbedding([embed_1, embed_2])
__init__(embeds: List[fastNLP.embeddings.embedding.TokenEmbedding], word_dropout=0, dropout=0)[源代码]
参数:
  • embeds -- 一个由若干个TokenEmbedding组成的list,要求每一个TokenEmbedding的词表都保持一致
  • word_dropout (float) -- 以多大的概率将一个词替换为unk。这样既可以训练unk也是一定的regularize。不同embedidng会在相同的位置 被设置为unknown。如果这里设置了dropout,则组成的embedding就不要再设置dropout了。
  • dropout (float) -- 以多大的概率对embedding的表示进行Dropout。0.1即随机将10%的值置为0。
append(embed: fastNLP.embeddings.embedding.TokenEmbedding)[源代码]

添加一个embedding到结尾。 :param embed: :return:

embed_size

该Embedding输出的vector的最后一维的维度。 :return:

forward(words)[源代码]

得到多个embedding的结果,并把结果按照顺序concat起来。

参数:words -- batch_size x max_len
返回:返回的shape和当前这个stack embedding中embedding的组成有关
pop()[源代码]

弹出最后一个embed :return:

fastNLP.embeddings.static_embedding
class fastNLP.embeddings.static_embedding.StaticEmbedding(vocab: fastNLP.core.vocabulary.Vocabulary, model_dir_or_name: str = 'en', embedding_dim=-1, requires_grad: bool = True, init_method=None, lower=False, dropout=0, word_dropout=0, normalize=False, min_freq=1, **kwargs)[源代码]

基类 fastNLP.embeddings.TokenEmbedding

别名 fastNLP.embeddings.StaticEmbedding fastNLP.embeddings.static_embedding.StaticEmbedding

StaticEmbedding组件. 给定预训练embedding的名称或路径,根据vocab从embedding中抽取相应的数据(只会将出现在vocab中的词抽取出来, 如果没有找到,则会随机初始化一个值(但如果该word是被标记为no_create_entry的话,则不会单独创建一个值,而是会被指向unk的index))。 当前支持自动下载的预训练vector有:

en: 实际为en-glove-840b-300d(常用)
en-glove-6b-50d: glove官方的50d向量
en-glove-6b-100d: glove官方的100d向量
en-glove-6b-200d: glove官方的200d向量
en-glove-6b-300d: glove官方的300d向量
en-glove-42b-300d: glove官方使用42B数据训练版本
en-glove-840b-300d:
en-glove-twitter-27b-25d:
en-glove-twitter-27b-50d:
en-glove-twitter-27b-100d:
en-glove-twitter-27b-200d:
en-word2vec-300d: word2vec官方发布的300d向量
en-fasttext-crawl: fasttext官方发布的300d英文预训练
cn-char-fastnlp-100d: fastNLP训练的100d的character embedding
cn-bi-fastnlp-100d: fastNLP训练的100d的bigram embedding
cn-tri-fastnlp-100d: fastNLP训练的100d的trigram embedding
cn-fasttext: fasttext官方发布的300d中文预训练embedding

Example:

>>> from fastNLP import Vocabulary
>>> from fastNLP.embeddings import StaticEmbedding
>>> vocab = Vocabulary().add_word_lst("The whether is good .".split())
>>> embed = StaticEmbedding(vocab, model_dir_or_name='en-glove-50d')

>>> vocab = Vocabulary().add_word_lst(["The", 'the', "THE"])
>>> embed = StaticEmbedding(vocab, model_dir_or_name="en-glove-50d", lower=True)
>>> # "the", "The", "THE"它们共用一个vector,且将使用"the"在预训练词表中寻找它们的初始化表示。

>>> vocab = Vocabulary().add_word_lst(["The", "the", "THE"])
>>> embed = StaticEmbedding(vocab, model_dir_or_name=None, embedding_dim=5, lower=True)
>>> words = torch.LongTensor([[vocab.to_index(word) for word in ["The", "the", "THE"]]])
>>> embed(words)
>>> tensor([[[ 0.5773,  0.7251, -0.3104,  0.0777,  0.4849],
             [ 0.5773,  0.7251, -0.3104,  0.0777,  0.4849],
             [ 0.5773,  0.7251, -0.3104,  0.0777,  0.4849]]],
           grad_fn=<EmbeddingBackward>)  # 每种word的输出是一致的。
__init__(vocab: fastNLP.core.vocabulary.Vocabulary, model_dir_or_name: str = 'en', embedding_dim=-1, requires_grad: bool = True, init_method=None, lower=False, dropout=0, word_dropout=0, normalize=False, min_freq=1, **kwargs)[源代码]
参数:
  • vocab -- Vocabulary. 若该项为None则会读取所有的embedding。
  • model_dir_or_name -- 可以有两种方式调用预训练好的static embedding:第一种是传入embedding文件夹(文件夹下应该只有一个 以.txt作为后缀的文件)或文件路径;第二种是传入embedding的名称,第二种情况将自动查看缓存中是否存在该模型,没有的话将自动下载。 如果输入为None则使用embedding_dim的维度随机初始化一个embedding。
  • embedding_dim (int) -- 随机初始化的embedding的维度,当该值为大于0的值时,将忽略model_dir_or_name。
  • requires_grad (bool) -- 是否需要gradient. 默认为True
  • init_method (callable) -- 如何初始化没有找到的值。可以使用torch.nn.init.*中各种方法, 传入的方法应该接受一个tensor,并 inplace地修改其值。
  • lower (bool) -- 是否将vocab中的词语小写后再和预训练的词表进行匹配。如果你的词表中包含大写的词语,或者就是需要单独 为大写的词语开辟一个vector表示,则将lower设置为False。
  • dropout (float) -- 以多大的概率对embedding的表示进行Dropout。0.1即随机将10%的值置为0。
  • word_dropout (float) -- 以多大的概率将一个词替换为unk。这样既可以训练unk也是一定的regularize。
  • normalize (bool) -- 是否对vector进行normalize,使得每个vector的norm为1。
  • min_freq (int) -- Vocabulary词频数小于这个数量的word将被指向unk。
  • kwargs (dict) -- bool only_train_min_freq: 仅对train中的词语使用min_freq筛选; bool only_norm_found_vector: 是否仅对在预训练中找到的词语使用normalize; bool only_use_pretrain_word: 仅使用出现在pretrain词表中的词,如果该词没有在预训练的词表中出现则为unk。如果embedding不需要更新建议设置为True。
forward(words)[源代码]

传入words的index

参数:words -- torch.LongTensor, [batch_size, max_len]
返回:torch.FloatTensor, [batch_size, max_len, embed_size]
fastNLP.embeddings.utils
fastNLP.embeddings.utils.get_embeddings(init_embed)[源代码]

别名 fastNLP.embeddings.get_embeddings fastNLP.embeddings.utils.get_embeddings

根据输入的init_embed返回Embedding对象。如果输入是tuple, 则随机初始化一个nn.Embedding; 如果输入是numpy.ndarray, 则按照ndarray 的值将nn.Embedding初始化; 如果输入是torch.Tensor, 则按该值初始化nn.Embedding; 如果输入是fastNLP中的embedding将不做处理 返回原对象。

参数:init_embed -- 可以是 tuple:(num_embedings, embedding_dim), 即embedding的大小和每个词的维度;也可以传入 nn.Embedding 对象, 此时就以传入的对象作为embedding; 传入np.ndarray也行,将使用传入的ndarray作为作为Embedding初始化; 传入torch.Tensor, 将使用传入的值作为Embedding初始化。
Return nn.Embedding:
 embeddings
fastNLP.io

用于IO的模块, 具体包括:

  1. 用于读入 embedding 的 EmbedLoader 类,
  2. 用于读入不同格式数据的 Loader
  3. 用于处理读入数据的 Pipe
  4. 用于保存和载入模型的类, 参考 model_io模块

这些类的使用方法如下:

class fastNLP.io.DataBundle(vocabs: dict = None, datasets: dict = None)[源代码]

别名 fastNLP.io.DataBundle fastNLP.io.data_bundle.DataBundle

经过处理的数据信息,包括一系列数据集(比如:分开的训练集、验证集和测试集)以及各个field对应的vocabulary。该对象一般由fastNLP中各种 Loader的load函数生成,可以通过以下的方法获取里面的内容

Example:

data_bundle = YelpLoader().load({'train':'/path/to/train', 'dev': '/path/to/dev'})
train_vocabs = data_bundle.vocabs['train']
train_data = data_bundle.datasets['train']
dev_data = data_bundle.datasets['train']
__init__(vocabs: dict = None, datasets: dict = None)[源代码]
参数:
  • vocabs -- 从名称(字符串)到 Vocabulary 类型的dict
  • datasets -- 从名称(字符串)到 DataSet 类型的dict
add_collate_fn(fn, name=None)[源代码]

向所有DataSet增加collate_fn, collate_fn详见 DataSet 中相关说明.

参数:
  • fn (callable) --
  • name --
返回:

apply(func, new_field_name: str, **kwargs)[源代码]

对DataBundle中所有的dataset使用apply方法

参数:
  • func (callable) -- input是instance中名为 field_name 的field的内容。
  • new_field_name (str) -- 将func返回的内容放入到 new_field_name 这个field中,如果名称与已有的field相同,则覆 盖之前的field。如果为None则不创建新的field。
  • kwargs (optional) --

    支持输入is_input,is_target,ignore_type

    1. is_input: bool, 如果为True则将名为 new_field_name 的field设置为input
    2. is_target: bool, 如果为True则将名为 new_field_name 的field设置为target
    3. ignore_type: bool, 如果为True则将名为 new_field_name 的field的ignore_type设置为true, 忽略其类型
apply_field(func, field_name: str, new_field_name: str, ignore_miss_dataset=True, **kwargs)[源代码]

对DataBundle中所有的dataset使用apply_field方法

参数:
  • func (callable) -- input是instance中名为 field_name 的field的内容。
  • field_name (str) -- 传入func的是哪个field。
  • new_field_name (str) -- 将func返回的内容放入到 new_field_name 这个field中,如果名称与已有的field相同,则覆 盖之前的field。如果为None则不创建新的field。
  • ignore_miss_dataset (bool) -- 当某个field名称在某个dataset不存在时,如果为True,则直接忽略该DataSet; 如果为False,则报错
  • kwargs (optional) --

    支持输入is_input,is_target,ignore_type

    1. is_input: bool, 如果为True则将名为 new_field_name 的field设置为input
    2. is_target: bool, 如果为True则将名为 new_field_name 的field设置为target
    3. ignore_type: bool, 如果为True则将名为 new_field_name 的field的ignore_type设置为true, 忽略其类型
copy_field(field_name, new_field_name, ignore_miss_dataset=True)[源代码]

将DataBundle中所有的DataSet中名为field_name的Field复制一份并命名为叫new_field_name.

参数:
  • field_name (str) --
  • new_field_name (str) --
  • ignore_miss_dataset (bool) -- 当某个field名称在某个dataset不存在时,如果为True,则直接忽略该DataSet; 如果为False,则报错
返回:

self

delete_collate_fn(name=None)[源代码]

删除DataSet中的collate_fn

参数:name --
返回:
delete_dataset(name: str)[源代码]

删除名为name的DataSet

参数:name (str) --
返回:self
delete_field(field_name, ignore_miss_dataset=True, delete_vocab=True)[源代码]

将DataBundle中所有DataSet中名为field_name的field删除掉.

参数:
  • field_name (str) --
  • ignore_miss_dataset (bool) -- 当某个field名称在某个dataset不存在时,如果为True,则直接忽略该DataSet; 如果为False,则报错
  • delete_vocab (bool) -- 如果该field也在vocabs中存在,将该值也一并删除
返回:

self

delete_vocab(field_name: str)[源代码]

删除vocab :param str field_name: :return: self

get_dataset(name: str) → fastNLP.core.dataset.DataSet[源代码]

获取名为name的dataset

参数:name (str) -- dataset的名称,一般为'train', 'dev', 'test'
返回:DataSet
get_dataset_names() → List[str][源代码]

返回DataBundle中DataSet的名称

返回:
get_vocab(field_name: str) → fastNLP.core.vocabulary.Vocabulary[源代码]

获取field名为field_name对应的vocab

参数:field_name (str) -- 名称
返回:Vocabulary
get_vocab_names() → List[str][源代码]

返回DataBundle中Vocabulary的名称

返回:
iter_datasets() → Union[str, fastNLP.core.dataset.DataSet][源代码]

迭代data_bundle中的DataSet

Example:

for name, dataset in data_bundle.iter_datasets():
    pass
返回:
iter_vocabs() → Union[str, fastNLP.core.vocabulary.Vocabulary][源代码]

迭代data_bundle中的DataSet

Example:

for field_name, vocab in data_bundle.iter_vocabs():
pass
返回:
rename_field(field_name, new_field_name, ignore_miss_dataset=True, rename_vocab=True)[源代码]

将DataBundle中所有DataSet中名为field_name的field重命名为new_field_name.

参数:
  • field_name (str) --
  • new_field_name (str) --
  • ignore_miss_dataset (bool) -- 当某个field名称在某个dataset不存在时,如果为True,则直接忽略该DataSet; 如果为False,则报错
  • rename_vocab (bool) -- 如果该field同时也存在于vocabs中,会将该field的名称对应修改
返回:

self

set_dataset(dataset, name: str)[源代码]
参数:
  • dataset (DataSet) -- 传递给DataBundle的DataSet
  • name (str) -- dataset的名称
返回:

self

set_ignore_type(*field_names, flag=True, ignore_miss_dataset=True)[源代码]

将DataBundle中所有的DataSet中名为*field_names的Field的ignore_type设置为flag状态

参数:
  • field_names (str) --
  • flag (bool) --
  • ignore_miss_dataset (bool) -- 当某个field名称在某个dataset不存在时,如果为True,则直接忽略该DataSet; 如果为False,则报错
返回:

self

set_input(*field_names, flag=True, use_1st_ins_infer_dim_type=True, ignore_miss_dataset=True)[源代码]

将field_names中的field设置为input, 对data_bundle中所有的dataset执行该操作:

data_bundle.set_input('words', 'seq_len')   # 将words和seq_len这两个field的input属性设置为True
data_bundle.set_input('words', flag=False)  # 将words这个field的input属性设置为False
参数:
  • field_names (str) -- field的名称
  • flag (bool) -- 将field_name的input状态设置为flag
  • use_1st_ins_infer_dim_type (bool) -- 如果为True,将不会check该列是否所有数据都是同样的维度,同样的类型。将直接使用第一 行的数据进行类型和维度推断本列的数据的类型和维度。
  • ignore_miss_dataset (bool) -- 当某个field名称在某个dataset不存在时,如果为True,则直接忽略该DataSet; 如果为False,则报错
返回:

self

set_pad_val(field_name, pad_val, ignore_miss_dataset=True)[源代码]

将DataBundle中所有的DataSet中名为field_name的Field的padding值设置为pad_val.

参数:
  • field_name (str) --
  • pad_val (int) --
  • ignore_miss_dataset (bool) -- 当某个field名称在某个dataset不存在时,如果为True,则直接忽略该DataSet; 如果为False,则报错
返回:

self

set_target(*field_names, flag=True, use_1st_ins_infer_dim_type=True, ignore_miss_dataset=True)[源代码]

将field_names中的field设置为target, 对data_bundle中所有的dataset执行该操作:

data_bundle.set_target('target', 'seq_len')   # 将words和target这两个field的input属性设置为True
data_bundle.set_target('target', flag=False)  # 将target这个field的input属性设置为False
参数:
  • field_names (str) -- field的名称
  • flag (bool) -- 将field_name的target状态设置为flag
  • use_1st_ins_infer_dim_type (bool) -- 如果为True,将不会check该列是否所有数据都是同样的维度,同样的类型。将直接使用第一 行的数据进行类型和维度推断本列的数据的类型和维度。
  • ignore_miss_dataset (bool) -- 当某个field名称在某个dataset不存在时,如果为True,则直接忽略该DataSet; 如果为False,则报错
返回:

self

set_vocab(vocab, field_name)[源代码]

向DataBunlde中增加vocab

参数:
  • vocab (Vocabulary) -- 词表
  • field_name (str) -- 这个vocab对应的field名称
返回:

self

class fastNLP.io.EmbedLoader[源代码]

别名 fastNLP.io.EmbedLoader fastNLP.io.embed_loader.EmbedLoader

用于读取预训练的embedding, 读取结果可直接载入为模型参数。

static load_with_vocab(embed_filepath, vocab, dtype=<class 'numpy.float32'>, padding='<pad>', unknown='<unk>', normalize=True, error='ignore', init_method=None)[源代码]

从embed_filepath这个预训练的词向量中抽取出vocab这个词表的词的embedding。EmbedLoader将自动判断embed_filepath是 word2vec(第一行只有两个元素)还是glove格式的数据。

参数:
  • embed_filepath (str) -- 预训练的embedding的路径。
  • vocab -- 词表 Vocabulary 类型,读取出现在vocab中的词的embedding。 没有出现在vocab中的词的embedding将通过找到的词的embedding的正态分布采样出来,以使得整个Embedding是同分布的。
  • dtype -- 读出的embedding的类型
  • padding (str) -- 词表中padding的token
  • unknown (str) -- 词表中unknown的token
  • normalize (bool) -- 是否将每个vector归一化到norm为1
  • error (str) -- ignore , strict ; 如果 ignore ,错误将自动跳过; 如果 strict , 错误将抛出。 这里主要可能出错的地方在于词表有空行或者词表出现了维度不一致。
  • init_method (callable) -- 传入numpy.ndarray, 返回numpy.ndarray, 用以初始化embedding
Return numpy.ndarray:
 

shape为 [len(vocab), dimension], dimension由pretrain的embedding决定。

static load_without_vocab(embed_filepath, dtype=<class 'numpy.float32'>, padding='<pad>', unknown='<unk>', normalize=True, error='ignore')[源代码]

从embed_filepath中读取预训练的word vector。根据预训练的词表读取embedding并生成一个对应的Vocabulary。

参数:
  • embed_filepath (str) -- 预训练的embedding的路径。
  • dtype -- 读出的embedding的类型
  • padding (str) -- 词表中的padding的token. 并以此用做vocab的padding。
  • unknown (str) -- 词表中的unknown的token. 并以此用做vocab的unknown。
  • normalize (bool) -- 是否将每个vector归一化到norm为1
  • error (str) -- ignore , strict ; 如果 ignore ,错误将自动跳过; 如果 strict , 错误将抛出。这里主要可能出错的地 方在于词表有空行或者词表出现了维度不一致。
Return (numpy.ndarray, Vocabulary):
 

Embedding的shape是[词表大小+x, 词表维度], "词表大小+x"是由于最终的大小还取决与 是否使用padding, 以及unknown有没有在词表中找到对应的词。 Vocabulary中的词的顺序与Embedding的顺序是一一对应的。

class fastNLP.io.Loader[源代码]

别名 fastNLP.io.Loader fastNLP.io.loader.Loader

各种数据 Loader 的基类,提供了 API 的参考. Loader支持以下的三个函数

  • download() 函数:自动将该数据集下载到缓存地址,默认缓存地址为~/.fastNLP/datasets/。由于版权等原因,不是所有的Loader都实现了该方法。该方法会返回下载后文件所处的缓存地址。
  • _load() 函数:从一个数据文件中读取数据,返回一个 DataSet 。返回的DataSet的内容可以通过每个Loader的文档判断出。
  • load() 函数:将文件分别读取为DataSet,然后将多个DataSet放入到一个DataBundle中并返回
download() → str[源代码]

自动下载该数据集

返回:下载后解压目录
load(paths: Union[str, Dict[str, str]] = None) → fastNLP.io.data_bundle.DataBundle[源代码]

从指定一个或多个路径中的文件中读取数据,返回 DataBundle

参数:Dict[str, str]] paths (Union[str,) --

支持以下的几种输入方式:

0.如果为None,则先查看本地是否有缓存,如果没有则自动下载并缓存。

1.传入一个目录, 该目录下名称包含train的被认为是train,包含test的被认为是test,包含dev的被认为是dev,如果检测到多个文件名包含'train'、 'dev'、 'test'则会报错:

data_bundle = xxxLoader().load('/path/to/dir')  # 返回的DataBundle中datasets根据目录下是否检测到train
#  dev、 test等有所变化,可以通过以下的方式取出DataSet
tr_data = data_bundle.get_dataset('train')
te_data = data_bundle.get_dataset('test')  # 如果目录下有文件包含test这个字段

2.传入一个dict,比如train,dev,test不在同一个目录下,或者名称中不包含train, dev, test:

paths = {'train':"/path/to/tr.conll", 'dev':"/to/validate.conll", "test":"/to/te.conll"}
data_bundle = xxxLoader().load(paths)  # 返回的DataBundle中的dataset中包含"train", "dev", "test"
dev_data = data_bundle.get_dataset('dev')

3.传入文件路径:

data_bundle = xxxLoader().load("/path/to/a/train.conll") # 返回DataBundle对象, datasets中仅包含'train'
tr_data = data_bundle.get_dataset('train')  # 取出DataSet
返回:返回的 DataBundle
class fastNLP.io.CLSBaseLoader(sep=', ', has_header=False)[源代码]

基类 fastNLP.io.Loader

别名 fastNLP.io.CLSBaseLoader fastNLP.io.loader.CLSBaseLoader

文本分类Loader的一个基类

原始数据中内容应该为, 每一行为一个sample,第一个逗号之前为target,第一个逗号之后为文本内容。

Example:

"1","I got 'new' tires from the..."
"1","Don't waste your time..."

读取的DataSet将具备以下的数据结构

raw_words target
I got 'new' tires from them and... 1
Don't waste your time. We had two... 1
... ...
download() → str

自动下载该数据集

返回:下载后解压目录
load(paths: Union[str, Dict[str, str]] = None) → fastNLP.io.data_bundle.DataBundle

从指定一个或多个路径中的文件中读取数据,返回 DataBundle

参数:Dict[str, str]] paths (Union[str,) --

支持以下的几种输入方式:

0.如果为None,则先查看本地是否有缓存,如果没有则自动下载并缓存。

1.传入一个目录, 该目录下名称包含train的被认为是train,包含test的被认为是test,包含dev的被认为是dev,如果检测到多个文件名包含'train'、 'dev'、 'test'则会报错:

data_bundle = xxxLoader().load('/path/to/dir')  # 返回的DataBundle中datasets根据目录下是否检测到train
#  dev、 test等有所变化,可以通过以下的方式取出DataSet
tr_data = data_bundle.get_dataset('train')
te_data = data_bundle.get_dataset('test')  # 如果目录下有文件包含test这个字段

2.传入一个dict,比如train,dev,test不在同一个目录下,或者名称中不包含train, dev, test:

paths = {'train':"/path/to/tr.conll", 'dev':"/to/validate.conll", "test":"/to/te.conll"}
data_bundle = xxxLoader().load(paths)  # 返回的DataBundle中的dataset中包含"train", "dev", "test"
dev_data = data_bundle.get_dataset('dev')

3.传入文件路径:

data_bundle = xxxLoader().load("/path/to/a/train.conll") # 返回DataBundle对象, datasets中仅包含'train'
tr_data = data_bundle.get_dataset('train')  # 取出DataSet
返回:返回的 DataBundle
class fastNLP.io.IMDBLoader[源代码]

基类 fastNLP.io.CLSBaseLoader

别名 fastNLP.io.IMDBLoader fastNLP.io.loader.IMDBLoader

原始数据中内容应该为, 每一行为一个sample,制表符之前为target,制表符之后为文本内容。

Example:

neg     Alan Rickman & Emma...
neg     I have seen this...

IMDBLoader读取后的数据将具有以下两列内容: raw_words: str, 需要分类的文本; target: str, 文本的标签 读取的DataSet具备以下的结构:

raw_words target
Alan Rickman & Emma... neg
I have seen this... neg
... ...
download(dev_ratio: float = 0.0, re_download=False)[源代码]

自动下载数据集,如果你使用了这个数据集,请引用以下的文章

http://www.aclweb.org/anthology/P11-1015

根据dev_ratio的值随机将train中的数据取出一部分作为dev数据。下载完成后不从train中切分dev

参数:
  • dev_ratio (float) -- 如果路径中没有dev.txt。从train划分多少作为dev的数据. 如果为0,则不划分dev
  • re_download (bool) -- 是否重新下载数据,以重新切分数据。
返回:

str, 数据集的目录地址

load(paths: Union[str, Dict[str, str]] = None) → fastNLP.io.data_bundle.DataBundle

从指定一个或多个路径中的文件中读取数据,返回 DataBundle

参数:Dict[str, str]] paths (Union[str,) --

支持以下的几种输入方式:

0.如果为None,则先查看本地是否有缓存,如果没有则自动下载并缓存。

1.传入一个目录, 该目录下名称包含train的被认为是train,包含test的被认为是test,包含dev的被认为是dev,如果检测到多个文件名包含'train'、 'dev'、 'test'则会报错:

data_bundle = xxxLoader().load('/path/to/dir')  # 返回的DataBundle中datasets根据目录下是否检测到train
#  dev、 test等有所变化,可以通过以下的方式取出DataSet
tr_data = data_bundle.get_dataset('train')
te_data = data_bundle.get_dataset('test')  # 如果目录下有文件包含test这个字段

2.传入一个dict,比如train,dev,test不在同一个目录下,或者名称中不包含train, dev, test:

paths = {'train':"/path/to/tr.conll", 'dev':"/to/validate.conll", "test":"/to/te.conll"}
data_bundle = xxxLoader().load(paths)  # 返回的DataBundle中的dataset中包含"train", "dev", "test"
dev_data = data_bundle.get_dataset('dev')

3.传入文件路径:

data_bundle = xxxLoader().load("/path/to/a/train.conll") # 返回DataBundle对象, datasets中仅包含'train'
tr_data = data_bundle.get_dataset('train')  # 取出DataSet
返回:返回的 DataBundle
class fastNLP.io.SSTLoader[源代码]

基类 fastNLP.io.Loader

别名 fastNLP.io.SSTLoader fastNLP.io.loader.SSTLoader

原始数据中内容应该为:

Example:

(2 (3 (3 Effective) (2 but)) (1 (1 too-tepid)...
(3 (3 (2 If) (3 (2 you) (3 (2 sometimes)...

读取之后的DataSet具有以下的结构

下面是使用SSTLoader读取的DataSet所具备的field
raw_words
(2 (3 (3 Effective) (2 but)) (1 (1 too-tepid)...
(3 (3 (2 If) (3 (2 you) (3 (2 sometimes) ...
...

raw_words列是str。

download()[源代码]

自动下载数据集,如果你使用了这个数据集,请引用以下的文章

返回:str, 数据集的目录地址
load(paths: Union[str, Dict[str, str]] = None) → fastNLP.io.data_bundle.DataBundle

从指定一个或多个路径中的文件中读取数据,返回 DataBundle

参数:Dict[str, str]] paths (Union[str,) --

支持以下的几种输入方式:

0.如果为None,则先查看本地是否有缓存,如果没有则自动下载并缓存。

1.传入一个目录, 该目录下名称包含train的被认为是train,包含test的被认为是test,包含dev的被认为是dev,如果检测到多个文件名包含'train'、 'dev'、 'test'则会报错:

data_bundle = xxxLoader().load('/path/to/dir')  # 返回的DataBundle中datasets根据目录下是否检测到train
#  dev、 test等有所变化,可以通过以下的方式取出DataSet
tr_data = data_bundle.get_dataset('train')
te_data = data_bundle.get_dataset('test')  # 如果目录下有文件包含test这个字段

2.传入一个dict,比如train,dev,test不在同一个目录下,或者名称中不包含train, dev, test:

paths = {'train':"/path/to/tr.conll", 'dev':"/to/validate.conll", "test":"/to/te.conll"}
data_bundle = xxxLoader().load(paths)  # 返回的DataBundle中的dataset中包含"train", "dev", "test"
dev_data = data_bundle.get_dataset('dev')

3.传入文件路径:

data_bundle = xxxLoader().load("/path/to/a/train.conll") # 返回DataBundle对象, datasets中仅包含'train'
tr_data = data_bundle.get_dataset('train')  # 取出DataSet
返回:返回的 DataBundle
class fastNLP.io.SST2Loader[源代码]

基类 fastNLP.io.Loader

别名 fastNLP.io.SST2Loader fastNLP.io.loader.SST2Loader

原始数据中内容为:第一行为标题(具体内容会被忽略),之后一行为一个sample,第一个制表符之前被认为是句子,第一个制表符之后认为是label

Example:

sentence        label
it 's a charming and often affecting journey .  1
unflinchingly bleak and desperate       0

读取之后DataSet将如下所示

raw_words target
it 's a charming and often affecting journey . 1
unflinchingly bleak and desperate 0
...  

test的DataSet没有target列。

download()[源代码]

自动下载数据集,如果你使用了该数据集,请引用以下的文章 https://nlp.stanford.edu/pubs/SocherBauerManningNg_ACL2013.pdf :return:

load(paths: Union[str, Dict[str, str]] = None) → fastNLP.io.data_bundle.DataBundle

从指定一个或多个路径中的文件中读取数据,返回 DataBundle

参数:Dict[str, str]] paths (Union[str,) --

支持以下的几种输入方式:

0.如果为None,则先查看本地是否有缓存,如果没有则自动下载并缓存。

1.传入一个目录, 该目录下名称包含train的被认为是train,包含test的被认为是test,包含dev的被认为是dev,如果检测到多个文件名包含'train'、 'dev'、 'test'则会报错:

data_bundle = xxxLoader().load('/path/to/dir')  # 返回的DataBundle中datasets根据目录下是否检测到train
#  dev、 test等有所变化,可以通过以下的方式取出DataSet
tr_data = data_bundle.get_dataset('train')
te_data = data_bundle.get_dataset('test')  # 如果目录下有文件包含test这个字段

2.传入一个dict,比如train,dev,test不在同一个目录下,或者名称中不包含train, dev, test:

paths = {'train':"/path/to/tr.conll", 'dev':"/to/validate.conll", "test":"/to/te.conll"}
data_bundle = xxxLoader().load(paths)  # 返回的DataBundle中的dataset中包含"train", "dev", "test"
dev_data = data_bundle.get_dataset('dev')

3.传入文件路径:

data_bundle = xxxLoader().load("/path/to/a/train.conll") # 返回DataBundle对象, datasets中仅包含'train'
tr_data = data_bundle.get_dataset('train')  # 取出DataSet
返回:返回的 DataBundle
class fastNLP.io.ChnSentiCorpLoader[源代码]

基类 fastNLP.io.Loader

别名 fastNLP.io.ChnSentiCorpLoader fastNLP.io.loader.ChnSentiCorpLoader

支持读取的数据的格式为,第一行为标题(具体内容会被忽略),之后一行为一个sample,第一个制表符之前被认为是label,第 一个制表符之后认为是句子

Example:

label   text_a
1       基金痛所有投资项目一样,必须先要有所了解...
1       系统很好装,LED屏是不错,就是16比9的比例...

读取后的DataSet具有以下的field

raw_chars target
基金痛所有投资项目一样,必须先要有所了解... 1
系统很好装,LED屏是不错,就是16比9的比例... 1
...  
download() → str[源代码]

自动下载数据,该数据取自https://github.com/pengming617/bert_classification/tree/master/data,在 https://arxiv.org/pdf/1904.09223.pdf与https://arxiv.org/pdf/1906.08101.pdf有使用

返回:
load(paths: Union[str, Dict[str, str]] = None) → fastNLP.io.data_bundle.DataBundle

从指定一个或多个路径中的文件中读取数据,返回 DataBundle

参数:Dict[str, str]] paths (Union[str,) --

支持以下的几种输入方式:

0.如果为None,则先查看本地是否有缓存,如果没有则自动下载并缓存。

1.传入一个目录, 该目录下名称包含train的被认为是train,包含test的被认为是test,包含dev的被认为是dev,如果检测到多个文件名包含'train'、 'dev'、 'test'则会报错:

data_bundle = xxxLoader().load('/path/to/dir')  # 返回的DataBundle中datasets根据目录下是否检测到train
#  dev、 test等有所变化,可以通过以下的方式取出DataSet
tr_data = data_bundle.get_dataset('train')
te_data = data_bundle.get_dataset('test')  # 如果目录下有文件包含test这个字段

2.传入一个dict,比如train,dev,test不在同一个目录下,或者名称中不包含train, dev, test:

paths = {'train':"/path/to/tr.conll", 'dev':"/to/validate.conll", "test":"/to/te.conll"}
data_bundle = xxxLoader().load(paths)  # 返回的DataBundle中的dataset中包含"train", "dev", "test"
dev_data = data_bundle.get_dataset('dev')

3.传入文件路径:

data_bundle = xxxLoader().load("/path/to/a/train.conll") # 返回DataBundle对象, datasets中仅包含'train'
tr_data = data_bundle.get_dataset('train')  # 取出DataSet
返回:返回的 DataBundle
class fastNLP.io.THUCNewsLoader[源代码]

基类 fastNLP.io.Loader

别名 fastNLP.io.THUCNewsLoader fastNLP.io.loader.THUCNewsLoader

数据集简介:document-level分类任务,新闻10分类 原始数据内容为:每行一个sample,第一个 "\t" 之前为target,第一个 "\t" 之后为raw_words

Example:

体育      调查-您如何评价热火客场胜绿军总分3-1夺赛点?...

读取后的Dataset将具有以下数据结构:

raw_words target
调查-您如何评价热火客场胜绿军总分3-1夺赛点?... 体育
... ...
download() → str[源代码]

自动下载数据,该数据取自

http://thuctc.thunlp.org/#%E4%B8%AD%E6%96%87%E6%96%87%E6%9C%AC%E5%88%86%E7%B1%BB%E6%95%B0%E6%8D%AE%E9%9B%86THUCNews

返回:
load(paths: Union[str, Dict[str, str]] = None) → fastNLP.io.data_bundle.DataBundle

从指定一个或多个路径中的文件中读取数据,返回 DataBundle

参数:Dict[str, str]] paths (Union[str,) --

支持以下的几种输入方式:

0.如果为None,则先查看本地是否有缓存,如果没有则自动下载并缓存。

1.传入一个目录, 该目录下名称包含train的被认为是train,包含test的被认为是test,包含dev的被认为是dev,如果检测到多个文件名包含'train'、 'dev'、 'test'则会报错:

data_bundle = xxxLoader().load('/path/to/dir')  # 返回的DataBundle中datasets根据目录下是否检测到train
#  dev、 test等有所变化,可以通过以下的方式取出DataSet
tr_data = data_bundle.get_dataset('train')
te_data = data_bundle.get_dataset('test')  # 如果目录下有文件包含test这个字段

2.传入一个dict,比如train,dev,test不在同一个目录下,或者名称中不包含train, dev, test:

paths = {'train':"/path/to/tr.conll", 'dev':"/to/validate.conll", "test":"/to/te.conll"}
data_bundle = xxxLoader().load(paths)  # 返回的DataBundle中的dataset中包含"train", "dev", "test"
dev_data = data_bundle.get_dataset('dev')

3.传入文件路径:

data_bundle = xxxLoader().load("/path/to/a/train.conll") # 返回DataBundle对象, datasets中仅包含'train'
tr_data = data_bundle.get_dataset('train')  # 取出DataSet
返回:返回的 DataBundle
class fastNLP.io.WeiboSenti100kLoader[源代码]

基类 fastNLP.io.Loader

别名 fastNLP.io.WeiboSenti100kLoader fastNLP.io.loader.WeiboSenti100kLoader

别名: 数据集简介:微博sentiment classification,二分类

Example:

label   text
1       多谢小莲,好运满满[爱你]
1       能在他乡遇老友真不赖,哈哈,珠儿,我也要用...

读取后的Dataset将具有以下数据结构:

raw_chars target
多谢小莲,好运满满[爱你] 1
能在他乡遇老友真不赖,哈哈,珠儿,我也要用... 1
... ...
download() → str[源代码]

自动下载数据,该数据取自 https://github.com/SophonPlus/ChineseNlpCorpus/https://arxiv.org/abs/1906.08101 有使用 :return:

load(paths: Union[str, Dict[str, str]] = None) → fastNLP.io.data_bundle.DataBundle

从指定一个或多个路径中的文件中读取数据,返回 DataBundle

参数:Dict[str, str]] paths (Union[str,) --

支持以下的几种输入方式:

0.如果为None,则先查看本地是否有缓存,如果没有则自动下载并缓存。

1.传入一个目录, 该目录下名称包含train的被认为是train,包含test的被认为是test,包含dev的被认为是dev,如果检测到多个文件名包含'train'、 'dev'、 'test'则会报错:

data_bundle = xxxLoader().load('/path/to/dir')  # 返回的DataBundle中datasets根据目录下是否检测到train
#  dev、 test等有所变化,可以通过以下的方式取出DataSet
tr_data = data_bundle.get_dataset('train')
te_data = data_bundle.get_dataset('test')  # 如果目录下有文件包含test这个字段

2.传入一个dict,比如train,dev,test不在同一个目录下,或者名称中不包含train, dev, test:

paths = {'train':"/path/to/tr.conll", 'dev':"/to/validate.conll", "test":"/to/te.conll"}
data_bundle = xxxLoader().load(paths)  # 返回的DataBundle中的dataset中包含"train", "dev", "test"
dev_data = data_bundle.get_dataset('dev')

3.传入文件路径:

data_bundle = xxxLoader().load("/path/to/a/train.conll") # 返回DataBundle对象, datasets中仅包含'train'
tr_data = data_bundle.get_dataset('train')  # 取出DataSet
返回:返回的 DataBundle
class fastNLP.io.ConllLoader(headers, indexes=None, dropna=True)[源代码]

基类 fastNLP.io.Loader

别名 fastNLP.io.ConllLoader fastNLP.io.loader.ConllLoader

ConllLoader支持读取的数据格式: 以空行隔开两个sample,除了分割行,每一行用空格或者制表符隔开不同的元素。如下例所示:

Example:

# 文件中的内容
Nadim NNP B-NP B-PER
Ladki NNP I-NP I-PER

AL-AIN NNP B-NP B-LOC
United NNP B-NP B-LOC
Arab NNP I-NP I-LOC
Emirates NNPS I-NP I-LOC
1996-12-06 CD I-NP O
...

# 如果用以下的参数读取,返回的DataSet将包含raw_words和pos两个field, 这两个field的值分别取自于第0列与第1列
dataset = ConllLoader(headers=['raw_words', 'pos'], indexes=[0, 1])._load('/path/to/train.conll')
# 如果用以下的参数读取,返回的DataSet将包含raw_words和ner两个field, 这两个field的值分别取自于第0列与第2列
dataset = ConllLoader(headers=['raw_words', 'ner'], indexes=[0, 3])._load('/path/to/train.conll')
# 如果用以下的参数读取,返回的DataSet将包含raw_words, pos和ner三个field
dataset = ConllLoader(headers=['raw_words', 'pos', 'ner'], indexes=[0, 1, 3])._load('/path/to/train.conll')

ConllLoader返回的DataSet的field由传入的headers确定。

数据中以"-DOCSTART-"开头的行将被忽略,因为该符号在conll 2003中被用为文档分割符。

__init__(headers, indexes=None, dropna=True)[源代码]
参数:
  • headers (list) -- 每一列数据的名称,需为List or Tuple of str。headerindexes 一一对应
  • indexes (list) -- 需要保留的数据列下标,从0开始。若为 None ,则所有列都保留。Default: None
  • dropna (bool) -- 是否忽略非法数据,若 False ,遇到非法数据时抛出 ValueError 。Default: True
download() → str

自动下载该数据集

返回:下载后解压目录
load(paths: Union[str, Dict[str, str]] = None) → fastNLP.io.data_bundle.DataBundle

从指定一个或多个路径中的文件中读取数据,返回 DataBundle

参数:Dict[str, str]] paths (Union[str,) --

支持以下的几种输入方式:

0.如果为None,则先查看本地是否有缓存,如果没有则自动下载并缓存。

1.传入一个目录, 该目录下名称包含train的被认为是train,包含test的被认为是test,包含dev的被认为是dev,如果检测到多个文件名包含'train'、 'dev'、 'test'则会报错:

data_bundle = xxxLoader().load('/path/to/dir')  # 返回的DataBundle中datasets根据目录下是否检测到train
#  dev、 test等有所变化,可以通过以下的方式取出DataSet
tr_data = data_bundle.get_dataset('train')
te_data = data_bundle.get_dataset('test')  # 如果目录下有文件包含test这个字段

2.传入一个dict,比如train,dev,test不在同一个目录下,或者名称中不包含train, dev, test:

paths = {'train':"/path/to/tr.conll", 'dev':"/to/validate.conll", "test":"/to/te.conll"}
data_bundle = xxxLoader().load(paths)  # 返回的DataBundle中的dataset中包含"train", "dev", "test"
dev_data = data_bundle.get_dataset('dev')

3.传入文件路径:

data_bundle = xxxLoader().load("/path/to/a/train.conll") # 返回DataBundle对象, datasets中仅包含'train'
tr_data = data_bundle.get_dataset('train')  # 取出DataSet
返回:返回的 DataBundle
class fastNLP.io.Conll2003Loader[源代码]

基类 fastNLP.io.ConllLoader

别名 fastNLP.io.Conll2003Loader fastNLP.io.loader.Conll2003Loader

用于读取conll2003任务的数据。数据的内容应该类似与以下的内容, 第一列为raw_words, 第二列为pos, 第三列为chunking,第四列为ner。

Example:

Nadim NNP B-NP B-PER
Ladki NNP I-NP I-PER

AL-AIN NNP B-NP B-LOC
United NNP B-NP B-LOC
Arab NNP I-NP I-LOC
Emirates NNPS I-NP I-LOC
1996-12-06 CD I-NP O
...

返回的DataSet的内容为

下面是Conll2003Loader加载后数据具备的结构。
raw_words pos chunk ner
[Nadim, Ladki] [NNP, NNP] [B-NP, I-NP] [B-PER, I-PER]
[AL-AIN, United, Arab, ...] [NNP, NNP, NNP, ...] [B-NP, B-NP, I-NP, ...] [B-LOC, B-LOC, I-LOC, ...]
[...] [...] [...] [...]
load(paths: Union[str, Dict[str, str]] = None) → fastNLP.io.data_bundle.DataBundle

从指定一个或多个路径中的文件中读取数据,返回 DataBundle

参数:Dict[str, str]] paths (Union[str,) --

支持以下的几种输入方式:

0.如果为None,则先查看本地是否有缓存,如果没有则自动下载并缓存。

1.传入一个目录, 该目录下名称包含train的被认为是train,包含test的被认为是test,包含dev的被认为是dev,如果检测到多个文件名包含'train'、 'dev'、 'test'则会报错:

data_bundle = xxxLoader().load('/path/to/dir')  # 返回的DataBundle中datasets根据目录下是否检测到train
#  dev、 test等有所变化,可以通过以下的方式取出DataSet
tr_data = data_bundle.get_dataset('train')
te_data = data_bundle.get_dataset('test')  # 如果目录下有文件包含test这个字段

2.传入一个dict,比如train,dev,test不在同一个目录下,或者名称中不包含train, dev, test:

paths = {'train':"/path/to/tr.conll", 'dev':"/to/validate.conll", "test":"/to/te.conll"}
data_bundle = xxxLoader().load(paths)  # 返回的DataBundle中的dataset中包含"train", "dev", "test"
dev_data = data_bundle.get_dataset('dev')

3.传入文件路径:

data_bundle = xxxLoader().load("/path/to/a/train.conll") # 返回DataBundle对象, datasets中仅包含'train'
tr_data = data_bundle.get_dataset('train')  # 取出DataSet
返回:返回的 DataBundle
class fastNLP.io.Conll2003NERLoader[源代码]

基类 fastNLP.io.ConllLoader

别名 fastNLP.io.Conll2003NERLoader fastNLP.io.loader.Conll2003NERLoader

用于读取conll2003任务的NER数据。每一行有4列内容,空行意味着隔开两个句子

支持读取的内容如下 Example:

Nadim NNP B-NP B-PER
Ladki NNP I-NP I-PER

AL-AIN NNP B-NP B-LOC
United NNP B-NP B-LOC
Arab NNP I-NP I-LOC
Emirates NNPS I-NP I-LOC
1996-12-06 CD I-NP O
...

返回的DataSet的内容为

下面是Conll2003Loader加载后数据具备的结构, target是BIO2编码
raw_words target
[Nadim, Ladki] [B-PER, I-PER]
[AL-AIN, United, Arab, ...] [B-LOC, B-LOC, I-LOC, ...]
[...] [...]
load(paths: Union[str, Dict[str, str]] = None) → fastNLP.io.data_bundle.DataBundle

从指定一个或多个路径中的文件中读取数据,返回 DataBundle

参数:Dict[str, str]] paths (Union[str,) --

支持以下的几种输入方式:

0.如果为None,则先查看本地是否有缓存,如果没有则自动下载并缓存。

1.传入一个目录, 该目录下名称包含train的被认为是train,包含test的被认为是test,包含dev的被认为是dev,如果检测到多个文件名包含'train'、 'dev'、 'test'则会报错:

data_bundle = xxxLoader().load('/path/to/dir')  # 返回的DataBundle中datasets根据目录下是否检测到train
#  dev、 test等有所变化,可以通过以下的方式取出DataSet
tr_data = data_bundle.get_dataset('train')
te_data = data_bundle.get_dataset('test')  # 如果目录下有文件包含test这个字段

2.传入一个dict,比如train,dev,test不在同一个目录下,或者名称中不包含train, dev, test:

paths = {'train':"/path/to/tr.conll", 'dev':"/to/validate.conll", "test":"/to/te.conll"}
data_bundle = xxxLoader().load(paths)  # 返回的DataBundle中的dataset中包含"train", "dev", "test"
dev_data = data_bundle.get_dataset('dev')

3.传入文件路径:

data_bundle = xxxLoader().load("/path/to/a/train.conll") # 返回DataBundle对象, datasets中仅包含'train'
tr_data = data_bundle.get_dataset('train')  # 取出DataSet
返回:返回的 DataBundle
class fastNLP.io.OntoNotesNERLoader[源代码]

基类 fastNLP.io.ConllLoader

别名 fastNLP.io.OntoNotesNERLoader fastNLP.io.loader.OntoNotesNERLoader

用以读取OntoNotes的NER数据,同时也是Conll2012的NER任务数据。将OntoNote数据处理为conll格式的过程可以参考 https://github.com/yhcc/OntoNotes-5.0-NER。OntoNoteNERLoader将取第4列和第11列的内容。

读取的数据格式为:

Example:

bc/msnbc/00/msnbc_0000   0   0          Hi   UH   (TOP(FRAG(INTJ*)  -   -   -    Dan_Abrams  *   -
bc/msnbc/00/msnbc_0000   0   1    everyone   NN              (NP*)  -   -   -    Dan_Abrams  *   -
...

返回的DataSet的内容为

raw_words target
['Hi', 'everyone', '.'] ['O', 'O', 'O']
['first', 'up', 'on', 'the', 'docket'] ['O', 'O', 'O', 'O', 'O']
[...] [...]
load(paths: Union[str, Dict[str, str]] = None) → fastNLP.io.data_bundle.DataBundle

从指定一个或多个路径中的文件中读取数据,返回 DataBundle

参数:Dict[str, str]] paths (Union[str,) --

支持以下的几种输入方式:

0.如果为None,则先查看本地是否有缓存,如果没有则自动下载并缓存。

1.传入一个目录, 该目录下名称包含train的被认为是train,包含test的被认为是test,包含dev的被认为是dev,如果检测到多个文件名包含'train'、 'dev'、 'test'则会报错:

data_bundle = xxxLoader().load('/path/to/dir')  # 返回的DataBundle中datasets根据目录下是否检测到train
#  dev、 test等有所变化,可以通过以下的方式取出DataSet
tr_data = data_bundle.get_dataset('train')
te_data = data_bundle.get_dataset('test')  # 如果目录下有文件包含test这个字段

2.传入一个dict,比如train,dev,test不在同一个目录下,或者名称中不包含train, dev, test:

paths = {'train':"/path/to/tr.conll", 'dev':"/to/validate.conll", "test":"/to/te.conll"}
data_bundle = xxxLoader().load(paths)  # 返回的DataBundle中的dataset中包含"train", "dev", "test"
dev_data = data_bundle.get_dataset('dev')

3.传入文件路径:

data_bundle = xxxLoader().load("/path/to/a/train.conll") # 返回DataBundle对象, datasets中仅包含'train'
tr_data = data_bundle.get_dataset('train')  # 取出DataSet
返回:返回的 DataBundle
class fastNLP.io.CTBLoader[源代码]

基类 fastNLP.io.Loader

别名 fastNLP.io.CTBLoader fastNLP.io.loader.CTBLoader

支持加载的数据应该具备以下格式, 其中第二列为词语,第四列为pos tag,第七列为依赖树的head,第八列为依赖树的label

Example:

1       印度    _       NR      NR      _       3       nn      _       _
2       海军    _       NN      NN      _       3       nn      _       _
3       参谋长  _       NN      NN      _       5       nsubjpass       _       _
4             _       SB      SB      _       5       pass    _       _
5       解职    _       VV      VV      _       0       root    _       _

1       新华社  _       NR      NR      _       7       dep     _       _
2       新德里  _       NR      NR      _       7       dep     _       _
3       12  _       NT      NT      _       7       dep     _       _
...

读取之后DataSet具备的格式为

raw_words pos dep_head dep_label
[印度, 海军, ...] [NR, NN, SB, ...] [3, 3, ...] [nn, nn, ...]
[新华社, 新德里, ...] [NR, NR, NT, ...] [7, 7, 7, ...] [dep, dep, dep, ...]
[...] [...] [...] [...]
download()[源代码]

由于版权限制,不能提供自动下载功能。可参考

https://catalog.ldc.upenn.edu/LDC2013T21

返回:
load(paths: Union[str, Dict[str, str]] = None) → fastNLP.io.data_bundle.DataBundle

从指定一个或多个路径中的文件中读取数据,返回 DataBundle

参数:Dict[str, str]] paths (Union[str,) --

支持以下的几种输入方式:

0.如果为None,则先查看本地是否有缓存,如果没有则自动下载并缓存。

1.传入一个目录, 该目录下名称包含train的被认为是train,包含test的被认为是test,包含dev的被认为是dev,如果检测到多个文件名包含'train'、 'dev'、 'test'则会报错:

data_bundle = xxxLoader().load('/path/to/dir')  # 返回的DataBundle中datasets根据目录下是否检测到train
#  dev、 test等有所变化,可以通过以下的方式取出DataSet
tr_data = data_bundle.get_dataset('train')
te_data = data_bundle.get_dataset('test')  # 如果目录下有文件包含test这个字段

2.传入一个dict,比如train,dev,test不在同一个目录下,或者名称中不包含train, dev, test:

paths = {'train':"/path/to/tr.conll", 'dev':"/to/validate.conll", "test":"/to/te.conll"}
data_bundle = xxxLoader().load(paths)  # 返回的DataBundle中的dataset中包含"train", "dev", "test"
dev_data = data_bundle.get_dataset('dev')

3.传入文件路径:

data_bundle = xxxLoader().load("/path/to/a/train.conll") # 返回DataBundle对象, datasets中仅包含'train'
tr_data = data_bundle.get_dataset('train')  # 取出DataSet
返回:返回的 DataBundle
class fastNLP.io.MsraNERLoader[源代码]

基类 fastNLP.io.CNNERLoader

别名 fastNLP.io.MsraNERLoader fastNLP.io.loader.MsraNERLoader

读取MSRA-NER数据,数据中的格式应该类似与下列的内容

Example:

把       O
欧       B-LOC

美       B-LOC
、       O

港       B-LOC
台       B-LOC

流       O
行       O

的       O

食       O

...

读取后的DataSet包含以下的field

raw_chars target
['把', '欧'] ['O', 'B-LOC']
['美', '、'] ['B-LOC', 'O']
[...] [...]
download(dev_ratio: float = 0.1, re_download: bool = False) → str[源代码]

自动下载MSAR-NER的数据,如果你使用该数据,请引用 Gina-Anne Levow, 2006, The Third International Chinese Language Processing Bakeoff: Word Segmentation and Named Entity Recognition.

根据dev_ratio的值随机将train中的数据取出一部分作为dev数据。下载完成后在output_dir中有train.conll, test.conll, dev.conll三个文件。

参数:
  • dev_ratio (float) -- 如果路径中没有dev集,从train划分多少作为dev的数据. 如果为0,则不划分dev。
  • re_download (bool) -- 是否重新下载数据,以重新切分数据。
返回:

str, 数据集的目录地址

返回:

load(paths: Union[str, Dict[str, str]] = None) → fastNLP.io.data_bundle.DataBundle

从指定一个或多个路径中的文件中读取数据,返回 DataBundle

参数:Dict[str, str]] paths (Union[str,) --

支持以下的几种输入方式:

0.如果为None,则先查看本地是否有缓存,如果没有则自动下载并缓存。

1.传入一个目录, 该目录下名称包含train的被认为是train,包含test的被认为是test,包含dev的被认为是dev,如果检测到多个文件名包含'train'、 'dev'、 'test'则会报错:

data_bundle = xxxLoader().load('/path/to/dir')  # 返回的DataBundle中datasets根据目录下是否检测到train
#  dev、 test等有所变化,可以通过以下的方式取出DataSet
tr_data = data_bundle.get_dataset('train')
te_data = data_bundle.get_dataset('test')  # 如果目录下有文件包含test这个字段

2.传入一个dict,比如train,dev,test不在同一个目录下,或者名称中不包含train, dev, test:

paths = {'train':"/path/to/tr.conll", 'dev':"/to/validate.conll", "test":"/to/te.conll"}
data_bundle = xxxLoader().load(paths)  # 返回的DataBundle中的dataset中包含"train", "dev", "test"
dev_data = data_bundle.get_dataset('dev')

3.传入文件路径:

data_bundle = xxxLoader().load("/path/to/a/train.conll") # 返回DataBundle对象, datasets中仅包含'train'
tr_data = data_bundle.get_dataset('train')  # 取出DataSet
返回:返回的 DataBundle
class fastNLP.io.WeiboNERLoader[源代码]

基类 fastNLP.io.CNNERLoader

别名 fastNLP.io.WeiboNERLoader fastNLP.io.loader.WeiboNERLoader

读取WeiboNER数据,数据中的格式应该类似与下列的内容

Example:

       B-PER.NOM
       I-PER.NOM
       I-PER.NOM

       O

...

读取后的DataSet包含以下的field

.. csv-table::

    :header: "raw_chars", "target"

    "['老', '百', '姓']", "['B-PER.NOM', 'I-PER.NOM', 'I-PER.NOM']"
    "['心']", "['O']"
    "[...]", "[...]"
download() → str[源代码]

自动下载Weibo-NER的数据,如果你使用了该数据,请引用 Nanyun Peng and Mark Dredze, 2015, Named Entity Recognition for Chinese Social Media with Jointly Trained Embeddings.

返回:str
load(paths: Union[str, Dict[str, str]] = None) → fastNLP.io.data_bundle.DataBundle

从指定一个或多个路径中的文件中读取数据,返回 DataBundle

参数:Dict[str, str]] paths (Union[str,) --

支持以下的几种输入方式:

0.如果为None,则先查看本地是否有缓存,如果没有则自动下载并缓存。

1.传入一个目录, 该目录下名称包含train的被认为是train,包含test的被认为是test,包含dev的被认为是dev,如果检测到多个文件名包含'train'、 'dev'、 'test'则会报错:

data_bundle = xxxLoader().load('/path/to/dir')  # 返回的DataBundle中datasets根据目录下是否检测到train
#  dev、 test等有所变化,可以通过以下的方式取出DataSet
tr_data = data_bundle.get_dataset('train')
te_data = data_bundle.get_dataset('test')  # 如果目录下有文件包含test这个字段

2.传入一个dict,比如train,dev,test不在同一个目录下,或者名称中不包含train, dev, test:

paths = {'train':"/path/to/tr.conll", 'dev':"/to/validate.conll", "test":"/to/te.conll"}
data_bundle = xxxLoader().load(paths)  # 返回的DataBundle中的dataset中包含"train", "dev", "test"
dev_data = data_bundle.get_dataset('dev')

3.传入文件路径:

data_bundle = xxxLoader().load("/path/to/a/train.conll") # 返回DataBundle对象, datasets中仅包含'train'
tr_data = data_bundle.get_dataset('train')  # 取出DataSet
返回:返回的 DataBundle
class fastNLP.io.PeopleDailyNERLoader[源代码]

基类 fastNLP.io.CNNERLoader

别名 fastNLP.io.PeopleDailyNERLoader fastNLP.io.loader.PeopleDailyNERLoader

支持加载的数据格式如下

Example:

 B-ORG
 I-ORG
 I-ORG
 I-ORG

 O
 B-ORG
...

读取后的DataSet包含以下的field

target列是基于BIO的编码方式
raw_chars target
['中', '共', '中', '央'] ['B-ORG', 'I-ORG', 'I-ORG', 'I-ORG']
[...] [...]
load(paths: Union[str, Dict[str, str]] = None) → fastNLP.io.data_bundle.DataBundle

从指定一个或多个路径中的文件中读取数据,返回 DataBundle

参数:Dict[str, str]] paths (Union[str,) --

支持以下的几种输入方式:

0.如果为None,则先查看本地是否有缓存,如果没有则自动下载并缓存。

1.传入一个目录, 该目录下名称包含train的被认为是train,包含test的被认为是test,包含dev的被认为是dev,如果检测到多个文件名包含'train'、 'dev'、 'test'则会报错:

data_bundle = xxxLoader().load('/path/to/dir')  # 返回的DataBundle中datasets根据目录下是否检测到train
#  dev、 test等有所变化,可以通过以下的方式取出DataSet
tr_data = data_bundle.get_dataset('train')
te_data = data_bundle.get_dataset('test')  # 如果目录下有文件包含test这个字段

2.传入一个dict,比如train,dev,test不在同一个目录下,或者名称中不包含train, dev, test:

paths = {'train':"/path/to/tr.conll", 'dev':"/to/validate.conll", "test":"/to/te.conll"}
data_bundle = xxxLoader().load(paths)  # 返回的DataBundle中的dataset中包含"train", "dev", "test"
dev_data = data_bundle.get_dataset('dev')

3.传入文件路径:

data_bundle = xxxLoader().load("/path/to/a/train.conll") # 返回DataBundle对象, datasets中仅包含'train'
tr_data = data_bundle.get_dataset('train')  # 取出DataSet
返回:返回的 DataBundle
class fastNLP.io.CSVLoader(headers=None, sep=', ', dropna=False)[源代码]

基类 fastNLP.io.Loader

别名 fastNLP.io.CSVLoader fastNLP.io.loader.CSVLoader

读取CSV格式的数据集, 返回 DataSet
__init__(headers=None, sep=', ', dropna=False)[源代码]
参数:
  • headers (List[str]) -- CSV文件的文件头.定义每一列的属性名称,即返回的DataSet中`field`的名称 若为 None ,则将读入文件的第一行视作 headers . Default: None
  • sep (str) -- CSV文件中列与列之间的分隔符. Default: ","
  • dropna (bool) -- 是否忽略非法数据,若 True 则忽略,若 False ,在遇到非法数据时,抛出 ValueError . Default: False
download() → str

自动下载该数据集

返回:下载后解压目录
load(paths: Union[str, Dict[str, str]] = None) → fastNLP.io.data_bundle.DataBundle

从指定一个或多个路径中的文件中读取数据,返回 DataBundle

参数:Dict[str, str]] paths (Union[str,) --

支持以下的几种输入方式:

0.如果为None,则先查看本地是否有缓存,如果没有则自动下载并缓存。

1.传入一个目录, 该目录下名称包含train的被认为是train,包含test的被认为是test,包含dev的被认为是dev,如果检测到多个文件名包含'train'、 'dev'、 'test'则会报错:

data_bundle = xxxLoader().load('/path/to/dir')  # 返回的DataBundle中datasets根据目录下是否检测到train
#  dev、 test等有所变化,可以通过以下的方式取出DataSet
tr_data = data_bundle.get_dataset('train')
te_data = data_bundle.get_dataset('test')  # 如果目录下有文件包含test这个字段

2.传入一个dict,比如train,dev,test不在同一个目录下,或者名称中不包含train, dev, test:

paths = {'train':"/path/to/tr.conll", 'dev':"/to/validate.conll", "test":"/to/te.conll"}
data_bundle = xxxLoader().load(paths)  # 返回的DataBundle中的dataset中包含"train", "dev", "test"
dev_data = data_bundle.get_dataset('dev')

3.传入文件路径:

data_bundle = xxxLoader().load("/path/to/a/train.conll") # 返回DataBundle对象, datasets中仅包含'train'
tr_data = data_bundle.get_dataset('train')  # 取出DataSet
返回:返回的 DataBundle
class fastNLP.io.JsonLoader(fields=None, dropna=False)[源代码]

基类 fastNLP.io.Loader

别名 fastNLP.io.JsonLoader fastNLP.io.loader.JsonLoader

别名:fastNLP.io.JsonLoader fastNLP.io.loader.JsonLoader

读取json格式数据.数据必须按行存储,每行是一个包含各类属性的json对象

param dict fields:
 需要读入的json属性名称, 和读入后在DataSet中存储的field_name fieldskey 必须是json对象的属性名. fieldsvalue 为读入后在DataSet存储的 field_name , value 也可为 None , 这时读入后的 field_name 与json对象对应属性同名 fields 可为 None , 这时,json对象所有属性都保存在DataSet中. Default: None
param bool dropna:
 是否忽略非法数据,若 True 则忽略,若 False ,在遇到非法数据时,抛出 ValueError . Default: False
download() → str

自动下载该数据集

返回:下载后解压目录
load(paths: Union[str, Dict[str, str]] = None) → fastNLP.io.data_bundle.DataBundle

从指定一个或多个路径中的文件中读取数据,返回 DataBundle

参数:Dict[str, str]] paths (Union[str,) --

支持以下的几种输入方式:

0.如果为None,则先查看本地是否有缓存,如果没有则自动下载并缓存。

1.传入一个目录, 该目录下名称包含train的被认为是train,包含test的被认为是test,包含dev的被认为是dev,如果检测到多个文件名包含'train'、 'dev'、 'test'则会报错:

data_bundle = xxxLoader().load('/path/to/dir')  # 返回的DataBundle中datasets根据目录下是否检测到train
#  dev、 test等有所变化,可以通过以下的方式取出DataSet
tr_data = data_bundle.get_dataset('train')
te_data = data_bundle.get_dataset('test')  # 如果目录下有文件包含test这个字段

2.传入一个dict,比如train,dev,test不在同一个目录下,或者名称中不包含train, dev, test:

paths = {'train':"/path/to/tr.conll", 'dev':"/to/validate.conll", "test":"/to/te.conll"}
data_bundle = xxxLoader().load(paths)  # 返回的DataBundle中的dataset中包含"train", "dev", "test"
dev_data = data_bundle.get_dataset('dev')

3.传入文件路径:

data_bundle = xxxLoader().load("/path/to/a/train.conll") # 返回DataBundle对象, datasets中仅包含'train'
tr_data = data_bundle.get_dataset('train')  # 取出DataSet
返回:返回的 DataBundle
class fastNLP.io.CWSLoader(dataset_name: str = None)[源代码]

基类 fastNLP.io.Loader

别名 fastNLP.io.CWSLoader fastNLP.io.loader.CWSLoader

CWSLoader支持的数据格式为,一行一句话,不同词之间用空格隔开, 例如:

Example:

上海 浦东 开发 与 法制 建设 同步
新华社 上海 二月 十日 电 ( 记者 谢金虎 、 张持坚 )
...

该Loader读取后的DataSet具有如下的结构

raw_words
上海 浦东 开发 与 法制 建设 同步
新华社 上海 二月 十日 电 ( 记者 谢金虎 、 张持坚 )
...
__init__(dataset_name: str = None)[源代码]
参数:dataset_name (str) -- data的名称,支持pku, msra, cityu(繁体), as(繁体), None
download(dev_ratio=0.1, re_download=False) → str[源代码]

如果你使用了该数据集,请引用以下的文章:Thomas Emerson, The Second International Chinese Word Segmentation Bakeoff, 2005. 更多信息可以在http://sighan.cs.uchicago.edu/bakeoff2005/查看

参数:
  • dev_ratio (float) -- 如果路径中没有dev集,从train划分多少作为dev的数据. 如果为0,则不划分dev。
  • re_download (bool) -- 是否重新下载数据,以重新切分数据。
返回:

str

load(paths: Union[str, Dict[str, str]] = None) → fastNLP.io.data_bundle.DataBundle

从指定一个或多个路径中的文件中读取数据,返回 DataBundle

参数:Dict[str, str]] paths (Union[str,) --

支持以下的几种输入方式:

0.如果为None,则先查看本地是否有缓存,如果没有则自动下载并缓存。

1.传入一个目录, 该目录下名称包含train的被认为是train,包含test的被认为是test,包含dev的被认为是dev,如果检测到多个文件名包含'train'、 'dev'、 'test'则会报错:

data_bundle = xxxLoader().load('/path/to/dir')  # 返回的DataBundle中datasets根据目录下是否检测到train
#  dev、 test等有所变化,可以通过以下的方式取出DataSet
tr_data = data_bundle.get_dataset('train')
te_data = data_bundle.get_dataset('test')  # 如果目录下有文件包含test这个字段

2.传入一个dict,比如train,dev,test不在同一个目录下,或者名称中不包含train, dev, test:

paths = {'train':"/path/to/tr.conll", 'dev':"/to/validate.conll", "test":"/to/te.conll"}
data_bundle = xxxLoader().load(paths)  # 返回的DataBundle中的dataset中包含"train", "dev", "test"
dev_data = data_bundle.get_dataset('dev')

3.传入文件路径:

data_bundle = xxxLoader().load("/path/to/a/train.conll") # 返回DataBundle对象, datasets中仅包含'train'
tr_data = data_bundle.get_dataset('train')  # 取出DataSet
返回:返回的 DataBundle
class fastNLP.io.MNLILoader[源代码]

基类 fastNLP.io.Loader

别名 fastNLP.io.MNLILoader fastNLP.io.loader.MNLILoader

读取的数据格式为:

Example:

index   promptID        pairID  genre   sentence1_binary_parse  sentence2_binary_parse  sentence1_parse sentence2_parse sentence1       sentence2       label1  gold_label
0       31193   31193n  government      ( ( Conceptually ( cream skimming ) ) ...
1       101457  101457e telephone       ( you ( ( know ( during ( ( ( the season ) and ) ( i guess ) ) )...
...

读取MNLI任务的数据,读取之后的DataSet中包含以下的内容,words0是sentence1, words1是sentence2, target是gold_label, 测试集中没 有target列。

raw_words1 raw_words2 target
Conceptually cream ... Product and geography... neutral
you know during the ... You lose the things to the... entailment
... ... ...
download()[源代码]

如果你使用了这个数据,请引用

https://www.nyu.edu/projects/bowman/multinli/paper.pdf :return:

load(paths: str = None)[源代码]
参数:paths (str) -- 传入数据所在目录,会在该目录下寻找dev_matched.tsv, dev_mismatched.tsv, test_matched.tsv, test_mismatched.tsv, train.tsv文件夹
返回:DataBundle
class fastNLP.io.QuoraLoader[源代码]

基类 fastNLP.io.Loader

别名 fastNLP.io.QuoraLoader fastNLP.io.loader.QuoraLoader

Quora matching任务的数据集Loader

支持读取的文件中的内容,应该有以下的形式, 以制表符分隔,且前三列的内容必须是:第一列是label,第二列和第三列是句子

Example:

1       How do I get funding for my web based startup idea ?    How do I get seed funding pre product ? 327970
0       Is honey a viable alternative to sugar for diabetics ?  How would you compare the United States ' euthanasia laws to Denmark ?  90348
...

加载的DataSet将具备以下的field

raw_words1 raw_words2 target
How do I get funding for my web based... How do I get seed funding... 1
Is honey a viable alternative ... How would you compare the United... 0
... ... ...
download()[源代码]

由于版权限制,不能提供自动下载功能。可参考

https://www.kaggle.com/c/quora-question-pairs/data

返回:
load(paths: Union[str, Dict[str, str]] = None) → fastNLP.io.data_bundle.DataBundle

从指定一个或多个路径中的文件中读取数据,返回 DataBundle

参数:Dict[str, str]] paths (Union[str,) --

支持以下的几种输入方式:

0.如果为None,则先查看本地是否有缓存,如果没有则自动下载并缓存。

1.传入一个目录, 该目录下名称包含train的被认为是train,包含test的被认为是test,包含dev的被认为是dev,如果检测到多个文件名包含'train'、 'dev'、 'test'则会报错:

data_bundle = xxxLoader().load('/path/to/dir')  # 返回的DataBundle中datasets根据目录下是否检测到train
#  dev、 test等有所变化,可以通过以下的方式取出DataSet
tr_data = data_bundle.get_dataset('train')
te_data = data_bundle.get_dataset('test')  # 如果目录下有文件包含test这个字段

2.传入一个dict,比如train,dev,test不在同一个目录下,或者名称中不包含train, dev, test:

paths = {'train':"/path/to/tr.conll", 'dev':"/to/validate.conll", "test":"/to/te.conll"}
data_bundle = xxxLoader().load(paths)  # 返回的DataBundle中的dataset中包含"train", "dev", "test"
dev_data = data_bundle.get_dataset('dev')

3.传入文件路径:

data_bundle = xxxLoader().load("/path/to/a/train.conll") # 返回DataBundle对象, datasets中仅包含'train'
tr_data = data_bundle.get_dataset('train')  # 取出DataSet
返回:返回的 DataBundle
class fastNLP.io.SNLILoader[源代码]

基类 fastNLP.io.JsonLoader

别名 fastNLP.io.SNLILoader fastNLP.io.loader.SNLILoader

文件每一行是一个sample,每一行都为一个json对象,其数据格式为:

Example:

{"annotator_labels": ["neutral", "entailment", "neutral", "neutral", "neutral"], "captionID": "4705552913.jpg#2",
 "gold_label": "neutral", "pairID": "4705552913.jpg#2r1n",
 "sentence1": "Two women are embracing while holding to go packages.",
 "sentence1_binary_parse": "( ( Two women ) ( ( are ( embracing ( while ( holding ( to ( go packages ) ) ) ) ) ) . ) )",
 "sentence1_parse": "(ROOT (S (NP (CD Two) (NNS women)) (VP (VBP are) (VP (VBG embracing) (SBAR (IN while) (S (NP (VBG holding)) (VP (TO to) (VP (VB go) (NP (NNS packages)))))))) (. .)))",
 "sentence2": "The sisters are hugging goodbye while holding to go packages after just eating lunch.",
 "sentence2_binary_parse": "( ( The sisters ) ( ( are ( ( hugging goodbye ) ( while ( holding ( to ( ( go packages ) ( after ( just ( eating lunch ) ) ) ) ) ) ) ) ) . ) )",
 "sentence2_parse": "(ROOT (S (NP (DT The) (NNS sisters)) (VP (VBP are) (VP (VBG hugging) (NP (UH goodbye)) (PP (IN while) (S (VP (VBG holding) (S (VP (TO to) (VP (VB go) (NP (NNS packages)) (PP (IN after) (S (ADVP (RB just)) (VP (VBG eating) (NP (NN lunch))))))))))))) (. .)))"
 }

读取之后的DataSet中的field情况为

下面是使用SNLILoader加载的DataSet所具备的field
target raw_words1 raw_words2  
neutral Two women are embracing while holding.. The sisters are hugging goodbye...  
entailment Two women are embracing while holding... Two woman are holding packages.  
... ... ...  
download()[源代码]

如果您的文章使用了这份数据,请引用

http://nlp.stanford.edu/pubs/snli_paper.pdf

返回:str
load(paths: Union[str, Dict[str, str]] = None) → fastNLP.io.data_bundle.DataBundle[源代码]

从指定一个或多个路径中的文件中读取数据,返回 DataBundle

读取的field根据Loader初始化时传入的field决定。

参数:paths (str) -- 传入一个目录, 将在该目录下寻找snli_1.0_train.jsonl, snli_1.0_dev.jsonl 和snli_1.0_test.jsonl三个文件。
返回:返回的 DataBundle
class fastNLP.io.QNLILoader[源代码]

基类 fastNLP.io.JsonLoader

别名 fastNLP.io.QNLILoader fastNLP.io.loader.QNLILoader

第一行为标题(具体内容会被忽略),之后每一行是一个sample,由index、问题、句子和标签构成(以制表符分割),数据结构如下:

Example:

index   question        sentence        label
0       What came into force after the new constitution was herald?     As of that day, the new constitution heralding the Second Republic came into force.     entailment

QNLI数据集的Loader, 加载的DataSet将具备以下的field, raw_words1是question, raw_words2是sentence, target是label

raw_words1 raw_words2 target
What came into force after the new... As of that day... entailment
... .  

test数据集没有target列

download()[源代码]

如果您的实验使用到了该数据,请引用

https://arxiv.org/pdf/1809.05053.pdf

返回:
load(paths: Union[str, Dict[str, str]] = None) → fastNLP.io.data_bundle.DataBundle

从指定一个或多个路径中的文件中读取数据,返回 DataBundle

参数:Dict[str, str]] paths (Union[str,) --

支持以下的几种输入方式:

0.如果为None,则先查看本地是否有缓存,如果没有则自动下载并缓存。

1.传入一个目录, 该目录下名称包含train的被认为是train,包含test的被认为是test,包含dev的被认为是dev,如果检测到多个文件名包含'train'、 'dev'、 'test'则会报错:

data_bundle = xxxLoader().load('/path/to/dir')  # 返回的DataBundle中datasets根据目录下是否检测到train
#  dev、 test等有所变化,可以通过以下的方式取出DataSet
tr_data = data_bundle.get_dataset('train')
te_data = data_bundle.get_dataset('test')  # 如果目录下有文件包含test这个字段

2.传入一个dict,比如train,dev,test不在同一个目录下,或者名称中不包含train, dev, test:

paths = {'train':"/path/to/tr.conll", 'dev':"/to/validate.conll", "test":"/to/te.conll"}
data_bundle = xxxLoader().load(paths)  # 返回的DataBundle中的dataset中包含"train", "dev", "test"
dev_data = data_bundle.get_dataset('dev')

3.传入文件路径:

data_bundle = xxxLoader().load("/path/to/a/train.conll") # 返回DataBundle对象, datasets中仅包含'train'
tr_data = data_bundle.get_dataset('train')  # 取出DataSet
返回:返回的 DataBundle
class fastNLP.io.RTELoader[源代码]

基类 fastNLP.io.Loader

别名 fastNLP.io.RTELoader fastNLP.io.loader.RTELoader

第一行为标题(具体内容会被忽略),之后每一行是一个sample,由index、句子1、句子2和标签构成(以制表符分割),数据结构如下:

Example:

index   sentence1       sentence2       label
0       Dana Reeve, the widow of the actor Christopher Reeve, has died of lung cancer at age 44, according to the Christopher Reeve Foundation. Christopher Reeve had an accident.      not_entailment

RTE数据的loader 加载的DataSet将具备以下的field, raw_words1是sentence0,raw_words2是sentence1, target是label

raw_words1 raw_words2 target
Dana Reeve, the widow of the actor... Christopher Reeve had an... not_entailment
... ...  

test数据集没有target列

download()[源代码]

如果您的实验使用到了该数据,请引用GLUE Benchmark

https://openreview.net/pdf?id=rJ4km2R5t7

返回:
load(paths: Union[str, Dict[str, str]] = None) → fastNLP.io.data_bundle.DataBundle

从指定一个或多个路径中的文件中读取数据,返回 DataBundle

参数:Dict[str, str]] paths (Union[str,) --

支持以下的几种输入方式:

0.如果为None,则先查看本地是否有缓存,如果没有则自动下载并缓存。

1.传入一个目录, 该目录下名称包含train的被认为是train,包含test的被认为是test,包含dev的被认为是dev,如果检测到多个文件名包含'train'、 'dev'、 'test'则会报错:

data_bundle = xxxLoader().load('/path/to/dir')  # 返回的DataBundle中datasets根据目录下是否检测到train
#  dev、 test等有所变化,可以通过以下的方式取出DataSet
tr_data = data_bundle.get_dataset('train')
te_data = data_bundle.get_dataset('test')  # 如果目录下有文件包含test这个字段

2.传入一个dict,比如train,dev,test不在同一个目录下,或者名称中不包含train, dev, test:

paths = {'train':"/path/to/tr.conll", 'dev':"/to/validate.conll", "test":"/to/te.conll"}
data_bundle = xxxLoader().load(paths)  # 返回的DataBundle中的dataset中包含"train", "dev", "test"
dev_data = data_bundle.get_dataset('dev')

3.传入文件路径:

data_bundle = xxxLoader().load("/path/to/a/train.conll") # 返回DataBundle对象, datasets中仅包含'train'
tr_data = data_bundle.get_dataset('train')  # 取出DataSet
返回:返回的 DataBundle
class fastNLP.io.CNXNLILoader[源代码]

基类 fastNLP.io.Loader

别名 fastNLP.io.CNXNLILoader fastNLP.io.loader.CNXNLILoader

数据集简介:中文句对NLI(本为multi-lingual的数据集,但是这里只取了中文的数据集)。原句子已被MOSES tokenizer处理,这里我们将其还原并重新按字tokenize 原始数据数据为:

Example:

premise hypo    label
我们 家里  一个    找到  可以   时间 我们 家里  一个   从来 没有 时间 使用  .  entailment

dev和test中的数据为csv或json格式,包括十多个field,这里只取与以上三个field中的数据 读取后的Dataset将具有以下数据结构:

raw_chars1 raw_chars2 target
我们 家里 有 一个 但 我 没 找到 我 可以 用 的 时间 我们 家里 有 一个 但 我 从来 没有 时间 使用 它 . 0
... ... ...
download() → str[源代码]

自动下载数据,该数据取自 https://arxiv.org/abs/1809.05053https://arxiv.org/pdf/1905.05526.pdf https://arxiv.org/pdf/1901.10125.pdf https://arxiv.org/pdf/1809.05053.pdf 有使用 :return:

class fastNLP.io.BQCorpusLoader[源代码]

基类 fastNLP.io.Loader

别名 fastNLP.io.BQCorpusLoader fastNLP.io.loader.BQCorpusLoader

别名: 数据集简介:句子对二分类任务(判断是否具有相同的语义) 原始数据结构为:

Example:

sentence1,sentence2,label
综合评分不足什么原因,综合评估的依据,0
什么时候我能使用微粒贷,你就赶快给我开通就行了,0

读取后的Dataset将具有以下数据结构:

raw_chars1 raw_chars2 target
综合评分不足什么原因 综合评估的依据 0
什么时候我能使用微粒贷 你就赶快给我开通就行了 0
... ... ...
download()[源代码]

由于版权限制,不能提供自动下载功能。可参考

https://github.com/ymcui/Chinese-BERT-wwm

返回:
load(paths: Union[str, Dict[str, str]] = None) → fastNLP.io.data_bundle.DataBundle

从指定一个或多个路径中的文件中读取数据,返回 DataBundle

参数:Dict[str, str]] paths (Union[str,) --

支持以下的几种输入方式:

0.如果为None,则先查看本地是否有缓存,如果没有则自动下载并缓存。

1.传入一个目录, 该目录下名称包含train的被认为是train,包含test的被认为是test,包含dev的被认为是dev,如果检测到多个文件名包含'train'、 'dev'、 'test'则会报错:

data_bundle = xxxLoader().load('/path/to/dir')  # 返回的DataBundle中datasets根据目录下是否检测到train
#  dev、 test等有所变化,可以通过以下的方式取出DataSet
tr_data = data_bundle.get_dataset('train')
te_data = data_bundle.get_dataset('test')  # 如果目录下有文件包含test这个字段

2.传入一个dict,比如train,dev,test不在同一个目录下,或者名称中不包含train, dev, test:

paths = {'train':"/path/to/tr.conll", 'dev':"/to/validate.conll", "test":"/to/te.conll"}
data_bundle = xxxLoader().load(paths)  # 返回的DataBundle中的dataset中包含"train", "dev", "test"
dev_data = data_bundle.get_dataset('dev')

3.传入文件路径:

data_bundle = xxxLoader().load("/path/to/a/train.conll") # 返回DataBundle对象, datasets中仅包含'train'
tr_data = data_bundle.get_dataset('train')  # 取出DataSet
返回:返回的 DataBundle
class fastNLP.io.LCQMCLoader[源代码]

基类 fastNLP.io.Loader

别名 fastNLP.io.LCQMCLoader fastNLP.io.loader.LCQMCLoader

数据集简介:句对匹配(question matching)

原始数据为:

Example:

喜欢打篮球的男生喜欢什么样的女生        爱打篮球的男生喜欢什么样的女生 1
你帮我设计小说的封面吧     谁能帮我给小说设计个封面?   0

读取后的Dataset将具有以下的数据结构

raw_chars1 raw_chars2 target
喜欢打篮球的男生喜欢什么样的女生 爱打篮球的男生喜欢什么样的女生 1
你帮我设计小说的封面吧 妇可以戴耳机听音乐吗? 0
... ... ...
download()[源代码]

由于版权限制,不能提供自动下载功能。可参考

https://github.com/ymcui/Chinese-BERT-wwm

返回:
load(paths: Union[str, Dict[str, str]] = None) → fastNLP.io.data_bundle.DataBundle

从指定一个或多个路径中的文件中读取数据,返回 DataBundle

参数:Dict[str, str]] paths (Union[str,) --

支持以下的几种输入方式:

0.如果为None,则先查看本地是否有缓存,如果没有则自动下载并缓存。

1.传入一个目录, 该目录下名称包含train的被认为是train,包含test的被认为是test,包含dev的被认为是dev,如果检测到多个文件名包含'train'、 'dev'、 'test'则会报错:

data_bundle = xxxLoader().load('/path/to/dir')  # 返回的DataBundle中datasets根据目录下是否检测到train
#  dev、 test等有所变化,可以通过以下的方式取出DataSet
tr_data = data_bundle.get_dataset('train')
te_data = data_bundle.get_dataset('test')  # 如果目录下有文件包含test这个字段

2.传入一个dict,比如train,dev,test不在同一个目录下,或者名称中不包含train, dev, test:

paths = {'train':"/path/to/tr.conll", 'dev':"/to/validate.conll", "test":"/to/te.conll"}
data_bundle = xxxLoader().load(paths)  # 返回的DataBundle中的dataset中包含"train", "dev", "test"
dev_data = data_bundle.get_dataset('dev')

3.传入文件路径:

data_bundle = xxxLoader().load("/path/to/a/train.conll") # 返回DataBundle对象, datasets中仅包含'train'
tr_data = data_bundle.get_dataset('train')  # 取出DataSet
返回:返回的 DataBundle
class fastNLP.io.CMRC2018Loader[源代码]

基类 fastNLP.io.Loader

别名 fastNLP.io.CMRC2018Loader fastNLP.io.loader.qa.CMRC2018Loader

请直接使用从fastNLP下载的数据进行处理。该数据集未提供测试集,测试需要通过上传到对应的系统进行评测

读取之后训练集DataSet将具备以下的内容,每个问题的答案只有一个

:header:"title", "context", "question", "answers", "answer_starts", "id"
范廷颂 范廷颂枢机(,),圣名保禄·若瑟()... 范廷颂是什么时候被任为主教的? ["1963年"] ["30"] TRAIN_186_QUERY_0
范廷颂 范廷颂枢机(,),圣名保禄·若瑟()... 1990年,范廷颂担任什么职务? ["1990年被擢升为天..."] ["41"] TRAIN_186_QUERY_1
... ... ... ... . ...

其中title是文本的标题,多条记录可能是相同的title;id是该问题的id,具备唯一性

验证集DataSet将具备以下的内容,每个问题的答案可能有三个(有时候只是3个重复的答案)

title context question answers answer_starts id
战国无双3 《战国无双3》()是由光荣和ω-force开发... 《战国无双3》是由哪两个公司合作开发的? ['光荣和ω-force', '光荣和ω-force', '光荣和ω-force'] [30, 30, 30] DEV_0_QUERY_0
战国无双3 《战国无双3》()是由光荣和ω-force开发... 男女主角亦有专属声优这一模式是由谁改编的? ['村雨城', '村雨城', '任天堂游戏谜之村雨城'] [226, 226, 219] DEV_0_QUERY_1
... ... ... ... . ...

其中answer_starts是从0开始的index。例如"我来自a复旦大学?",其中"复"的开始index为4。另外"Russell评价说"中的说的index为9, 因为 英文和数字都直接按照character计量的。

download() → str[源代码]

如果您使用了本数据,请引用A Span-Extraction Dataset for Chinese Machine Reading Comprehension. Yiming Cui, Ting Liu, etc.

返回:
load(paths: Union[str, Dict[str, str]] = None) → fastNLP.io.data_bundle.DataBundle

从指定一个或多个路径中的文件中读取数据,返回 DataBundle

参数:Dict[str, str]] paths (Union[str,) --

支持以下的几种输入方式:

0.如果为None,则先查看本地是否有缓存,如果没有则自动下载并缓存。

1.传入一个目录, 该目录下名称包含train的被认为是train,包含test的被认为是test,包含dev的被认为是dev,如果检测到多个文件名包含'train'、 'dev'、 'test'则会报错:

data_bundle = xxxLoader().load('/path/to/dir')  # 返回的DataBundle中datasets根据目录下是否检测到train
#  dev、 test等有所变化,可以通过以下的方式取出DataSet
tr_data = data_bundle.get_dataset('train')
te_data = data_bundle.get_dataset('test')  # 如果目录下有文件包含test这个字段

2.传入一个dict,比如train,dev,test不在同一个目录下,或者名称中不包含train, dev, test:

paths = {'train':"/path/to/tr.conll", 'dev':"/to/validate.conll", "test":"/to/te.conll"}
data_bundle = xxxLoader().load(paths)  # 返回的DataBundle中的dataset中包含"train", "dev", "test"
dev_data = data_bundle.get_dataset('dev')

3.传入文件路径:

data_bundle = xxxLoader().load("/path/to/a/train.conll") # 返回DataBundle对象, datasets中仅包含'train'
tr_data = data_bundle.get_dataset('train')  # 取出DataSet
返回:返回的 DataBundle
class fastNLP.io.Pipe[源代码]

别名 fastNLP.io.Pipe fastNLP.io.pipe.Pipe

Pipe是fastNLP中用于处理DataBundle的类,但实际是处理DataBundle中的DataSet。所有Pipe都会在其process()函数的文档中指出该Pipe可处理的DataSet应该具备怎样的格式;在Pipe 文档中说明该Pipe返回后DataSet的格式以及其field的信息;以及新增的Vocabulary的信息。

一般情况下Pipe处理包含以下的几个过程,(1)将raw_words或raw_chars进行tokenize以切分成不同的词或字; (2) 再建立词或字的 Vocabulary , 并将词或字转换为index; (3)将target列建立词表并将target列转为index;

Pipe中提供了两个方法

-process()函数,输入为DataBundle -process_from_file()函数,输入为对应Loader的load函数可接受的类型。

__init__

Initialize self. See help(type(self)) for accurate signature.

process(data_bundle: fastNLP.io.data_bundle.DataBundle) → fastNLP.io.data_bundle.DataBundle[源代码]

对输入的DataBundle进行处理,然后返回该DataBundle。

参数:data_bundle (DataBundle) -- 需要处理的DataBundle对象
返回:
process_from_file(paths) → fastNLP.io.data_bundle.DataBundle[源代码]

传入文件路径,生成处理好的DataBundle对象。paths支持的路径形式可以参考 :fastNLP.io.Loader.load()

参数:paths --
返回:DataBundle
class fastNLP.io.AGsNewsPipe(lower: bool = False, tokenizer: str = 'spacy')[源代码]

基类 fastNLP.io.CLSBasePipe

别名 fastNLP.io.AGsNewsPipe fastNLP.io.pipe.AGsNewsPipe

处理AG's News的数据, 处理之后DataSet中的内容如下

下面是使用AGsNewsPipe处理后的DataSet所具备的field
raw_words target words seq_len
I got 'new' tires from them and within... 0 [7, 110, 22, 107, 22, 499, 59, 140, 3,...] 160
Don't waste your time. We had two dif...
0 [277, 17, 278, 38, 30, 112, 24, 85, 27... 40
... . [...] .

dataset的print_field_meta()函数输出的各个field的被设置成input和target的情况为:

+-------------+-----------+--------+-------+---------+
| field_names | raw_words | target | words | seq_len |
+-------------+-----------+--------+-------+---------+
|   is_input  |   False   | False  |  True |   True  |
|  is_target  |   False   |  True  | False |  False  |
| ignore_type |           | False  | False |  False  |
|  pad_value  |           |   0    |   0   |    0    |
+-------------+-----------+--------+-------+---------+
__init__(lower: bool = False, tokenizer: str = 'spacy')[源代码]
参数:
  • lower (bool) -- 是否对输入进行小写化。
  • tokenizer (str) -- 使用哪种tokenize方式将数据切成单词。支持'spacy'和'raw'。raw使用空格作为切分。
process(data_bundle: fastNLP.io.data_bundle.DataBundle)

传入的DataSet应该具备如下的结构

raw_words target
I got 'new' tires from them and... 1
Don't waste your time. We had two... 1
... ...
参数:data_bundle --
返回:
process_from_file(paths=None)[源代码]
参数:paths (str) --
返回:DataBundle
class fastNLP.io.DBPediaPipe(lower: bool = False, tokenizer: str = 'spacy')[源代码]

基类 fastNLP.io.CLSBasePipe

别名 fastNLP.io.DBPediaPipe fastNLP.io.pipe.DBPediaPipe

处理DBPedia的数据, 处理之后DataSet中的内容如下

下面是使用DBPediaPipe处理后的DataSet所具备的field
raw_words target words seq_len
I got 'new' tires from them and within... 0 [7, 110, 22, 107, 22, 499, 59, 140, 3,...] 160
Don't waste your time. We had two dif...
0 [277, 17, 278, 38, 30, 112, 24, 85, 27... 40
... . [...] .

dataset的print_field_meta()函数输出的各个field的被设置成input和target的情况为:

+-------------+-----------+--------+-------+---------+
| field_names | raw_words | target | words | seq_len |
+-------------+-----------+--------+-------+---------+
|   is_input  |   False   | False  |  True |   True  |
|  is_target  |   False   |  True  | False |  False  |
| ignore_type |           | False  | False |  False  |
|  pad_value  |           |   0    |   0   |    0    |
+-------------+-----------+--------+-------+---------+
__init__(lower: bool = False, tokenizer: str = 'spacy')[源代码]
参数:
  • lower (bool) -- 是否对输入进行小写化。
  • tokenizer (str) -- 使用哪种tokenize方式将数据切成单词。支持'spacy'和'raw'。raw使用空格作为切分。
process(data_bundle: fastNLP.io.data_bundle.DataBundle)

传入的DataSet应该具备如下的结构

raw_words target
I got 'new' tires from them and... 1
Don't waste your time. We had two... 1
... ...
参数:data_bundle --
返回:
process_from_file(paths=None)[源代码]
参数:paths (str) --
返回:DataBundle
class fastNLP.io.YelpFullPipe(lower: bool = False, granularity=5, tokenizer: str = 'spacy')[源代码]

基类 fastNLP.io.CLSBasePipe

别名 fastNLP.io.YelpFullPipe fastNLP.io.pipe.YelpFullPipe

处理YelpFull的数据, 处理之后DataSet中的内容如下

下面是使用YelpFullPipe处理后的DataSet所具备的field
raw_words target words seq_len
I got 'new' tires from them and within... 0 [7, 110, 22, 107, 22, 499, 59, 140, 3,...] 160
Don't waste your time. We had two dif...
0 [277, 17, 278, 38, 30, 112, 24, 85, 27... 40
... . [...] .

dataset的print_field_meta()函数输出的各个field的被设置成input和target的情况为:

+-------------+-----------+--------+-------+---------+
| field_names | raw_words | target | words | seq_len |
+-------------+-----------+--------+-------+---------+
|   is_input  |   False   | False  |  True |   True  |
|  is_target  |   False   |  True  | False |  False  |
| ignore_type |           | False  | False |  False  |
|  pad_value  |           |   0    |   0   |    0    |
+-------------+-----------+--------+-------+---------+
__init__(lower: bool = False, granularity=5, tokenizer: str = 'spacy')[源代码]
参数:
  • lower (bool) -- 是否对输入进行小写化。
  • granularity (int) -- 支持2, 3, 5。若为2, 则认为是2分类问题,将1、2归为1类,4、5归为一类,丢掉2;若为3, 则有3分类问题,将 1、2归为1类,3归为1类,4、5归为1类;若为5, 则有5分类问题。
  • tokenizer (str) -- 使用哪种tokenize方式将数据切成单词。支持'spacy'和'raw'。raw使用空格作为切分。
process(data_bundle)[源代码]

传入的DataSet应该具备如下的结构

raw_words target
I got 'new' tires from them and... 1
Don't waste your time. We had two... 1
... ...
参数:data_bundle --
返回:
process_from_file(paths=None)[源代码]
参数:paths --
返回:DataBundle
class fastNLP.io.YelpPolarityPipe(lower: bool = False, tokenizer: str = 'spacy')[源代码]

基类 fastNLP.io.CLSBasePipe

别名 fastNLP.io.YelpPolarityPipe fastNLP.io.pipe.YelpPolarityPipe

处理YelpPolarity的数据, 处理之后DataSet中的内容如下

下面是使用YelpFullPipe处理后的DataSet所具备的field
raw_words target words seq_len
I got 'new' tires from them and within... 0 [7, 110, 22, 107, 22, 499, 59, 140, 3,...] 160
Don't waste your time. We had two dif...
0 [277, 17, 278, 38, 30, 112, 24, 85, 27... 40
... . [...] .

dataset的print_field_meta()函数输出的各个field的被设置成input和target的情况为:

+-------------+-----------+--------+-------+---------+
| field_names | raw_words | target | words | seq_len |
+-------------+-----------+--------+-------+---------+
|   is_input  |   False   | False  |  True |   True  |
|  is_target  |   False   |  True  | False |  False  |
| ignore_type |           | False  | False |  False  |
|  pad_value  |           |   0    |   0   |    0    |
+-------------+-----------+--------+-------+---------+
__init__(lower: bool = False, tokenizer: str = 'spacy')[源代码]
参数:
  • lower (bool) -- 是否对输入进行小写化。
  • tokenizer (str) -- 使用哪种tokenize方式将数据切成单词。支持'spacy'和'raw'。raw使用空格作为切分。
process(data_bundle: fastNLP.io.data_bundle.DataBundle)

传入的DataSet应该具备如下的结构

raw_words target
I got 'new' tires from them and... 1
Don't waste your time. We had two... 1
... ...
参数:data_bundle --
返回:
process_from_file(paths=None)[源代码]
参数:paths (str) --
返回:DataBundle
class fastNLP.io.SSTPipe(subtree=False, train_subtree=True, lower=False, granularity=5, tokenizer='spacy')[源代码]

基类 fastNLP.io.CLSBasePipe

别名 fastNLP.io.SSTPipe fastNLP.io.pipe.SSTPipe

经过该Pipe之后,DataSet中具备的field如下所示

下面是使用SSTPipe处理后的DataSet所具备的field
raw_words words target seq_len
It 's a lovely film with lovely perfor... 1 [187, 6, 5, 132, 120, 70, 132, 188, 25... 13
No one goes unindicted here , which is... 0 [191, 126, 192, 193, 194, 4, 195, 17, ... 13
... . [...] .

dataset的print_field_meta()函数输出的各个field的被设置成input和target的情况为:

+-------------+-----------+--------+-------+---------+
| field_names | raw_words | target | words | seq_len |
+-------------+-----------+--------+-------+---------+
|   is_input  |   False   | False  |  True |   True  |
|  is_target  |   False   |  True  | False |  False  |
| ignore_type |           | False  | False |  False  |
|  pad_value  |           |   0    |   0   |    0    |
+-------------+-----------+--------+-------+---------+
__init__(subtree=False, train_subtree=True, lower=False, granularity=5, tokenizer='spacy')[源代码]
参数:
  • subtree (bool) -- 是否将train, test, dev数据展开为子树,扩充数据量。 Default: False
  • train_subtree (bool) -- 是否将train集通过子树扩展数据。
  • lower (bool) -- 是否对输入进行小写化。
  • granularity (int) -- 支持2, 3, 5。若为2, 则认为是2分类问题,将0、1归为1类,3、4归为一类,丢掉2;若为3, 则有3分类问题,将 0、1归为1类,2归为1类,3、4归为1类;若为5, 则有5分类问题。
  • tokenizer (str) -- 使用哪种tokenize方式将数据切成单词。支持'spacy'和'raw'。raw使用空格作为切分。
process(data_bundle: fastNLP.io.data_bundle.DataBundle)[源代码]

对DataBundle中的数据进行预处理。输入的DataSet应该至少拥有raw_words这一列,且内容类似与

下面是使用SSTLoader读取的DataSet所具备的field
raw_words
(2 (3 (3 Effective) (2 but)) (1 (1 too-tepid)...
(3 (3 (2 If) (3 (2 you) (3 (2 sometimes) ...
...
参数:data_bundle (DataBundle) -- 需要处理的DataBundle对象
返回:
class fastNLP.io.SST2Pipe(lower=False, tokenizer='spacy')[源代码]

基类 fastNLP.io.CLSBasePipe

别名 fastNLP.io.SST2Pipe fastNLP.io.pipe.SST2Pipe

加载SST2的数据, 处理完成之后DataSet将拥有以下的field

raw_words target words seq_len
it 's a charming and often affecting j... 1 [19, 9, 6, 111, 5, 112, 113, 114, 3] 9
unflinchingly bleak and desperate 0 [115, 116, 5, 117] 4
... ... . .

dataset的print_field_meta()函数输出的各个field的被设置成input和target的情况为:

+-------------+-----------+--------+-------+---------+
| field_names | raw_words | target | words | seq_len |
+-------------+-----------+--------+-------+---------+
|   is_input  |   False   | False  |  True |   True  |
|  is_target  |   False   |  True  | False |  False  |
| ignore_type |           | False  | False |  False  |
|  pad_value  |           |   0    |   0   |    0    |
+-------------+-----------+--------+-------+---------+
__init__(lower=False, tokenizer='spacy')[源代码]
参数:
  • lower (bool) -- 是否对输入进行小写化。
  • tokenizer (str) -- 使用哪种tokenize方式将数据切成单词。支持'spacy'和'raw'。raw使用空格作为切分。
process(data_bundle: fastNLP.io.data_bundle.DataBundle)

传入的DataSet应该具备如下的结构

raw_words target
I got 'new' tires from them and... 1
Don't waste your time. We had two... 1
... ...
参数:data_bundle --
返回:
process_from_file(paths=None)[源代码]
参数:paths (str) -- 如果为None,则自动下载并缓存到fastNLP的缓存地址。
返回:DataBundle
class fastNLP.io.IMDBPipe(lower: bool = False, tokenizer: str = 'spacy')[源代码]

基类 fastNLP.io.CLSBasePipe

别名 fastNLP.io.IMDBPipe fastNLP.io.pipe.IMDBPipe

经过本Pipe处理后DataSet将如下

输出DataSet的field
raw_words target words seq_len
Bromwell High is a cartoon ... 0 [3, 5, 6, 9, ...] 20
Story of a man who has ... 1 [20, 43, 9, 10, ...] 31
... . [...] .

其中raw_words为str类型,是原文; words是转换为index的输入; target是转换为index的目标值; words列被设置为input; target列被设置为target。

dataset的print_field_meta()函数输出的各个field的被设置成input和target的情况为:

+-------------+-----------+--------+-------+---------+
| field_names | raw_words | target | words | seq_len |
+-------------+-----------+--------+-------+---------+
|   is_input  |   False   | False  |  True |   True  |
|  is_target  |   False   |  True  | False |  False  |
| ignore_type |           | False  | False |  False  |
|  pad_value  |           |   0    |   0   |    0    |
+-------------+-----------+--------+-------+---------+
__init__(lower: bool = False, tokenizer: str = 'spacy')[源代码]
参数:
  • lower (bool) -- 是否将words列的数据小写。
  • tokenizer (str) -- 使用什么tokenizer来将句子切分为words. 支持spacy, raw两种。raw即使用空格拆分。
process(data_bundle: fastNLP.io.data_bundle.DataBundle)[源代码]

期待的DataBunlde中输入的DataSet应该类似于如下,有两个field,raw_words和target,且均为str类型

输入DataSet的field
raw_words target
Bromwell High is a cartoon ... pos
Story of a man who has ... neg
... ...
参数:data_bundle (DataBunlde) -- 传入的DataBundle中的DataSet必须包含raw_words和target两个field,且raw_words列应该为str, target列应该为str。
返回:DataBundle
process_from_file(paths=None)[源代码]
参数:paths -- 支持路径类型参见 fastNLP.io.loader.Loader 的load函数。
返回:DataBundle
class fastNLP.io.ChnSentiCorpPipe(bigrams=False, trigrams=False)[源代码]

基类 fastNLP.io.Pipe

别名 fastNLP.io.ChnSentiCorpPipe fastNLP.io.pipe.ChnSentiCorpPipe

处理之后的DataSet有以下的结构

raw_chars target chars seq_len
這間酒店環境和服務態度亦算不錯,但房間空間太小~~ 1 [2, 3, 4, 5, ...] 31
<荐书> 推荐所有喜欢<红楼>... 1 [10, 21, ....] 25
...      

其中chars, seq_len是input,target是target dataset的print_field_meta()函数输出的各个field的被设置成input和target的情况为:

+-------------+-----------+--------+-------+---------+
| field_names | raw_chars | target | chars | seq_len |
+-------------+-----------+--------+-------+---------+
|   is_input  |   False   |  True  |  True |   True  |
|  is_target  |   False   |  True  | False |  False  |
| ignore_type |           | False  | False |  False  |
|  pad_value  |           |   0    |   0   |    0    |
+-------------+-----------+--------+-------+---------+
__init__(bigrams=False, trigrams=False)[源代码]
参数:
  • bigrams (bool) -- 是否增加一列bigrams. bigrams的构成是['复', '旦', '大', '学', ...]->["复旦", "旦大", ...]。如果 设置为True,返回的DataSet将有一列名为bigrams, 且已经转换为了index并设置为input,对应的vocab可以通过 data_bundle.get_vocab('bigrams')获取.
  • trigrams (bool) -- 是否增加一列trigrams. trigrams的构成是 ['复', '旦', '大', '学', ...]->["复旦大", "旦大学", ...] 。如果设置为True,返回的DataSet将有一列名为trigrams, 且已经转换为了index并设置为input,对应的vocab可以通过 data_bundle.get_vocab('trigrams')获取.
process(data_bundle: fastNLP.io.data_bundle.DataBundle)[源代码]

可以处理的DataSet应该具备以下的field

raw_chars target
這間酒店環境和服務態度亦算不錯,但房間空間太小~~ 1
<荐书> 推荐所有喜欢<红楼>... 1
...  
参数:data_bundle --
返回:
process_from_file(paths=None)[源代码]
参数:paths -- 支持路径类型参见 fastNLP.io.loader.Loader 的load函数。
返回:DataBundle
class fastNLP.io.THUCNewsPipe(bigrams=False, trigrams=False)[源代码]

基类 fastNLP.io.CLSBasePipe

别名 fastNLP.io.THUCNewsPipe fastNLP.io.pipe.THUCNewsPipe

处理之后的DataSet有以下的结构

raw_chars target chars seq_len
马晓旭意外受伤让国奥警惕 无奈大雨格外青睐殷家军记者傅亚雨沈阳报道... 0 [409, 1197, 2146, 213, ...] 746
...      

其中chars, seq_len是input,target是target dataset的print_field_meta()函数输出的各个field的被设置成input和target的情况为:

+-------------+-----------+--------+-------+---------+
| field_names | raw_chars | target | chars | seq_len |
+-------------+-----------+--------+-------+---------+
|   is_input  |   False   |  True  |  True |   True  |
|  is_target  |   False   |  True  | False |  False  |
| ignore_type |           | False  | False |  False  |
|  pad_value  |           |   0    |   0   |    0    |
+-------------+-----------+--------+-------+---------+
param bool bigrams:
 是否增加一列bigrams. bigrams的构成是['复', '旦', '大', '学', ...]->["复旦", "旦大", ...]。如果 设置为True,返回的DataSet将有一列名为bigrams, 且已经转换为了index并设置为input,对应的vocab可以通过 data_bundle.get_vocab('bigrams')获取.
param bool trigrams:
 是否增加一列trigrams. trigrams的构成是 ['复', '旦', '大', '学', ...]->["复旦大", "旦大学", ...] 。如果设置为True,返回的DataSet将有一列名为trigrams, 且已经转换为了index并设置为input,对应的vocab可以通过 data_bundle.get_vocab('trigrams')获取.
process(data_bundle: fastNLP.io.data_bundle.DataBundle)[源代码]

可处理的DataSet应具备如下的field

raw_words target
马晓旭意外受伤让国奥警惕 无奈大雨格外青睐殷家军记者傅亚雨沈阳报道 ... 体育
... ...
参数:data_bundle --
返回:
process_from_file(paths=None)[源代码]
参数:paths -- 支持路径类型参见 fastNLP.io.loader.Loader 的load函数。
返回:DataBundle
class fastNLP.io.WeiboSenti100kPipe(bigrams=False, trigrams=False)[源代码]

基类 fastNLP.io.CLSBasePipe

别名 fastNLP.io.WeiboSenti100kPipe fastNLP.io.pipe.WeiboSenti100kPipe

处理之后的DataSet有以下的结构

raw_chars target chars seq_len
六一出生的?好讽刺…… //@祭春姬:他爸爸是外星人吧 //@面孔小高:现在的孩子都怎么了 [怒][怒][怒] 0 [0, 690, 18, ...] 56
...      

其中chars, seq_len是input,target是target dataset的print_field_meta()函数输出的各个field的被设置成input和target的情况为:

+-------------+-----------+--------+-------+---------+
| field_names | raw_chars | target | chars | seq_len |
+-------------+-----------+--------+-------+---------+
|   is_input  |   False   |  True  |  True |   True  |
|  is_target  |   False   |  True  | False |  False  |
| ignore_type |           | False  | False |  False  |
|  pad_value  |           |   0    |   0   |    0    |
+-------------+-----------+--------+-------+---------+
param bool bigrams:
 是否增加一列bigrams. bigrams的构成是['复', '旦', '大', '学', ...]->["复旦", "旦大", ...]。如果 设置为True,返回的DataSet将有一列名为bigrams, 且已经转换为了index并设置为input,对应的vocab可以通过 data_bundle.get_vocab('bigrams')获取.
param bool trigrams:
 是否增加一列trigrams. trigrams的构成是 ['复', '旦', '大', '学', ...]->["复旦大", "旦大学", ...] 。如果设置为True,返回的DataSet将有一列名为trigrams, 且已经转换为了index并设置为input,对应的vocab可以通过 data_bundle.get_vocab('trigrams')获取.
process(data_bundle: fastNLP.io.data_bundle.DataBundle)[源代码]

可处理的DataSet应具备以下的field

raw_chars target
六一出生的?好讽刺…… //@祭春姬:他爸爸是外星人吧 //@面孔小高:现在的孩子都怎么了 [怒][怒][怒] 0
... ...
参数:data_bundle --
返回:
process_from_file(paths=None)[源代码]
参数:paths -- 支持路径类型参见 fastNLP.io.loader.Loader 的load函数。
返回:DataBundle
class fastNLP.io.Conll2003Pipe(chunk_encoding_type='bioes', ner_encoding_type='bioes', lower: bool = False)[源代码]

基类 fastNLP.io.Pipe

别名 fastNLP.io.Conll2003Pipe fastNLP.io.pipe.Conll2003Pipe

经过该Pipe后,DataSet中的内容如下

raw_words pos chunk ner words seq_len
[Nadim, Ladki] [0, 0] [1, 2] [1, 2] [2, 3] 2
[AL-AIN, United, Arab, ...] [1, 2...] [3, 4...] [3, 4...] [4, 5, 6,...] 6
[...] [...] [...] [...] [...] .

其中words, seq_len是input; pos, chunk, ner, seq_len是target dataset的print_field_meta()函数输出的各个field的被设置成input和target的情况为:

+-------------+-----------+-------+-------+-------+-------+---------+
| field_names | raw_words |  pos  | chunk |  ner  | words | seq_len |
+-------------+-----------+-------+-------+-------+-------+---------+
|   is_input  |   False   | False | False | False |  True |   True  |
|  is_target  |   False   |  True |  True |  True | False |   True  |
| ignore_type |           | False | False | False | False |  False  |
|  pad_value  |           |   0   |   0   |   0   |   0   |    0    |
+-------------+-----------+-------+-------+-------+-------+---------+
__init__(chunk_encoding_type='bioes', ner_encoding_type='bioes', lower: bool = False)[源代码]
参数:
  • chunk_encoding_type (str) -- 支持bioes, bio。
  • ner_encoding_type (str) -- 支持bioes, bio。
  • lower (bool) -- 是否将words列小写化后再建立词表
process(data_bundle) → fastNLP.io.data_bundle.DataBundle[源代码]

输入的DataSet应该类似于如下的形式

raw_words pos chunk ner  
[Nadim, Ladki] [NNP, NNP] [B-NP, I-NP] [B-PER, I-PER]  
[AL-AIN, United, Arab, ...] [NNP, NNP...] [B-NP, B-NP, ...] [B-LOC, B-LOC,...]  
[...] [...] [...] [...] .
参数:data_bundle --
返回:传入的DataBundle
process_from_file(paths)[源代码]
参数:paths --
返回:
class fastNLP.io.Conll2003NERPipe(encoding_type: str = 'bio', lower: bool = False)[源代码]

基类 fastNLP.io._NERPipe

别名 fastNLP.io.Conll2003NERPipe fastNLP.io.pipe.Conll2003NERPipe

Conll2003的NER任务的处理Pipe, 该Pipe会(1)复制raw_words列,并命名为words; (2)在words, target列建立词表 (创建 fastNLP.Vocabulary 对象,所以在返回的DataBundle中将有两个Vocabulary); (3)将words,target列根据相应的 Vocabulary转换为index。 经过该Pipe过后,DataSet中的内容如下所示

Following is a demo layout of DataSet returned by Conll2003Loader
raw_words target words seq_len
[Nadim, Ladki] [1, 2] [2, 3] 2
[AL-AIN, United, Arab, ...] [3, 4,...] [4, 5, 6,...] 6
[...] [...] [...] .

raw_words列为List[str], 是未转换的原始数据; words列为List[int],是转换为index的输入数据; target列是List[int],是转换为index的 target。返回的DataSet中被设置为input有words, target, seq_len; 设置为target有target。

dataset的print_field_meta()函数输出的各个field的被设置成input和target的情况为:

+-------------+-----------+--------+-------+---------+
| field_names | raw_words | target | words | seq_len |
+-------------+-----------+--------+-------+---------+
|   is_input  |   False   |  True  |  True |   True  |
|  is_target  |   False   |  True  | False |   True  |
| ignore_type |           | False  | False |  False  |
|  pad_value  |           |   0    |   0   |    0    |
+-------------+-----------+--------+-------+---------+
__init__(encoding_type: str = 'bio', lower: bool = False)
Param:str encoding_type: target列使用什么类型的encoding方式,支持bioes, bio两种。
参数:lower (bool) -- 是否将words小写化后再建立词表,绝大多数情况都不需要设置为True。
process(data_bundle: fastNLP.io.data_bundle.DataBundle) → fastNLP.io.data_bundle.DataBundle

支持的DataSet的field为

raw_words target
[Nadim, Ladki] [B-PER, I-PER]
[AL-AIN, United, Arab, ...] [B-LOC, B-LOC, I-LOC, ...]
[...] [...]
参数:data_bundle (DataBundle) -- 传入的DataBundle中的DataSet必须包含raw_words和ner两个field,且两个field的内容均为List[str]在传入DataBundle基础上原位修改。
Return DataBundle:
 
process_from_file(paths) → fastNLP.io.data_bundle.DataBundle[源代码]
参数:paths -- 支持路径类型参见 fastNLP.io.loader.ConllLoader 的load函数。
返回:DataBundle
class fastNLP.io.OntoNotesNERPipe(encoding_type: str = 'bio', lower: bool = False)[源代码]

基类 fastNLP.io._NERPipe

别名 fastNLP.io.OntoNotesNERPipe fastNLP.io.pipe.OntoNotesNERPipe

处理OntoNotes的NER数据,处理之后DataSet中的field情况为

raw_words target words seq_len
[Nadim, Ladki] [1, 2] [2, 3] 2
[AL-AIN, United, Arab, ...] [3, 4] [4, 5, 6,...] 6
[...] [...] [...] .

raw_words列为List[str], 是未转换的原始数据; words列为List[int],是转换为index的输入数据; target列是List[int],是转换为index的 target。返回的DataSet中被设置为input有words, target, seq_len; 设置为target有target。

dataset的print_field_meta()函数输出的各个field的被设置成input和target的情况为:

+-------------+-----------+--------+-------+---------+
| field_names | raw_words | target | words | seq_len |
+-------------+-----------+--------+-------+---------+
|   is_input  |   False   |  True  |  True |   True  |
|  is_target  |   False   |  True  | False |   True  |
| ignore_type |           | False  | False |  False  |
|  pad_value  |           |   0    |   0   |    0    |
+-------------+-----------+--------+-------+---------+
__init__(encoding_type: str = 'bio', lower: bool = False)
Param:str encoding_type: target列使用什么类型的encoding方式,支持bioes, bio两种。
参数:lower (bool) -- 是否将words小写化后再建立词表,绝大多数情况都不需要设置为True。
process(data_bundle: fastNLP.io.data_bundle.DataBundle) → fastNLP.io.data_bundle.DataBundle

支持的DataSet的field为

raw_words target
[Nadim, Ladki] [B-PER, I-PER]
[AL-AIN, United, Arab, ...] [B-LOC, B-LOC, I-LOC, ...]
[...] [...]
参数:data_bundle (DataBundle) -- 传入的DataBundle中的DataSet必须包含raw_words和ner两个field,且两个field的内容均为List[str]在传入DataBundle基础上原位修改。
Return DataBundle:
 
class fastNLP.io.MsraNERPipe(encoding_type: str = 'bio', bigrams=False, trigrams=False)[源代码]

基类 fastNLP.io._CNNERPipe

别名 fastNLP.io.MsraNERPipe fastNLP.io.pipe.MsraNERPipe

处理MSRA-NER的数据,处理之后的DataSet的field情况为

raw_chars target chars seq_len
[相, 比, 之, 下,...] [0, 0, 0, 0, ...] [2, 3, 4, 5, ...] 11
[青, 岛, 海, 牛, 队, 和, ...] [1, 2, 3, ...] [10, 21, ....] 21
[...] [...] [...] .

raw_chars列为List[str], 是未转换的原始数据; chars列为List[int],是转换为index的输入数据; target列是List[int],是转换为index的 target。返回的DataSet中被设置为input有chars, target, seq_len; 设置为target有target。

dataset的print_field_meta()函数输出的各个field的被设置成input和target的情况为:

+-------------+-----------+--------+-------+---------+
| field_names | raw_chars | target | chars | seq_len |
+-------------+-----------+--------+-------+---------+
|   is_input  |   False   |  True  |  True |   True  |
|  is_target  |   False   |  True  | False |   True  |
| ignore_type |           | False  | False |  False  |
|  pad_value  |           |   0    |   0   |    0    |
+-------------+-----------+--------+-------+---------+
__init__(encoding_type: str = 'bio', bigrams=False, trigrams=False)
参数:
  • encoding_type (str) -- target列使用什么类型的encoding方式,支持bioes, bio两种。
  • bigrams (bool) -- 是否增加一列bigrams. bigrams的构成是['复', '旦', '大', '学', ...]->["复旦", "旦大", ...]。如果 设置为True,返回的DataSet将有一列名为bigrams, 且已经转换为了index并设置为input,对应的vocab可以通过 data_bundle.get_vocab('bigrams')获取.
  • trigrams (bool) -- 是否增加一列trigrams. trigrams的构成是 ['复', '旦', '大', '学', ...]->["复旦大", "旦大学", ...] 。如果设置为True,返回的DataSet将有一列名为trigrams, 且已经转换为了index并设置为input,对应的vocab可以通过 data_bundle.get_vocab('trigrams')获取.
process(data_bundle: fastNLP.io.data_bundle.DataBundle) → fastNLP.io.data_bundle.DataBundle

支持的DataSet的field为

raw_chars target
[相, 比, 之, 下,...] [O, O, O, O, ...]
[青, 岛, 海, 牛, 队, 和, ...] [B-ORG, I-ORG, I-ORG, ...]
[...] [...]

raw_chars列为List[str], 是未转换的原始数据; chars列为List[int],是转换为index的输入数据; target列是List[int], 是转换为index的target。返回的DataSet中被设置为input有chars, target, seq_len; 设置为target有target。

参数:data_bundle (DataBundle) -- 传入的DataBundle中的DataSet必须包含raw_words和ner两个field,且两个field的内容均为List[str]。在传入DataBundle基础上原位修改。
返回:DataBundle
class fastNLP.io.PeopleDailyPipe(encoding_type: str = 'bio', bigrams=False, trigrams=False)[源代码]

基类 fastNLP.io._CNNERPipe

别名 fastNLP.io.PeopleDailyPipe fastNLP.io.pipe.PeopleDailyPipe

处理people daily的ner的数据,处理之后的DataSet的field情况为

raw_chars target chars seq_len
[相, 比, 之, 下,...] [0, 0, 0, 0, ...] [2, 3, 4, 5, ...] 11
[青, 岛, 海, 牛, 队, 和, ...] [1, 2, 3, ...] [10, 21, ....] 21
[...] [...] [...] .

raw_chars列为List[str], 是未转换的原始数据; chars列为List[int],是转换为index的输入数据; target列是List[int],是转换为index的 target。返回的DataSet中被设置为input有chars, target, seq_len; 设置为target有target。

dataset的print_field_meta()函数输出的各个field的被设置成input和target的情况为:

+-------------+-----------+--------+-------+---------+
| field_names | raw_chars | target | chars | seq_len |
+-------------+-----------+--------+-------+---------+
|   is_input  |   False   |  True  |  True |   True  |
|  is_target  |   False   |  True  | False |   True  |
| ignore_type |           | False  | False |  False  |
|  pad_value  |           |   0    |   0   |    0    |
+-------------+-----------+--------+-------+---------+
__init__(encoding_type: str = 'bio', bigrams=False, trigrams=False)
参数:
  • encoding_type (str) -- target列使用什么类型的encoding方式,支持bioes, bio两种。
  • bigrams (bool) -- 是否增加一列bigrams. bigrams的构成是['复', '旦', '大', '学', ...]->["复旦", "旦大", ...]。如果 设置为True,返回的DataSet将有一列名为bigrams, 且已经转换为了index并设置为input,对应的vocab可以通过 data_bundle.get_vocab('bigrams')获取.
  • trigrams (bool) -- 是否增加一列trigrams. trigrams的构成是 ['复', '旦', '大', '学', ...]->["复旦大", "旦大学", ...] 。如果设置为True,返回的DataSet将有一列名为trigrams, 且已经转换为了index并设置为input,对应的vocab可以通过 data_bundle.get_vocab('trigrams')获取.
process(data_bundle: fastNLP.io.data_bundle.DataBundle) → fastNLP.io.data_bundle.DataBundle

支持的DataSet的field为

raw_chars target
[相, 比, 之, 下,...] [O, O, O, O, ...]
[青, 岛, 海, 牛, 队, 和, ...] [B-ORG, I-ORG, I-ORG, ...]
[...] [...]

raw_chars列为List[str], 是未转换的原始数据; chars列为List[int],是转换为index的输入数据; target列是List[int], 是转换为index的target。返回的DataSet中被设置为input有chars, target, seq_len; 设置为target有target。

参数:data_bundle (DataBundle) -- 传入的DataBundle中的DataSet必须包含raw_words和ner两个field,且两个field的内容均为List[str]。在传入DataBundle基础上原位修改。
返回:DataBundle
class fastNLP.io.WeiboNERPipe(encoding_type: str = 'bio', bigrams=False, trigrams=False)[源代码]

基类 fastNLP.io._CNNERPipe

别名 fastNLP.io.WeiboNERPipe fastNLP.io.pipe.WeiboNERPipe

处理weibo的ner的数据,处理之后的DataSet的field情况为

raw_chars chars target seq_len
['老', '百', '姓'] [4, 3, 3] [38, 39, 40] 3
['心'] [0] [41] 1
[...] [...] [...] .

raw_chars列为List[str], 是未转换的原始数据; chars列为List[int],是转换为index的输入数据; target列是List[int],是转换为index的 target。返回的DataSet中被设置为input有chars, target, seq_len; 设置为target有target。

dataset的print_field_meta()函数输出的各个field的被设置成input和target的情况为:

+-------------+-----------+--------+-------+---------+
| field_names | raw_chars | target | chars | seq_len |
+-------------+-----------+--------+-------+---------+
|   is_input  |   False   |  True  |  True |   True  |
|  is_target  |   False   |  True  | False |   True  |
| ignore_type |           | False  | False |  False  |
|  pad_value  |           |   0    |   0   |    0    |
+-------------+-----------+--------+-------+---------+
__init__(encoding_type: str = 'bio', bigrams=False, trigrams=False)
参数:
  • encoding_type (str) -- target列使用什么类型的encoding方式,支持bioes, bio两种。
  • bigrams (bool) -- 是否增加一列bigrams. bigrams的构成是['复', '旦', '大', '学', ...]->["复旦", "旦大", ...]。如果 设置为True,返回的DataSet将有一列名为bigrams, 且已经转换为了index并设置为input,对应的vocab可以通过 data_bundle.get_vocab('bigrams')获取.
  • trigrams (bool) -- 是否增加一列trigrams. trigrams的构成是 ['复', '旦', '大', '学', ...]->["复旦大", "旦大学", ...] 。如果设置为True,返回的DataSet将有一列名为trigrams, 且已经转换为了index并设置为input,对应的vocab可以通过 data_bundle.get_vocab('trigrams')获取.
process(data_bundle: fastNLP.io.data_bundle.DataBundle) → fastNLP.io.data_bundle.DataBundle

支持的DataSet的field为

raw_chars target
[相, 比, 之, 下,...] [O, O, O, O, ...]
[青, 岛, 海, 牛, 队, 和, ...] [B-ORG, I-ORG, I-ORG, ...]
[...] [...]

raw_chars列为List[str], 是未转换的原始数据; chars列为List[int],是转换为index的输入数据; target列是List[int], 是转换为index的target。返回的DataSet中被设置为input有chars, target, seq_len; 设置为target有target。

参数:data_bundle (DataBundle) -- 传入的DataBundle中的DataSet必须包含raw_words和ner两个field,且两个field的内容均为List[str]。在传入DataBundle基础上原位修改。
返回:DataBundle
class fastNLP.io.CWSPipe(dataset_name=None, encoding_type='bmes', replace_num_alpha=True, bigrams=False, trigrams=False)[源代码]

基类 fastNLP.io.Pipe

别名 fastNLP.io.CWSPipe fastNLP.io.pipe.CWSPipe

对CWS数据进行预处理, 处理之后的数据,具备以下的结构

raw_words chars target seq_len
共同 创造 美好... [2, 3, 4...] [0, 2, 0, 2,...] 13
2001年 新年 钟声... [8, 9, 9, 7, ...] [0, 1, 1, 1, 2...] 20
... [...] [...] .

dataset的print_field_meta()函数输出的各个field的被设置成input和target的情况为:

+-------------+-----------+-------+--------+---------+
| field_names | raw_words | chars | target | seq_len |
+-------------+-----------+-------+--------+---------+
|   is_input  |   False   |  True |  True  |   True  |
|  is_target  |   False   | False |  True  |   True  |
| ignore_type |           | False | False  |  False  |
|  pad_value  |           |   0   |   0    |    0    |
+-------------+-----------+-------+--------+---------+
__init__(dataset_name=None, encoding_type='bmes', replace_num_alpha=True, bigrams=False, trigrams=False)[源代码]
参数:
  • dataset_name (str,None) -- 支持'pku', 'msra', 'cityu', 'as', None
  • encoding_type (str) -- 可以选择'bmes', 'segapp'两种。"我 来自 复旦大学...", bmes的tag为[S, B, E, B, M, M, E...]; segapp 的tag为[seg, app, seg, app, app, app, seg, ...]
  • replace_num_alpha (bool) -- 是否将数字和字母用特殊字符替换。
  • bigrams (bool) -- 是否增加一列bigram. bigram的构成是['复', '旦', '大', '学', ...]->["复旦", "旦大", ...]
  • trigrams (bool) -- 是否增加一列trigram. trigram的构成是 ['复', '旦', '大', '学', ...]->["复旦大", "旦大学", ...]
process(data_bundle: fastNLP.io.data_bundle.DataBundle) → fastNLP.io.data_bundle.DataBundle[源代码]

可以处理的DataSet需要包含raw_words列

raw_words
上海 浦东 开发 与 法制 建设 同步
新华社 上海 二月 十日 电 ( 记者 谢金虎 、 张持坚 )
...
参数:data_bundle --
返回:
process_from_file(paths=None) → fastNLP.io.data_bundle.DataBundle[源代码]
参数:paths (str) --
返回:
class fastNLP.io.Conll2003NERPipe(encoding_type: str = 'bio', lower: bool = False)[源代码]

基类 fastNLP.io._NERPipe

别名 fastNLP.io.Conll2003NERPipe fastNLP.io.pipe.Conll2003NERPipe

Conll2003的NER任务的处理Pipe, 该Pipe会(1)复制raw_words列,并命名为words; (2)在words, target列建立词表 (创建 fastNLP.Vocabulary 对象,所以在返回的DataBundle中将有两个Vocabulary); (3)将words,target列根据相应的 Vocabulary转换为index。 经过该Pipe过后,DataSet中的内容如下所示

Following is a demo layout of DataSet returned by Conll2003Loader
raw_words target words seq_len
[Nadim, Ladki] [1, 2] [2, 3] 2
[AL-AIN, United, Arab, ...] [3, 4,...] [4, 5, 6,...] 6
[...] [...] [...] .

raw_words列为List[str], 是未转换的原始数据; words列为List[int],是转换为index的输入数据; target列是List[int],是转换为index的 target。返回的DataSet中被设置为input有words, target, seq_len; 设置为target有target。

dataset的print_field_meta()函数输出的各个field的被设置成input和target的情况为:

+-------------+-----------+--------+-------+---------+
| field_names | raw_words | target | words | seq_len |
+-------------+-----------+--------+-------+---------+
|   is_input  |   False   |  True  |  True |   True  |
|  is_target  |   False   |  True  | False |   True  |
| ignore_type |           | False  | False |  False  |
|  pad_value  |           |   0    |   0   |    0    |
+-------------+-----------+--------+-------+---------+
__init__(encoding_type: str = 'bio', lower: bool = False)
Param:str encoding_type: target列使用什么类型的encoding方式,支持bioes, bio两种。
参数:lower (bool) -- 是否将words小写化后再建立词表,绝大多数情况都不需要设置为True。
process(data_bundle: fastNLP.io.data_bundle.DataBundle) → fastNLP.io.data_bundle.DataBundle

支持的DataSet的field为

raw_words target
[Nadim, Ladki] [B-PER, I-PER]
[AL-AIN, United, Arab, ...] [B-LOC, B-LOC, I-LOC, ...]
[...] [...]
参数:data_bundle (DataBundle) -- 传入的DataBundle中的DataSet必须包含raw_words和ner两个field,且两个field的内容均为List[str]在传入DataBundle基础上原位修改。
Return DataBundle:
 
process_from_file(paths) → fastNLP.io.data_bundle.DataBundle[源代码]
参数:paths -- 支持路径类型参见 fastNLP.io.loader.ConllLoader 的load函数。
返回:DataBundle
class fastNLP.io.OntoNotesNERPipe(encoding_type: str = 'bio', lower: bool = False)[源代码]

基类 fastNLP.io._NERPipe

别名 fastNLP.io.OntoNotesNERPipe fastNLP.io.pipe.OntoNotesNERPipe

处理OntoNotes的NER数据,处理之后DataSet中的field情况为

raw_words target words seq_len
[Nadim, Ladki] [1, 2] [2, 3] 2
[AL-AIN, United, Arab, ...] [3, 4] [4, 5, 6,...] 6
[...] [...] [...] .

raw_words列为List[str], 是未转换的原始数据; words列为List[int],是转换为index的输入数据; target列是List[int],是转换为index的 target。返回的DataSet中被设置为input有words, target, seq_len; 设置为target有target。

dataset的print_field_meta()函数输出的各个field的被设置成input和target的情况为:

+-------------+-----------+--------+-------+---------+
| field_names | raw_words | target | words | seq_len |
+-------------+-----------+--------+-------+---------+
|   is_input  |   False   |  True  |  True |   True  |
|  is_target  |   False   |  True  | False |   True  |
| ignore_type |           | False  | False |  False  |
|  pad_value  |           |   0    |   0   |    0    |
+-------------+-----------+--------+-------+---------+
__init__(encoding_type: str = 'bio', lower: bool = False)
Param:str encoding_type: target列使用什么类型的encoding方式,支持bioes, bio两种。
参数:lower (bool) -- 是否将words小写化后再建立词表,绝大多数情况都不需要设置为True。
process(data_bundle: fastNLP.io.data_bundle.DataBundle) → fastNLP.io.data_bundle.DataBundle

支持的DataSet的field为

raw_words target
[Nadim, Ladki] [B-PER, I-PER]
[AL-AIN, United, Arab, ...] [B-LOC, B-LOC, I-LOC, ...]
[...] [...]
参数:data_bundle (DataBundle) -- 传入的DataBundle中的DataSet必须包含raw_words和ner两个field,且两个field的内容均为List[str]在传入DataBundle基础上原位修改。
Return DataBundle:
 
class fastNLP.io.MsraNERPipe(encoding_type: str = 'bio', bigrams=False, trigrams=False)[源代码]

基类 fastNLP.io._CNNERPipe

别名 fastNLP.io.MsraNERPipe fastNLP.io.pipe.MsraNERPipe

处理MSRA-NER的数据,处理之后的DataSet的field情况为

raw_chars target chars seq_len
[相, 比, 之, 下,...] [0, 0, 0, 0, ...] [2, 3, 4, 5, ...] 11
[青, 岛, 海, 牛, 队, 和, ...] [1, 2, 3, ...] [10, 21, ....] 21
[...] [...] [...] .

raw_chars列为List[str], 是未转换的原始数据; chars列为List[int],是转换为index的输入数据; target列是List[int],是转换为index的 target。返回的DataSet中被设置为input有chars, target, seq_len; 设置为target有target。

dataset的print_field_meta()函数输出的各个field的被设置成input和target的情况为:

+-------------+-----------+--------+-------+---------+
| field_names | raw_chars | target | chars | seq_len |
+-------------+-----------+--------+-------+---------+
|   is_input  |   False   |  True  |  True |   True  |
|  is_target  |   False   |  True  | False |   True  |
| ignore_type |           | False  | False |  False  |
|  pad_value  |           |   0    |   0   |    0    |
+-------------+-----------+--------+-------+---------+
__init__(encoding_type: str = 'bio', bigrams=False, trigrams=False)
参数:
  • encoding_type (str) -- target列使用什么类型的encoding方式,支持bioes, bio两种。
  • bigrams (bool) -- 是否增加一列bigrams. bigrams的构成是['复', '旦', '大', '学', ...]->["复旦", "旦大", ...]。如果 设置为True,返回的DataSet将有一列名为bigrams, 且已经转换为了index并设置为input,对应的vocab可以通过 data_bundle.get_vocab('bigrams')获取.
  • trigrams (bool) -- 是否增加一列trigrams. trigrams的构成是 ['复', '旦', '大', '学', ...]->["复旦大", "旦大学", ...] 。如果设置为True,返回的DataSet将有一列名为trigrams, 且已经转换为了index并设置为input,对应的vocab可以通过 data_bundle.get_vocab('trigrams')获取.
process(data_bundle: fastNLP.io.data_bundle.DataBundle) → fastNLP.io.data_bundle.DataBundle

支持的DataSet的field为

raw_chars target
[相, 比, 之, 下,...] [O, O, O, O, ...]
[青, 岛, 海, 牛, 队, 和, ...] [B-ORG, I-ORG, I-ORG, ...]
[...] [...]

raw_chars列为List[str], 是未转换的原始数据; chars列为List[int],是转换为index的输入数据; target列是List[int], 是转换为index的target。返回的DataSet中被设置为input有chars, target, seq_len; 设置为target有target。

参数:data_bundle (DataBundle) -- 传入的DataBundle中的DataSet必须包含raw_words和ner两个field,且两个field的内容均为List[str]。在传入DataBundle基础上原位修改。
返回:DataBundle
class fastNLP.io.WeiboNERPipe(encoding_type: str = 'bio', bigrams=False, trigrams=False)[源代码]

基类 fastNLP.io._CNNERPipe

别名 fastNLP.io.WeiboNERPipe fastNLP.io.pipe.WeiboNERPipe

处理weibo的ner的数据,处理之后的DataSet的field情况为

raw_chars chars target seq_len
['老', '百', '姓'] [4, 3, 3] [38, 39, 40] 3
['心'] [0] [41] 1
[...] [...] [...] .

raw_chars列为List[str], 是未转换的原始数据; chars列为List[int],是转换为index的输入数据; target列是List[int],是转换为index的 target。返回的DataSet中被设置为input有chars, target, seq_len; 设置为target有target。

dataset的print_field_meta()函数输出的各个field的被设置成input和target的情况为:

+-------------+-----------+--------+-------+---------+
| field_names | raw_chars | target | chars | seq_len |
+-------------+-----------+--------+-------+---------+
|   is_input  |   False   |  True  |  True |   True  |
|  is_target  |   False   |  True  | False |   True  |
| ignore_type |           | False  | False |  False  |
|  pad_value  |           |   0    |   0   |    0    |
+-------------+-----------+--------+-------+---------+
__init__(encoding_type: str = 'bio', bigrams=False, trigrams=False)
参数:
  • encoding_type (str) -- target列使用什么类型的encoding方式,支持bioes, bio两种。
  • bigrams (bool) -- 是否增加一列bigrams. bigrams的构成是['复', '旦', '大', '学', ...]->["复旦", "旦大", ...]。如果 设置为True,返回的DataSet将有一列名为bigrams, 且已经转换为了index并设置为input,对应的vocab可以通过 data_bundle.get_vocab('bigrams')获取.
  • trigrams (bool) -- 是否增加一列trigrams. trigrams的构成是 ['复', '旦', '大', '学', ...]->["复旦大", "旦大学", ...] 。如果设置为True,返回的DataSet将有一列名为trigrams, 且已经转换为了index并设置为input,对应的vocab可以通过 data_bundle.get_vocab('trigrams')获取.
process(data_bundle: fastNLP.io.data_bundle.DataBundle) → fastNLP.io.data_bundle.DataBundle

支持的DataSet的field为

raw_chars target
[相, 比, 之, 下,...] [O, O, O, O, ...]
[青, 岛, 海, 牛, 队, 和, ...] [B-ORG, I-ORG, I-ORG, ...]
[...] [...]

raw_chars列为List[str], 是未转换的原始数据; chars列为List[int],是转换为index的输入数据; target列是List[int], 是转换为index的target。返回的DataSet中被设置为input有chars, target, seq_len; 设置为target有target。

参数:data_bundle (DataBundle) -- 传入的DataBundle中的DataSet必须包含raw_words和ner两个field,且两个field的内容均为List[str]。在传入DataBundle基础上原位修改。
返回:DataBundle
class fastNLP.io.PeopleDailyPipe(encoding_type: str = 'bio', bigrams=False, trigrams=False)[源代码]

基类 fastNLP.io._CNNERPipe

别名 fastNLP.io.PeopleDailyPipe fastNLP.io.pipe.PeopleDailyPipe

处理people daily的ner的数据,处理之后的DataSet的field情况为

raw_chars target chars seq_len
[相, 比, 之, 下,...] [0, 0, 0, 0, ...] [2, 3, 4, 5, ...] 11
[青, 岛, 海, 牛, 队, 和, ...] [1, 2, 3, ...] [10, 21, ....] 21
[...] [...] [...] .

raw_chars列为List[str], 是未转换的原始数据; chars列为List[int],是转换为index的输入数据; target列是List[int],是转换为index的 target。返回的DataSet中被设置为input有chars, target, seq_len; 设置为target有target。

dataset的print_field_meta()函数输出的各个field的被设置成input和target的情况为:

+-------------+-----------+--------+-------+---------+
| field_names | raw_chars | target | chars | seq_len |
+-------------+-----------+--------+-------+---------+
|   is_input  |   False   |  True  |  True |   True  |
|  is_target  |   False   |  True  | False |   True  |
| ignore_type |           | False  | False |  False  |
|  pad_value  |           |   0    |   0   |    0    |
+-------------+-----------+--------+-------+---------+
__init__(encoding_type: str = 'bio', bigrams=False, trigrams=False)
参数:
  • encoding_type (str) -- target列使用什么类型的encoding方式,支持bioes, bio两种。
  • bigrams (bool) -- 是否增加一列bigrams. bigrams的构成是['复', '旦', '大', '学', ...]->["复旦", "旦大", ...]。如果 设置为True,返回的DataSet将有一列名为bigrams, 且已经转换为了index并设置为input,对应的vocab可以通过 data_bundle.get_vocab('bigrams')获取.
  • trigrams (bool) -- 是否增加一列trigrams. trigrams的构成是 ['复', '旦', '大', '学', ...]->["复旦大", "旦大学", ...] 。如果设置为True,返回的DataSet将有一列名为trigrams, 且已经转换为了index并设置为input,对应的vocab可以通过 data_bundle.get_vocab('trigrams')获取.
process(data_bundle: fastNLP.io.data_bundle.DataBundle) → fastNLP.io.data_bundle.DataBundle

支持的DataSet的field为

raw_chars target
[相, 比, 之, 下,...] [O, O, O, O, ...]
[青, 岛, 海, 牛, 队, 和, ...] [B-ORG, I-ORG, I-ORG, ...]
[...] [...]

raw_chars列为List[str], 是未转换的原始数据; chars列为List[int],是转换为index的输入数据; target列是List[int], 是转换为index的target。返回的DataSet中被设置为input有chars, target, seq_len; 设置为target有target。

参数:data_bundle (DataBundle) -- 传入的DataBundle中的DataSet必须包含raw_words和ner两个field,且两个field的内容均为List[str]。在传入DataBundle基础上原位修改。
返回:DataBundle
class fastNLP.io.Conll2003Pipe(chunk_encoding_type='bioes', ner_encoding_type='bioes', lower: bool = False)[源代码]

基类 fastNLP.io.Pipe

别名 fastNLP.io.Conll2003Pipe fastNLP.io.pipe.Conll2003Pipe

经过该Pipe后,DataSet中的内容如下

raw_words pos chunk ner words seq_len
[Nadim, Ladki] [0, 0] [1, 2] [1, 2] [2, 3] 2
[AL-AIN, United, Arab, ...] [1, 2...] [3, 4...] [3, 4...] [4, 5, 6,...] 6
[...] [...] [...] [...] [...] .

其中words, seq_len是input; pos, chunk, ner, seq_len是target dataset的print_field_meta()函数输出的各个field的被设置成input和target的情况为:

+-------------+-----------+-------+-------+-------+-------+---------+
| field_names | raw_words |  pos  | chunk |  ner  | words | seq_len |
+-------------+-----------+-------+-------+-------+-------+---------+
|   is_input  |   False   | False | False | False |  True |   True  |
|  is_target  |   False   |  True |  True |  True | False |   True  |
| ignore_type |           | False | False | False | False |  False  |
|  pad_value  |           |   0   |   0   |   0   |   0   |    0    |
+-------------+-----------+-------+-------+-------+-------+---------+
__init__(chunk_encoding_type='bioes', ner_encoding_type='bioes', lower: bool = False)[源代码]
参数:
  • chunk_encoding_type (str) -- 支持bioes, bio。
  • ner_encoding_type (str) -- 支持bioes, bio。
  • lower (bool) -- 是否将words列小写化后再建立词表
process(data_bundle) → fastNLP.io.data_bundle.DataBundle[源代码]

输入的DataSet应该类似于如下的形式

raw_words pos chunk ner  
[Nadim, Ladki] [NNP, NNP] [B-NP, I-NP] [B-PER, I-PER]  
[AL-AIN, United, Arab, ...] [NNP, NNP...] [B-NP, B-NP, ...] [B-LOC, B-LOC,...]  
[...] [...] [...] [...] .
参数:data_bundle --
返回:传入的DataBundle
process_from_file(paths)[源代码]
参数:paths --
返回:
class fastNLP.io.MatchingBertPipe(lower=False, tokenizer: str = 'raw')[源代码]

基类 fastNLP.io.Pipe

别名 fastNLP.io.MatchingBertPipe fastNLP.io.pipe.MatchingBertPipe

Matching任务的Bert pipe,输出的DataSet将包含以下的field

raw_words1 raw_words2 target words seq_len
The new rights are... Everyone really likes.. 1 [2, 3, 4, 5, ...] 10
This site includes a... The Government Executive... 0 [11, 12, 13,...] 5
... ... . [...] .

words列是将raw_words1(即premise), raw_words2(即hypothesis)使用"[SEP]"链接起来转换为index的。 words列被设置为input,target列被设置为target和input(设置为input以方便在forward函数中计算loss, 如果不在forward函数中计算loss也不影响,fastNLP将根据forward函数的形参名进行传参).

dataset的print_field_meta()函数输出的各个field的被设置成input和target的情况为:

+-------------+------------+------------+--------+-------+---------+
| field_names | raw_words1 | raw_words2 | target | words | seq_len |
+-------------+------------+------------+--------+-------+---------+
|   is_input  |   False    |   False    | False  |  True |   True  |
|  is_target  |   False    |   False    |  True  | False |  False  |
| ignore_type |            |            | False  | False |  False  |
|  pad_value  |            |            |   0    |   0   |    0    |
+-------------+------------+------------+--------+-------+---------+
__init__(lower=False, tokenizer: str = 'raw')[源代码]
参数:
  • lower (bool) -- 是否将word小写化。
  • tokenizer (str) -- 使用什么tokenizer来将句子切分为words. 支持spacy, raw两种。raw即使用空格拆分。
process(data_bundle)[源代码]

输入的data_bundle中的dataset需要具有以下结构:

raw_words1 raw_words2 target
Dana Reeve, the widow of the actor... Christopher Reeve had an... not_entailment
... ...  
参数:data_bundle --
返回:
process_from_file(paths) → fastNLP.io.data_bundle.DataBundle

传入文件路径,生成处理好的DataBundle对象。paths支持的路径形式可以参考 :fastNLP.io.Loader.load()

参数:paths --
返回:DataBundle
class fastNLP.io.MatchingPipe(lower=False, tokenizer: str = 'raw')[源代码]

基类 fastNLP.io.Pipe

别名 fastNLP.io.MatchingPipe fastNLP.io.pipe.MatchingPipe

Matching任务的Pipe。输出的DataSet将包含以下的field

raw_words1 raw_words2 target words1 words2 seq_len1 seq_len2
The new rights are... Everyone really likes.. 1 [2, 3, 4, 5, ...] [10, 20, 6] 10 13
This site includes a... The Government Executive... 0 [11, 12, 13,...] [2, 7, ...] 6 7
... ... . [...] [...] . .

words1是premise,words2是hypothesis。其中words1,words2,seq_len1,seq_len2被设置为input;target被设置为target 和input(设置为input以方便在forward函数中计算loss,如果不在forward函数中计算loss也不影响,fastNLP将根据forward函数 的形参名进行传参)。

dataset的print_field_meta()函数输出的各个field的被设置成input和target的情况为:

+-------------+------------+------------+--------+--------+--------+----------+----------+
| field_names | raw_words1 | raw_words2 | target | words1 | words2 | seq_len1 | seq_len2 |
+-------------+------------+------------+--------+--------+--------+----------+----------+
|   is_input  |   False    |   False    | False  |  True  |  True  |   True   |   True   |
|  is_target  |   False    |   False    |  True  | False  | False  |  False   |  False   |
| ignore_type |            |            | False  | False  | False  |  False   |  False   |
|  pad_value  |            |            |   0    |   0    |   0    |    0     |    0     |
+-------------+------------+------------+--------+--------+--------+----------+----------+
__init__(lower=False, tokenizer: str = 'raw')[源代码]
参数:
  • lower (bool) -- 是否将所有raw_words转为小写。
  • tokenizer (str) -- 将原始数据tokenize的方式。支持spacy, raw. spacy是使用spacy切分,raw就是用空格切分。
process(data_bundle)[源代码]

接受的DataBundle中的DataSet应该具有以下的field, target列可以没有

raw_words1 raw_words2 target
The new rights are... Everyone really likes.. entailment
This site includes a... The Government Executive... not_entailment
... ...  
参数:data_bundle (DataBundle) -- 通过loader读取得到的data_bundle,里面包含了数据集的原始数据内容
返回:data_bundle
process_from_file(paths) → fastNLP.io.data_bundle.DataBundle

传入文件路径,生成处理好的DataBundle对象。paths支持的路径形式可以参考 :fastNLP.io.Loader.load()

参数:paths --
返回:DataBundle
class fastNLP.io.CMRC2018BertPipe(max_len=510)[源代码]

基类 fastNLP.io.Pipe

别名 fastNLP.io.CMRC2018BertPipe fastNLP.io.pipe.qa.CMRC2018BertPipe

处理之后的DataSet将新增以下的field(传入的field仍然保留)

context_len raw_chars target_start target_end chars    
492 ['范' '廷' '颂... ] 30 34 [21, 25, ...]
491 ['范' '廷' '颂... ] 41 61 [21, 25, ...]
             
. ... ... ... ...    

raw_words列是context与question拼起来的结果(连接的地方加入了[SEP]),words是转为index的值, target_start为答案start的index,target_end为答案end的index (闭区间);context_len指示的是words列中context的长度。

其中各列的meta信息如下:

+-------------+-------------+-----------+--------------+------------+-------+---------+
| field_names | context_len | raw_chars | target_start | target_end | chars | answers |
+-------------+-------------+-----------+--------------+------------+-------+---------|
|   is_input  |    False    |   False   |    False     |   False    |  True |  False  |
|  is_target  |     True    |    True   |     True     |    True    | False |  True   |
| ignore_type |    False    |    True   |    False     |   False    | False |  True   |
|  pad_value  |      0      |     0     |      0       |     0      |   0   |   0     |
+-------------+-------------+-----------+--------------+------------+-------+---------+
process(data_bundle: fastNLP.io.data_bundle.DataBundle) → fastNLP.io.data_bundle.DataBundle[源代码]

传入的DataSet应该具备以下的field

:header:"title", "context", "question", "answers", "answer_starts", "id"
范廷颂 范廷颂枢机(,),圣名保禄·若瑟()... 范廷颂是什么时候被任为主教的? ["1963年"] ["30"] TRAIN_186_QUERY_0
范廷颂 范廷颂枢机(,),圣名保禄·若瑟()... 1990年,范廷颂担任什么职务? ["1990年被擢升为天..."] ["41"] TRAIN_186_QUERY_1
... ... ... ... . ...
参数:data_bundle --
返回:
class fastNLP.io.ModelLoader[源代码]

别名 fastNLP.io.ModelLoader fastNLP.io.model_io.ModelLoader

用于读取模型

static load_pytorch(empty_model, model_path)[源代码]

从 ".pkl" 文件读取 PyTorch 模型

参数:
  • empty_model -- 初始化参数的 PyTorch 模型
  • model_path (str) -- 模型保存的路径
static load_pytorch_model(model_path)[源代码]

读取整个模型

参数:model_path (str) -- 模型保存的路径
class fastNLP.io.ModelSaver(save_path)[源代码]

别名 fastNLP.io.ModelSaver fastNLP.io.model_io.ModelSaver

用于保存模型

Example:

saver = ModelSaver("./save/model_ckpt_100.pkl")
saver.save_pytorch(model)
__init__(save_path)[源代码]
参数:save_path -- 模型保存的路径
save_pytorch(model, param_only=True)[源代码]

把 PyTorch 模型存入 ".pkl" 文件

参数:
  • model -- PyTorch 模型
  • param_only (bool) -- 是否只保存模型的参数(否则保存整个模型)
子模块
fastNLP.io.data_bundle
class fastNLP.io.data_bundle.DataBundle(vocabs: dict = None, datasets: dict = None)[源代码]

别名 fastNLP.io.DataBundle fastNLP.io.data_bundle.DataBundle

经过处理的数据信息,包括一系列数据集(比如:分开的训练集、验证集和测试集)以及各个field对应的vocabulary。该对象一般由fastNLP中各种 Loader的load函数生成,可以通过以下的方法获取里面的内容

Example:

data_bundle = YelpLoader().load({'train':'/path/to/train', 'dev': '/path/to/dev'})
train_vocabs = data_bundle.vocabs['train']
train_data = data_bundle.datasets['train']
dev_data = data_bundle.datasets['train']
__init__(vocabs: dict = None, datasets: dict = None)[源代码]
参数:
  • vocabs -- 从名称(字符串)到 Vocabulary 类型的dict
  • datasets -- 从名称(字符串)到 DataSet 类型的dict
add_collate_fn(fn, name=None)[源代码]

向所有DataSet增加collate_fn, collate_fn详见 DataSet 中相关说明.

参数:
  • fn (callable) --
  • name --
返回:

apply(func, new_field_name: str, **kwargs)[源代码]

对DataBundle中所有的dataset使用apply方法

参数:
  • func (callable) -- input是instance中名为 field_name 的field的内容。
  • new_field_name (str) -- 将func返回的内容放入到 new_field_name 这个field中,如果名称与已有的field相同,则覆 盖之前的field。如果为None则不创建新的field。
  • kwargs (optional) --

    支持输入is_input,is_target,ignore_type

    1. is_input: bool, 如果为True则将名为 new_field_name 的field设置为input
    2. is_target: bool, 如果为True则将名为 new_field_name 的field设置为target
    3. ignore_type: bool, 如果为True则将名为 new_field_name 的field的ignore_type设置为true, 忽略其类型
apply_field(func, field_name: str, new_field_name: str, ignore_miss_dataset=True, **kwargs)[源代码]

对DataBundle中所有的dataset使用apply_field方法

参数:
  • func (callable) -- input是instance中名为 field_name 的field的内容。
  • field_name (str) -- 传入func的是哪个field。
  • new_field_name (str) -- 将func返回的内容放入到 new_field_name 这个field中,如果名称与已有的field相同,则覆 盖之前的field。如果为None则不创建新的field。
  • ignore_miss_dataset (bool) -- 当某个field名称在某个dataset不存在时,如果为True,则直接忽略该DataSet; 如果为False,则报错
  • kwargs (optional) --

    支持输入is_input,is_target,ignore_type

    1. is_input: bool, 如果为True则将名为 new_field_name 的field设置为input
    2. is_target: bool, 如果为True则将名为 new_field_name 的field设置为target
    3. ignore_type: bool, 如果为True则将名为 new_field_name 的field的ignore_type设置为true, 忽略其类型
copy_field(field_name, new_field_name, ignore_miss_dataset=True)[源代码]

将DataBundle中所有的DataSet中名为field_name的Field复制一份并命名为叫new_field_name.

参数:
  • field_name (str) --
  • new_field_name (str) --
  • ignore_miss_dataset (bool) -- 当某个field名称在某个dataset不存在时,如果为True,则直接忽略该DataSet; 如果为False,则报错
返回:

self

delete_collate_fn(name=None)[源代码]

删除DataSet中的collate_fn

参数:name --
返回:
delete_dataset(name: str)[源代码]

删除名为name的DataSet

参数:name (str) --
返回:self
delete_field(field_name, ignore_miss_dataset=True, delete_vocab=True)[源代码]

将DataBundle中所有DataSet中名为field_name的field删除掉.

参数:
  • field_name (str) --
  • ignore_miss_dataset (bool) -- 当某个field名称在某个dataset不存在时,如果为True,则直接忽略该DataSet; 如果为False,则报错
  • delete_vocab (bool) -- 如果该field也在vocabs中存在,将该值也一并删除
返回:

self

delete_vocab(field_name: str)[源代码]

删除vocab :param str field_name: :return: self

get_dataset(name: str) → fastNLP.core.dataset.DataSet[源代码]

获取名为name的dataset

参数:name (str) -- dataset的名称,一般为'train', 'dev', 'test'
返回:DataSet
get_dataset_names() → List[str][源代码]

返回DataBundle中DataSet的名称

返回:
get_vocab(field_name: str) → fastNLP.core.vocabulary.Vocabulary[源代码]

获取field名为field_name对应的vocab

参数:field_name (str) -- 名称
返回:Vocabulary
get_vocab_names() → List[str][源代码]

返回DataBundle中Vocabulary的名称

返回:
iter_datasets() → Union[str, fastNLP.core.dataset.DataSet][源代码]

迭代data_bundle中的DataSet

Example:

for name, dataset in data_bundle.iter_datasets():
    pass
返回:
iter_vocabs() → Union[str, fastNLP.core.vocabulary.Vocabulary][源代码]

迭代data_bundle中的DataSet

Example:

for field_name, vocab in data_bundle.iter_vocabs():
pass
返回:
rename_field(field_name, new_field_name, ignore_miss_dataset=True, rename_vocab=True)[源代码]

将DataBundle中所有DataSet中名为field_name的field重命名为new_field_name.

参数:
  • field_name (str) --
  • new_field_name (str) --
  • ignore_miss_dataset (bool) -- 当某个field名称在某个dataset不存在时,如果为True,则直接忽略该DataSet; 如果为False,则报错
  • rename_vocab (bool) -- 如果该field同时也存在于vocabs中,会将该field的名称对应修改
返回:

self

set_dataset(dataset, name: str)[源代码]
参数:
  • dataset (DataSet) -- 传递给DataBundle的DataSet
  • name (str) -- dataset的名称
返回:

self

set_ignore_type(*field_names, flag=True, ignore_miss_dataset=True)[源代码]

将DataBundle中所有的DataSet中名为*field_names的Field的ignore_type设置为flag状态

参数:
  • field_names (str) --
  • flag (bool) --
  • ignore_miss_dataset (bool) -- 当某个field名称在某个dataset不存在时,如果为True,则直接忽略该DataSet; 如果为False,则报错
返回:

self

set_input(*field_names, flag=True, use_1st_ins_infer_dim_type=True, ignore_miss_dataset=True)[源代码]

将field_names中的field设置为input, 对data_bundle中所有的dataset执行该操作:

data_bundle.set_input('words', 'seq_len')   # 将words和seq_len这两个field的input属性设置为True
data_bundle.set_input('words', flag=False)  # 将words这个field的input属性设置为False
参数:
  • field_names (str) -- field的名称
  • flag (bool) -- 将field_name的input状态设置为flag
  • use_1st_ins_infer_dim_type (bool) -- 如果为True,将不会check该列是否所有数据都是同样的维度,同样的类型。将直接使用第一 行的数据进行类型和维度推断本列的数据的类型和维度。
  • ignore_miss_dataset (bool) -- 当某个field名称在某个dataset不存在时,如果为True,则直接忽略该DataSet; 如果为False,则报错
返回:

self

set_pad_val(field_name, pad_val, ignore_miss_dataset=True)[源代码]

将DataBundle中所有的DataSet中名为field_name的Field的padding值设置为pad_val.

参数:
  • field_name (str) --
  • pad_val (int) --
  • ignore_miss_dataset (bool) -- 当某个field名称在某个dataset不存在时,如果为True,则直接忽略该DataSet; 如果为False,则报错
返回:

self

set_target(*field_names, flag=True, use_1st_ins_infer_dim_type=True, ignore_miss_dataset=True)[源代码]

将field_names中的field设置为target, 对data_bundle中所有的dataset执行该操作:

data_bundle.set_target('target', 'seq_len')   # 将words和target这两个field的input属性设置为True
data_bundle.set_target('target', flag=False)  # 将target这个field的input属性设置为False
参数:
  • field_names (str) -- field的名称
  • flag (bool) -- 将field_name的target状态设置为flag
  • use_1st_ins_infer_dim_type (bool) -- 如果为True,将不会check该列是否所有数据都是同样的维度,同样的类型。将直接使用第一 行的数据进行类型和维度推断本列的数据的类型和维度。
  • ignore_miss_dataset (bool) -- 当某个field名称在某个dataset不存在时,如果为True,则直接忽略该DataSet; 如果为False,则报错
返回:

self

set_vocab(vocab, field_name)[源代码]

向DataBunlde中增加vocab

参数:
  • vocab (Vocabulary) -- 词表
  • field_name (str) -- 这个vocab对应的field名称
返回:

self

fastNLP.io.embed_loader
class fastNLP.io.embed_loader.EmbedLoader[源代码]

别名 fastNLP.io.EmbedLoader fastNLP.io.embed_loader.EmbedLoader

用于读取预训练的embedding, 读取结果可直接载入为模型参数。

static load_with_vocab(embed_filepath, vocab, dtype=<class 'numpy.float32'>, padding='<pad>', unknown='<unk>', normalize=True, error='ignore', init_method=None)[源代码]

从embed_filepath这个预训练的词向量中抽取出vocab这个词表的词的embedding。EmbedLoader将自动判断embed_filepath是 word2vec(第一行只有两个元素)还是glove格式的数据。

参数:
  • embed_filepath (str) -- 预训练的embedding的路径。
  • vocab -- 词表 Vocabulary 类型,读取出现在vocab中的词的embedding。 没有出现在vocab中的词的embedding将通过找到的词的embedding的正态分布采样出来,以使得整个Embedding是同分布的。
  • dtype -- 读出的embedding的类型
  • padding (str) -- 词表中padding的token
  • unknown (str) -- 词表中unknown的token
  • normalize (bool) -- 是否将每个vector归一化到norm为1
  • error (str) -- ignore , strict ; 如果 ignore ,错误将自动跳过; 如果 strict , 错误将抛出。 这里主要可能出错的地方在于词表有空行或者词表出现了维度不一致。
  • init_method (callable) -- 传入numpy.ndarray, 返回numpy.ndarray, 用以初始化embedding
Return numpy.ndarray:
 

shape为 [len(vocab), dimension], dimension由pretrain的embedding决定。

static load_without_vocab(embed_filepath, dtype=<class 'numpy.float32'>, padding='<pad>', unknown='<unk>', normalize=True, error='ignore')[源代码]

从embed_filepath中读取预训练的word vector。根据预训练的词表读取embedding并生成一个对应的Vocabulary。

参数:
  • embed_filepath (str) -- 预训练的embedding的路径。
  • dtype -- 读出的embedding的类型
  • padding (str) -- 词表中的padding的token. 并以此用做vocab的padding。
  • unknown (str) -- 词表中的unknown的token. 并以此用做vocab的unknown。
  • normalize (bool) -- 是否将每个vector归一化到norm为1
  • error (str) -- ignore , strict ; 如果 ignore ,错误将自动跳过; 如果 strict , 错误将抛出。这里主要可能出错的地 方在于词表有空行或者词表出现了维度不一致。
Return (numpy.ndarray, Vocabulary):
 

Embedding的shape是[词表大小+x, 词表维度], "词表大小+x"是由于最终的大小还取决与 是否使用padding, 以及unknown有没有在词表中找到对应的词。 Vocabulary中的词的顺序与Embedding的顺序是一一对应的。

fastNLP.io.file_utils
fastNLP.io.file_utils.cached_path(url_or_filename: str, cache_dir: str = None, name=None) → pathlib.Path[源代码]

给定一个url,尝试通过url中的解析出来的文件名字filename到{cache_dir}/{name}/{filename}下寻找这个文件,

  1. 如果cache_dir=None, 则cache_dir=~/.fastNLP/; 否则cache_dir=cache_dir
  2. 如果name=None, 则没有中间的{name}这一层结构;否者中间结构就为{name}

如果有该文件,就直接返回路径

如果没有该文件,则尝试用传入的url下载

或者文件名(可以是具体的文件名,也可以是文件夹),先在cache_dir下寻找该文件是否存在,如果不存在则去下载, 并 将文件放入到cache_dir中.

参数:
  • url_or_filename (str) -- 文件的下载url或者文件名称。
  • cache_dir (str) -- 文件的缓存文件夹。如果为None,将使用"~/.fastNLP"这个默认路径
  • name (str) -- 中间一层的名称。如embedding, dataset
返回:

fastNLP.io.file_utils.get_filepath(filepath)[源代码]

如果filepath为文件夹,

如果内含多个文件, 返回filepath

如果只有一个文件, 返回filepath + filename

如果filepath为文件

返回filepath
参数:filepath (str) -- 路径
返回:
fastNLP.io.file_utils.get_cache_path()[源代码]

获取fastNLP默认cache的存放路径, 如果将FASTNLP_CACHE_PATH设置在了环境变量中,将使用环境变量的值,使得不用每个用户都去下载。

Return str:存放路径
fastNLP.io.file_utils.split_filename_suffix(filepath)[源代码]

给定filepath 返回对应的name和suffix. 如果后缀是多个点,仅支持.tar.gz类型

参数:filepath -- 文件路径
返回:filename, suffix
fastNLP.io.file_utils.get_from_cache(url: str, cache_dir: pathlib.Path = None) → pathlib.Path[源代码]

尝试在cache_dir中寻找url定义的资源; 如果没有找到; 则从url下载并将结果放在cache_dir下,缓存的名称由url的结果推断而来。会将下载的 文件解压,将解压后的文件全部放在cache_dir文件夹中。

如果从url中下载的资源解压后有多个文件,则返回目录的路径; 如果只有一个资源文件,则返回具体的路径。

参数:
  • url -- 资源的 url
  • cache_dir -- cache 目录
返回:

路径

fastNLP.io.loader

Loader用于读取数据,并将内容读取到 DataSet 或者 DataBundle 中。所有的Loader都支持以下的 三个方法: __init___load , loads . 其中 __init__(...) 用于申明读取参数,以及说明该Loader支持的数据格式, 读取后 DataSet 中的 field ; _load(path) 方法传入文件路径读取单个文件,并返回 DataSet ; load(paths) 用于读取文件夹下的文件,并返回 DataBundle 类型的对象 , load()方法支持以下几种类型的参数:

0.传入None
将尝试自动下载数据集并缓存。但不是所有的数据都可以直接下载。
1.传入一个文件的 path
返回的 data_bundle 包含一个名为 train 的 dataset ,可以通过 data_bundle.get_dataset('train') 获取
2.传入一个文件夹目录

将读取的是这个文件夹下文件名中包含 train , test , dev 的文件,其它文件会被忽略。假设某个目录下的文件为:

|
+-train.txt
+-dev.txt
+-test.txt
+-other.txt

在 Loader().load('/path/to/dir') 返回的 data_bundle 中可以用 data_bundle.get_dataset('train') , data_bundle.get_dataset('dev') , data_bundle.get_dataset('test') 获取对应的 dataset ,其中 other.txt 的内容会被忽略。假设某个目录下的文件为:

|
+-train.txt
+-dev.txt

在 Loader().load('/path/to/dir') 返回的 data_bundle 中可以用 data_bundle.get_dataset('train') , data_bundle.get_dataset('dev') 获取对应的 dataset。

3.传入一个字典

字典的的 key 为 dataset 的名称,value 是该 dataset 的文件路径:

paths = {'train':'/path/to/train', 'dev': '/path/to/dev', 'test':'/path/to/test'}

在 Loader().load(paths) 返回的 data_bundle 中可以用 data_bundle.get_dataset('train') , data_bundle.get_dataset('dev') , data_bundle.get_dataset('test') 来获取对应的 dataset

fastNLP 目前提供了如下的 Loader

class fastNLP.io.loader.Loader[源代码]

别名 fastNLP.io.Loader fastNLP.io.loader.Loader

各种数据 Loader 的基类,提供了 API 的参考. Loader支持以下的三个函数

  • download() 函数:自动将该数据集下载到缓存地址,默认缓存地址为~/.fastNLP/datasets/。由于版权等原因,不是所有的Loader都实现了该方法。该方法会返回下载后文件所处的缓存地址。
  • _load() 函数:从一个数据文件中读取数据,返回一个 DataSet 。返回的DataSet的内容可以通过每个Loader的文档判断出。
  • load() 函数:将文件分别读取为DataSet,然后将多个DataSet放入到一个DataBundle中并返回
download() → str[源代码]

自动下载该数据集

返回:下载后解压目录
load(paths: Union[str, Dict[str, str]] = None) → fastNLP.io.data_bundle.DataBundle[源代码]

从指定一个或多个路径中的文件中读取数据,返回 DataBundle

参数:Dict[str, str]] paths (Union[str,) --

支持以下的几种输入方式:

0.如果为None,则先查看本地是否有缓存,如果没有则自动下载并缓存。

1.传入一个目录, 该目录下名称包含train的被认为是train,包含test的被认为是test,包含dev的被认为是dev,如果检测到多个文件名包含'train'、 'dev'、 'test'则会报错:

data_bundle = xxxLoader().load('/path/to/dir')  # 返回的DataBundle中datasets根据目录下是否检测到train
#  dev、 test等有所变化,可以通过以下的方式取出DataSet
tr_data = data_bundle.get_dataset('train')
te_data = data_bundle.get_dataset('test')  # 如果目录下有文件包含test这个字段

2.传入一个dict,比如train,dev,test不在同一个目录下,或者名称中不包含train, dev, test:

paths = {'train':"/path/to/tr.conll", 'dev':"/to/validate.conll", "test":"/to/te.conll"}
data_bundle = xxxLoader().load(paths)  # 返回的DataBundle中的dataset中包含"train", "dev", "test"
dev_data = data_bundle.get_dataset('dev')

3.传入文件路径:

data_bundle = xxxLoader().load("/path/to/a/train.conll") # 返回DataBundle对象, datasets中仅包含'train'
tr_data = data_bundle.get_dataset('train')  # 取出DataSet
返回:返回的 DataBundle
class fastNLP.io.loader.CLSBaseLoader(sep=', ', has_header=False)[源代码]

基类 fastNLP.io.Loader

别名 fastNLP.io.CLSBaseLoader fastNLP.io.loader.CLSBaseLoader

文本分类Loader的一个基类

原始数据中内容应该为, 每一行为一个sample,第一个逗号之前为target,第一个逗号之后为文本内容。

Example:

"1","I got 'new' tires from the..."
"1","Don't waste your time..."

读取的DataSet将具备以下的数据结构

raw_words target
I got 'new' tires from them and... 1
Don't waste your time. We had two... 1
... ...
download() → str

自动下载该数据集

返回:下载后解压目录
load(paths: Union[str, Dict[str, str]] = None) → fastNLP.io.data_bundle.DataBundle

从指定一个或多个路径中的文件中读取数据,返回 DataBundle

参数:Dict[str, str]] paths (Union[str,) --

支持以下的几种输入方式:

0.如果为None,则先查看本地是否有缓存,如果没有则自动下载并缓存。

1.传入一个目录, 该目录下名称包含train的被认为是train,包含test的被认为是test,包含dev的被认为是dev,如果检测到多个文件名包含'train'、 'dev'、 'test'则会报错:

data_bundle = xxxLoader().load('/path/to/dir')  # 返回的DataBundle中datasets根据目录下是否检测到train
#  dev、 test等有所变化,可以通过以下的方式取出DataSet
tr_data = data_bundle.get_dataset('train')
te_data = data_bundle.get_dataset('test')  # 如果目录下有文件包含test这个字段

2.传入一个dict,比如train,dev,test不在同一个目录下,或者名称中不包含train, dev, test:

paths = {'train':"/path/to/tr.conll", 'dev':"/to/validate.conll", "test":"/to/te.conll"}
data_bundle = xxxLoader().load(paths)  # 返回的DataBundle中的dataset中包含"train", "dev", "test"
dev_data = data_bundle.get_dataset('dev')

3.传入文件路径:

data_bundle = xxxLoader().load("/path/to/a/train.conll") # 返回DataBundle对象, datasets中仅包含'train'
tr_data = data_bundle.get_dataset('train')  # 取出DataSet
返回:返回的 DataBundle
class fastNLP.io.loader.IMDBLoader[源代码]

基类 fastNLP.io.CLSBaseLoader

别名 fastNLP.io.IMDBLoader fastNLP.io.loader.IMDBLoader

原始数据中内容应该为, 每一行为一个sample,制表符之前为target,制表符之后为文本内容。

Example:

neg     Alan Rickman & Emma...
neg     I have seen this...

IMDBLoader读取后的数据将具有以下两列内容: raw_words: str, 需要分类的文本; target: str, 文本的标签 读取的DataSet具备以下的结构:

raw_words target
Alan Rickman & Emma... neg
I have seen this... neg
... ...
download(dev_ratio: float = 0.0, re_download=False)[源代码]

自动下载数据集,如果你使用了这个数据集,请引用以下的文章

http://www.aclweb.org/anthology/P11-1015

根据dev_ratio的值随机将train中的数据取出一部分作为dev数据。下载完成后不从train中切分dev

参数:
  • dev_ratio (float) -- 如果路径中没有dev.txt。从train划分多少作为dev的数据. 如果为0,则不划分dev
  • re_download (bool) -- 是否重新下载数据,以重新切分数据。
返回:

str, 数据集的目录地址

load(paths: Union[str, Dict[str, str]] = None) → fastNLP.io.data_bundle.DataBundle

从指定一个或多个路径中的文件中读取数据,返回 DataBundle

参数:Dict[str, str]] paths (Union[str,) --

支持以下的几种输入方式:

0.如果为None,则先查看本地是否有缓存,如果没有则自动下载并缓存。

1.传入一个目录, 该目录下名称包含train的被认为是train,包含test的被认为是test,包含dev的被认为是dev,如果检测到多个文件名包含'train'、 'dev'、 'test'则会报错:

data_bundle = xxxLoader().load('/path/to/dir')  # 返回的DataBundle中datasets根据目录下是否检测到train
#  dev、 test等有所变化,可以通过以下的方式取出DataSet
tr_data = data_bundle.get_dataset('train')
te_data = data_bundle.get_dataset('test')  # 如果目录下有文件包含test这个字段

2.传入一个dict,比如train,dev,test不在同一个目录下,或者名称中不包含train, dev, test:

paths = {'train':"/path/to/tr.conll", 'dev':"/to/validate.conll", "test":"/to/te.conll"}
data_bundle = xxxLoader().load(paths)  # 返回的DataBundle中的dataset中包含"train", "dev", "test"
dev_data = data_bundle.get_dataset('dev')

3.传入文件路径:

data_bundle = xxxLoader().load("/path/to/a/train.conll") # 返回DataBundle对象, datasets中仅包含'train'
tr_data = data_bundle.get_dataset('train')  # 取出DataSet
返回:返回的 DataBundle
class fastNLP.io.loader.SSTLoader[源代码]

基类 fastNLP.io.Loader

别名 fastNLP.io.SSTLoader fastNLP.io.loader.SSTLoader

原始数据中内容应该为:

Example:

(2 (3 (3 Effective) (2 but)) (1 (1 too-tepid)...
(3 (3 (2 If) (3 (2 you) (3 (2 sometimes)...

读取之后的DataSet具有以下的结构

下面是使用SSTLoader读取的DataSet所具备的field
raw_words
(2 (3 (3 Effective) (2 but)) (1 (1 too-tepid)...
(3 (3 (2 If) (3 (2 you) (3 (2 sometimes) ...
...

raw_words列是str。

download()[源代码]

自动下载数据集,如果你使用了这个数据集,请引用以下的文章

返回:str, 数据集的目录地址
load(paths: Union[str, Dict[str, str]] = None) → fastNLP.io.data_bundle.DataBundle

从指定一个或多个路径中的文件中读取数据,返回 DataBundle

参数:Dict[str, str]] paths (Union[str,) --

支持以下的几种输入方式:

0.如果为None,则先查看本地是否有缓存,如果没有则自动下载并缓存。

1.传入一个目录, 该目录下名称包含train的被认为是train,包含test的被认为是test,包含dev的被认为是dev,如果检测到多个文件名包含'train'、 'dev'、 'test'则会报错:

data_bundle = xxxLoader().load('/path/to/dir')  # 返回的DataBundle中datasets根据目录下是否检测到train
#  dev、 test等有所变化,可以通过以下的方式取出DataSet
tr_data = data_bundle.get_dataset('train')
te_data = data_bundle.get_dataset('test')  # 如果目录下有文件包含test这个字段

2.传入一个dict,比如train,dev,test不在同一个目录下,或者名称中不包含train, dev, test:

paths = {'train':"/path/to/tr.conll", 'dev':"/to/validate.conll", "test":"/to/te.conll"}
data_bundle = xxxLoader().load(paths)  # 返回的DataBundle中的dataset中包含"train", "dev", "test"
dev_data = data_bundle.get_dataset('dev')

3.传入文件路径:

data_bundle = xxxLoader().load("/path/to/a/train.conll") # 返回DataBundle对象, datasets中仅包含'train'
tr_data = data_bundle.get_dataset('train')  # 取出DataSet
返回:返回的 DataBundle
class fastNLP.io.loader.SST2Loader[源代码]

基类 fastNLP.io.Loader

别名 fastNLP.io.SST2Loader fastNLP.io.loader.SST2Loader

原始数据中内容为:第一行为标题(具体内容会被忽略),之后一行为一个sample,第一个制表符之前被认为是句子,第一个制表符之后认为是label

Example:

sentence        label
it 's a charming and often affecting journey .  1
unflinchingly bleak and desperate       0

读取之后DataSet将如下所示

raw_words target
it 's a charming and often affecting journey . 1
unflinchingly bleak and desperate 0
...  

test的DataSet没有target列。

download()[源代码]

自动下载数据集,如果你使用了该数据集,请引用以下的文章 https://nlp.stanford.edu/pubs/SocherBauerManningNg_ACL2013.pdf :return:

load(paths: Union[str, Dict[str, str]] = None) → fastNLP.io.data_bundle.DataBundle

从指定一个或多个路径中的文件中读取数据,返回 DataBundle

参数:Dict[str, str]] paths (Union[str,) --

支持以下的几种输入方式:

0.如果为None,则先查看本地是否有缓存,如果没有则自动下载并缓存。

1.传入一个目录, 该目录下名称包含train的被认为是train,包含test的被认为是test,包含dev的被认为是dev,如果检测到多个文件名包含'train'、 'dev'、 'test'则会报错:

data_bundle = xxxLoader().load('/path/to/dir')  # 返回的DataBundle中datasets根据目录下是否检测到train
#  dev、 test等有所变化,可以通过以下的方式取出DataSet
tr_data = data_bundle.get_dataset('train')
te_data = data_bundle.get_dataset('test')  # 如果目录下有文件包含test这个字段

2.传入一个dict,比如train,dev,test不在同一个目录下,或者名称中不包含train, dev, test:

paths = {'train':"/path/to/tr.conll", 'dev':"/to/validate.conll", "test":"/to/te.conll"}
data_bundle = xxxLoader().load(paths)  # 返回的DataBundle中的dataset中包含"train", "dev", "test"
dev_data = data_bundle.get_dataset('dev')

3.传入文件路径:

data_bundle = xxxLoader().load("/path/to/a/train.conll") # 返回DataBundle对象, datasets中仅包含'train'
tr_data = data_bundle.get_dataset('train')  # 取出DataSet
返回:返回的 DataBundle
class fastNLP.io.loader.ChnSentiCorpLoader[源代码]

基类 fastNLP.io.Loader

别名 fastNLP.io.ChnSentiCorpLoader fastNLP.io.loader.ChnSentiCorpLoader

支持读取的数据的格式为,第一行为标题(具体内容会被忽略),之后一行为一个sample,第一个制表符之前被认为是label,第 一个制表符之后认为是句子

Example:

label   text_a
1       基金痛所有投资项目一样,必须先要有所了解...
1       系统很好装,LED屏是不错,就是16比9的比例...

读取后的DataSet具有以下的field

raw_chars target
基金痛所有投资项目一样,必须先要有所了解... 1
系统很好装,LED屏是不错,就是16比9的比例... 1
...  
download() → str[源代码]

自动下载数据,该数据取自https://github.com/pengming617/bert_classification/tree/master/data,在 https://arxiv.org/pdf/1904.09223.pdf与https://arxiv.org/pdf/1906.08101.pdf有使用

返回:
load(paths: Union[str, Dict[str, str]] = None) → fastNLP.io.data_bundle.DataBundle

从指定一个或多个路径中的文件中读取数据,返回 DataBundle

参数:Dict[str, str]] paths (Union[str,) --

支持以下的几种输入方式:

0.如果为None,则先查看本地是否有缓存,如果没有则自动下载并缓存。

1.传入一个目录, 该目录下名称包含train的被认为是train,包含test的被认为是test,包含dev的被认为是dev,如果检测到多个文件名包含'train'、 'dev'、 'test'则会报错:

data_bundle = xxxLoader().load('/path/to/dir')  # 返回的DataBundle中datasets根据目录下是否检测到train
#  dev、 test等有所变化,可以通过以下的方式取出DataSet
tr_data = data_bundle.get_dataset('train')
te_data = data_bundle.get_dataset('test')  # 如果目录下有文件包含test这个字段

2.传入一个dict,比如train,dev,test不在同一个目录下,或者名称中不包含train, dev, test:

paths = {'train':"/path/to/tr.conll", 'dev':"/to/validate.conll", "test":"/to/te.conll"}
data_bundle = xxxLoader().load(paths)  # 返回的DataBundle中的dataset中包含"train", "dev", "test"
dev_data = data_bundle.get_dataset('dev')

3.传入文件路径:

data_bundle = xxxLoader().load("/path/to/a/train.conll") # 返回DataBundle对象, datasets中仅包含'train'
tr_data = data_bundle.get_dataset('train')  # 取出DataSet
返回:返回的 DataBundle
class fastNLP.io.loader.THUCNewsLoader[源代码]

基类 fastNLP.io.Loader

别名 fastNLP.io.THUCNewsLoader fastNLP.io.loader.THUCNewsLoader

数据集简介:document-level分类任务,新闻10分类 原始数据内容为:每行一个sample,第一个 "\t" 之前为target,第一个 "\t" 之后为raw_words

Example:

体育      调查-您如何评价热火客场胜绿军总分3-1夺赛点?...

读取后的Dataset将具有以下数据结构:

raw_words target
调查-您如何评价热火客场胜绿军总分3-1夺赛点?... 体育
... ...
download() → str[源代码]

自动下载数据,该数据取自

http://thuctc.thunlp.org/#%E4%B8%AD%E6%96%87%E6%96%87%E6%9C%AC%E5%88%86%E7%B1%BB%E6%95%B0%E6%8D%AE%E9%9B%86THUCNews

返回:
load(paths: Union[str, Dict[str, str]] = None) → fastNLP.io.data_bundle.DataBundle

从指定一个或多个路径中的文件中读取数据,返回 DataBundle

参数:Dict[str, str]] paths (Union[str,) --

支持以下的几种输入方式:

0.如果为None,则先查看本地是否有缓存,如果没有则自动下载并缓存。

1.传入一个目录, 该目录下名称包含train的被认为是train,包含test的被认为是test,包含dev的被认为是dev,如果检测到多个文件名包含'train'、 'dev'、 'test'则会报错:

data_bundle = xxxLoader().load('/path/to/dir')  # 返回的DataBundle中datasets根据目录下是否检测到train
#  dev、 test等有所变化,可以通过以下的方式取出DataSet
tr_data = data_bundle.get_dataset('train')
te_data = data_bundle.get_dataset('test')  # 如果目录下有文件包含test这个字段

2.传入一个dict,比如train,dev,test不在同一个目录下,或者名称中不包含train, dev, test:

paths = {'train':"/path/to/tr.conll", 'dev':"/to/validate.conll", "test":"/to/te.conll"}
data_bundle = xxxLoader().load(paths)  # 返回的DataBundle中的dataset中包含"train", "dev", "test"
dev_data = data_bundle.get_dataset('dev')

3.传入文件路径:

data_bundle = xxxLoader().load("/path/to/a/train.conll") # 返回DataBundle对象, datasets中仅包含'train'
tr_data = data_bundle.get_dataset('train')  # 取出DataSet
返回:返回的 DataBundle
class fastNLP.io.loader.WeiboSenti100kLoader[源代码]

基类 fastNLP.io.Loader

别名 fastNLP.io.WeiboSenti100kLoader fastNLP.io.loader.WeiboSenti100kLoader

别名: 数据集简介:微博sentiment classification,二分类

Example:

label   text
1       多谢小莲,好运满满[爱你]
1       能在他乡遇老友真不赖,哈哈,珠儿,我也要用...

读取后的Dataset将具有以下数据结构:

raw_chars target
多谢小莲,好运满满[爱你] 1
能在他乡遇老友真不赖,哈哈,珠儿,我也要用... 1
... ...
download() → str[源代码]

自动下载数据,该数据取自 https://github.com/SophonPlus/ChineseNlpCorpus/https://arxiv.org/abs/1906.08101 有使用 :return:

load(paths: Union[str, Dict[str, str]] = None) → fastNLP.io.data_bundle.DataBundle

从指定一个或多个路径中的文件中读取数据,返回 DataBundle

参数:Dict[str, str]] paths (Union[str,) --

支持以下的几种输入方式:

0.如果为None,则先查看本地是否有缓存,如果没有则自动下载并缓存。

1.传入一个目录, 该目录下名称包含train的被认为是train,包含test的被认为是test,包含dev的被认为是dev,如果检测到多个文件名包含'train'、 'dev'、 'test'则会报错:

data_bundle = xxxLoader().load('/path/to/dir')  # 返回的DataBundle中datasets根据目录下是否检测到train
#  dev、 test等有所变化,可以通过以下的方式取出DataSet
tr_data = data_bundle.get_dataset('train')
te_data = data_bundle.get_dataset('test')  # 如果目录下有文件包含test这个字段

2.传入一个dict,比如train,dev,test不在同一个目录下,或者名称中不包含train, dev, test:

paths = {'train':"/path/to/tr.conll", 'dev':"/to/validate.conll", "test":"/to/te.conll"}
data_bundle = xxxLoader().load(paths)  # 返回的DataBundle中的dataset中包含"train", "dev", "test"
dev_data = data_bundle.get_dataset('dev')

3.传入文件路径:

data_bundle = xxxLoader().load("/path/to/a/train.conll") # 返回DataBundle对象, datasets中仅包含'train'
tr_data = data_bundle.get_dataset('train')  # 取出DataSet
返回:返回的 DataBundle
class fastNLP.io.loader.ConllLoader(headers, indexes=None, dropna=True)[源代码]

基类 fastNLP.io.Loader

别名 fastNLP.io.ConllLoader fastNLP.io.loader.ConllLoader

ConllLoader支持读取的数据格式: 以空行隔开两个sample,除了分割行,每一行用空格或者制表符隔开不同的元素。如下例所示:

Example:

# 文件中的内容
Nadim NNP B-NP B-PER
Ladki NNP I-NP I-PER

AL-AIN NNP B-NP B-LOC
United NNP B-NP B-LOC
Arab NNP I-NP I-LOC
Emirates NNPS I-NP I-LOC
1996-12-06 CD I-NP O
...

# 如果用以下的参数读取,返回的DataSet将包含raw_words和pos两个field, 这两个field的值分别取自于第0列与第1列
dataset = ConllLoader(headers=['raw_words', 'pos'], indexes=[0, 1])._load('/path/to/train.conll')
# 如果用以下的参数读取,返回的DataSet将包含raw_words和ner两个field, 这两个field的值分别取自于第0列与第2列
dataset = ConllLoader(headers=['raw_words', 'ner'], indexes=[0, 3])._load('/path/to/train.conll')
# 如果用以下的参数读取,返回的DataSet将包含raw_words, pos和ner三个field
dataset = ConllLoader(headers=['raw_words', 'pos', 'ner'], indexes=[0, 1, 3])._load('/path/to/train.conll')

ConllLoader返回的DataSet的field由传入的headers确定。

数据中以"-DOCSTART-"开头的行将被忽略,因为该符号在conll 2003中被用为文档分割符。

__init__(headers, indexes=None, dropna=True)[源代码]
参数:
  • headers (list) -- 每一列数据的名称,需为List or Tuple of str。headerindexes 一一对应
  • indexes (list) -- 需要保留的数据列下标,从0开始。若为 None ,则所有列都保留。Default: None
  • dropna (bool) -- 是否忽略非法数据,若 False ,遇到非法数据时抛出 ValueError 。Default: True
download() → str

自动下载该数据集

返回:下载后解压目录
load(paths: Union[str, Dict[str, str]] = None) → fastNLP.io.data_bundle.DataBundle

从指定一个或多个路径中的文件中读取数据,返回 DataBundle

参数:Dict[str, str]] paths (Union[str,) --

支持以下的几种输入方式:

0.如果为None,则先查看本地是否有缓存,如果没有则自动下载并缓存。

1.传入一个目录, 该目录下名称包含train的被认为是train,包含test的被认为是test,包含dev的被认为是dev,如果检测到多个文件名包含'train'、 'dev'、 'test'则会报错:

data_bundle = xxxLoader().load('/path/to/dir')  # 返回的DataBundle中datasets根据目录下是否检测到train
#  dev、 test等有所变化,可以通过以下的方式取出DataSet
tr_data = data_bundle.get_dataset('train')
te_data = data_bundle.get_dataset('test')  # 如果目录下有文件包含test这个字段

2.传入一个dict,比如train,dev,test不在同一个目录下,或者名称中不包含train, dev, test:

paths = {'train':"/path/to/tr.conll", 'dev':"/to/validate.conll", "test":"/to/te.conll"}
data_bundle = xxxLoader().load(paths)  # 返回的DataBundle中的dataset中包含"train", "dev", "test"
dev_data = data_bundle.get_dataset('dev')

3.传入文件路径:

data_bundle = xxxLoader().load("/path/to/a/train.conll") # 返回DataBundle对象, datasets中仅包含'train'
tr_data = data_bundle.get_dataset('train')  # 取出DataSet
返回:返回的 DataBundle
class fastNLP.io.loader.Conll2003Loader[源代码]

基类 fastNLP.io.ConllLoader

别名 fastNLP.io.Conll2003Loader fastNLP.io.loader.Conll2003Loader

用于读取conll2003任务的数据。数据的内容应该类似与以下的内容, 第一列为raw_words, 第二列为pos, 第三列为chunking,第四列为ner。

Example:

Nadim NNP B-NP B-PER
Ladki NNP I-NP I-PER

AL-AIN NNP B-NP B-LOC
United NNP B-NP B-LOC
Arab NNP I-NP I-LOC
Emirates NNPS I-NP I-LOC
1996-12-06 CD I-NP O
...

返回的DataSet的内容为

下面是Conll2003Loader加载后数据具备的结构。
raw_words pos chunk ner
[Nadim, Ladki] [NNP, NNP] [B-NP, I-NP] [B-PER, I-PER]
[AL-AIN, United, Arab, ...] [NNP, NNP, NNP, ...] [B-NP, B-NP, I-NP, ...] [B-LOC, B-LOC, I-LOC, ...]
[...] [...] [...] [...]
load(paths: Union[str, Dict[str, str]] = None) → fastNLP.io.data_bundle.DataBundle

从指定一个或多个路径中的文件中读取数据,返回 DataBundle

参数:Dict[str, str]] paths (Union[str,) --

支持以下的几种输入方式:

0.如果为None,则先查看本地是否有缓存,如果没有则自动下载并缓存。

1.传入一个目录, 该目录下名称包含train的被认为是train,包含test的被认为是test,包含dev的被认为是dev,如果检测到多个文件名包含'train'、 'dev'、 'test'则会报错:

data_bundle = xxxLoader().load('/path/to/dir')  # 返回的DataBundle中datasets根据目录下是否检测到train
#  dev、 test等有所变化,可以通过以下的方式取出DataSet
tr_data = data_bundle.get_dataset('train')
te_data = data_bundle.get_dataset('test')  # 如果目录下有文件包含test这个字段

2.传入一个dict,比如train,dev,test不在同一个目录下,或者名称中不包含train, dev, test:

paths = {'train':"/path/to/tr.conll", 'dev':"/to/validate.conll", "test":"/to/te.conll"}
data_bundle = xxxLoader().load(paths)  # 返回的DataBundle中的dataset中包含"train", "dev", "test"
dev_data = data_bundle.get_dataset('dev')

3.传入文件路径:

data_bundle = xxxLoader().load("/path/to/a/train.conll") # 返回DataBundle对象, datasets中仅包含'train'
tr_data = data_bundle.get_dataset('train')  # 取出DataSet
返回:返回的 DataBundle
class fastNLP.io.loader.Conll2003NERLoader[源代码]

基类 fastNLP.io.ConllLoader

别名 fastNLP.io.Conll2003NERLoader fastNLP.io.loader.Conll2003NERLoader

用于读取conll2003任务的NER数据。每一行有4列内容,空行意味着隔开两个句子

支持读取的内容如下 Example:

Nadim NNP B-NP B-PER
Ladki NNP I-NP I-PER

AL-AIN NNP B-NP B-LOC
United NNP B-NP B-LOC
Arab NNP I-NP I-LOC
Emirates NNPS I-NP I-LOC
1996-12-06 CD I-NP O
...

返回的DataSet的内容为

下面是Conll2003Loader加载后数据具备的结构, target是BIO2编码
raw_words target
[Nadim, Ladki] [B-PER, I-PER]
[AL-AIN, United, Arab, ...] [B-LOC, B-LOC, I-LOC, ...]
[...] [...]
load(paths: Union[str, Dict[str, str]] = None) → fastNLP.io.data_bundle.DataBundle

从指定一个或多个路径中的文件中读取数据,返回 DataBundle

参数:Dict[str, str]] paths (Union[str,) --

支持以下的几种输入方式:

0.如果为None,则先查看本地是否有缓存,如果没有则自动下载并缓存。

1.传入一个目录, 该目录下名称包含train的被认为是train,包含test的被认为是test,包含dev的被认为是dev,如果检测到多个文件名包含'train'、 'dev'、 'test'则会报错:

data_bundle = xxxLoader().load('/path/to/dir')  # 返回的DataBundle中datasets根据目录下是否检测到train
#  dev、 test等有所变化,可以通过以下的方式取出DataSet
tr_data = data_bundle.get_dataset('train')
te_data = data_bundle.get_dataset('test')  # 如果目录下有文件包含test这个字段

2.传入一个dict,比如train,dev,test不在同一个目录下,或者名称中不包含train, dev, test:

paths = {'train':"/path/to/tr.conll", 'dev':"/to/validate.conll", "test":"/to/te.conll"}
data_bundle = xxxLoader().load(paths)  # 返回的DataBundle中的dataset中包含"train", "dev", "test"
dev_data = data_bundle.get_dataset('dev')

3.传入文件路径:

data_bundle = xxxLoader().load("/path/to/a/train.conll") # 返回DataBundle对象, datasets中仅包含'train'
tr_data = data_bundle.get_dataset('train')  # 取出DataSet
返回:返回的 DataBundle
class fastNLP.io.loader.OntoNotesNERLoader[源代码]

基类 fastNLP.io.ConllLoader

别名 fastNLP.io.OntoNotesNERLoader fastNLP.io.loader.OntoNotesNERLoader

用以读取OntoNotes的NER数据,同时也是Conll2012的NER任务数据。将OntoNote数据处理为conll格式的过程可以参考 https://github.com/yhcc/OntoNotes-5.0-NER。OntoNoteNERLoader将取第4列和第11列的内容。

读取的数据格式为:

Example:

bc/msnbc/00/msnbc_0000   0   0          Hi   UH   (TOP(FRAG(INTJ*)  -   -   -    Dan_Abrams  *   -
bc/msnbc/00/msnbc_0000   0   1    everyone   NN              (NP*)  -   -   -    Dan_Abrams  *   -
...

返回的DataSet的内容为

raw_words target
['Hi', 'everyone', '.'] ['O', 'O', 'O']
['first', 'up', 'on', 'the', 'docket'] ['O', 'O', 'O', 'O', 'O']
[...] [...]
load(paths: Union[str, Dict[str, str]] = None) → fastNLP.io.data_bundle.DataBundle

从指定一个或多个路径中的文件中读取数据,返回 DataBundle

参数:Dict[str, str]] paths (Union[str,) --

支持以下的几种输入方式:

0.如果为None,则先查看本地是否有缓存,如果没有则自动下载并缓存。

1.传入一个目录, 该目录下名称包含train的被认为是train,包含test的被认为是test,包含dev的被认为是dev,如果检测到多个文件名包含'train'、 'dev'、 'test'则会报错:

data_bundle = xxxLoader().load('/path/to/dir')  # 返回的DataBundle中datasets根据目录下是否检测到train
#  dev、 test等有所变化,可以通过以下的方式取出DataSet
tr_data = data_bundle.get_dataset('train')
te_data = data_bundle.get_dataset('test')  # 如果目录下有文件包含test这个字段

2.传入一个dict,比如train,dev,test不在同一个目录下,或者名称中不包含train, dev, test:

paths = {'train':"/path/to/tr.conll", 'dev':"/to/validate.conll", "test":"/to/te.conll"}
data_bundle = xxxLoader().load(paths)  # 返回的DataBundle中的dataset中包含"train", "dev", "test"
dev_data = data_bundle.get_dataset('dev')

3.传入文件路径:

data_bundle = xxxLoader().load("/path/to/a/train.conll") # 返回DataBundle对象, datasets中仅包含'train'
tr_data = data_bundle.get_dataset('train')  # 取出DataSet
返回:返回的 DataBundle
class fastNLP.io.loader.CTBLoader[源代码]

基类 fastNLP.io.Loader

别名 fastNLP.io.CTBLoader fastNLP.io.loader.CTBLoader

支持加载的数据应该具备以下格式, 其中第二列为词语,第四列为pos tag,第七列为依赖树的head,第八列为依赖树的label

Example:

1       印度    _       NR      NR      _       3       nn      _       _
2       海军    _       NN      NN      _       3       nn      _       _
3       参谋长  _       NN      NN      _       5       nsubjpass       _       _
4             _       SB      SB      _       5       pass    _       _
5       解职    _       VV      VV      _       0       root    _       _

1       新华社  _       NR      NR      _       7       dep     _       _
2       新德里  _       NR      NR      _       7       dep     _       _
3       12  _       NT      NT      _       7       dep     _       _
...

读取之后DataSet具备的格式为

raw_words pos dep_head dep_label
[印度, 海军, ...] [NR, NN, SB, ...] [3, 3, ...] [nn, nn, ...]
[新华社, 新德里, ...] [NR, NR, NT, ...] [7, 7, 7, ...] [dep, dep, dep, ...]
[...] [...] [...] [...]
download()[源代码]

由于版权限制,不能提供自动下载功能。可参考

https://catalog.ldc.upenn.edu/LDC2013T21

返回:
load(paths: Union[str, Dict[str, str]] = None) → fastNLP.io.data_bundle.DataBundle

从指定一个或多个路径中的文件中读取数据,返回 DataBundle

参数:Dict[str, str]] paths (Union[str,) --

支持以下的几种输入方式:

0.如果为None,则先查看本地是否有缓存,如果没有则自动下载并缓存。

1.传入一个目录, 该目录下名称包含train的被认为是train,包含test的被认为是test,包含dev的被认为是dev,如果检测到多个文件名包含'train'、 'dev'、 'test'则会报错:

data_bundle = xxxLoader().load('/path/to/dir')  # 返回的DataBundle中datasets根据目录下是否检测到train
#  dev、 test等有所变化,可以通过以下的方式取出DataSet
tr_data = data_bundle.get_dataset('train')
te_data = data_bundle.get_dataset('test')  # 如果目录下有文件包含test这个字段

2.传入一个dict,比如train,dev,test不在同一个目录下,或者名称中不包含train, dev, test:

paths = {'train':"/path/to/tr.conll", 'dev':"/to/validate.conll", "test":"/to/te.conll"}
data_bundle = xxxLoader().load(paths)  # 返回的DataBundle中的dataset中包含"train", "dev", "test"
dev_data = data_bundle.get_dataset('dev')

3.传入文件路径:

data_bundle = xxxLoader().load("/path/to/a/train.conll") # 返回DataBundle对象, datasets中仅包含'train'
tr_data = data_bundle.get_dataset('train')  # 取出DataSet
返回:返回的 DataBundle
class fastNLP.io.loader.MsraNERLoader[源代码]

基类 fastNLP.io.CNNERLoader

别名 fastNLP.io.MsraNERLoader fastNLP.io.loader.MsraNERLoader

读取MSRA-NER数据,数据中的格式应该类似与下列的内容

Example:

把       O
欧       B-LOC

美       B-LOC
、       O

港       B-LOC
台       B-LOC

流       O
行       O

的       O

食       O

...

读取后的DataSet包含以下的field

raw_chars target
['把', '欧'] ['O', 'B-LOC']
['美', '、'] ['B-LOC', 'O']
[...] [...]
download(dev_ratio: float = 0.1, re_download: bool = False) → str[源代码]

自动下载MSAR-NER的数据,如果你使用该数据,请引用 Gina-Anne Levow, 2006, The Third International Chinese Language Processing Bakeoff: Word Segmentation and Named Entity Recognition.

根据dev_ratio的值随机将train中的数据取出一部分作为dev数据。下载完成后在output_dir中有train.conll, test.conll, dev.conll三个文件。

参数:
  • dev_ratio (float) -- 如果路径中没有dev集,从train划分多少作为dev的数据. 如果为0,则不划分dev。
  • re_download (bool) -- 是否重新下载数据,以重新切分数据。
返回:

str, 数据集的目录地址

返回:

load(paths: Union[str, Dict[str, str]] = None) → fastNLP.io.data_bundle.DataBundle

从指定一个或多个路径中的文件中读取数据,返回 DataBundle

参数:Dict[str, str]] paths (Union[str,) --

支持以下的几种输入方式:

0.如果为None,则先查看本地是否有缓存,如果没有则自动下载并缓存。

1.传入一个目录, 该目录下名称包含train的被认为是train,包含test的被认为是test,包含dev的被认为是dev,如果检测到多个文件名包含'train'、 'dev'、 'test'则会报错:

data_bundle = xxxLoader().load('/path/to/dir')  # 返回的DataBundle中datasets根据目录下是否检测到train
#  dev、 test等有所变化,可以通过以下的方式取出DataSet
tr_data = data_bundle.get_dataset('train')
te_data = data_bundle.get_dataset('test')  # 如果目录下有文件包含test这个字段

2.传入一个dict,比如train,dev,test不在同一个目录下,或者名称中不包含train, dev, test:

paths = {'train':"/path/to/tr.conll", 'dev':"/to/validate.conll", "test":"/to/te.conll"}
data_bundle = xxxLoader().load(paths)  # 返回的DataBundle中的dataset中包含"train", "dev", "test"
dev_data = data_bundle.get_dataset('dev')

3.传入文件路径:

data_bundle = xxxLoader().load("/path/to/a/train.conll") # 返回DataBundle对象, datasets中仅包含'train'
tr_data = data_bundle.get_dataset('train')  # 取出DataSet
返回:返回的 DataBundle
class fastNLP.io.loader.PeopleDailyNERLoader[源代码]

基类 fastNLP.io.CNNERLoader

别名 fastNLP.io.PeopleDailyNERLoader fastNLP.io.loader.PeopleDailyNERLoader

支持加载的数据格式如下

Example:

 B-ORG
 I-ORG
 I-ORG
 I-ORG

 O
 B-ORG
...

读取后的DataSet包含以下的field

target列是基于BIO的编码方式
raw_chars target
['中', '共', '中', '央'] ['B-ORG', 'I-ORG', 'I-ORG', 'I-ORG']
[...] [...]
load(paths: Union[str, Dict[str, str]] = None) → fastNLP.io.data_bundle.DataBundle

从指定一个或多个路径中的文件中读取数据,返回 DataBundle

参数:Dict[str, str]] paths (Union[str,) --

支持以下的几种输入方式:

0.如果为None,则先查看本地是否有缓存,如果没有则自动下载并缓存。

1.传入一个目录, 该目录下名称包含train的被认为是train,包含test的被认为是test,包含dev的被认为是dev,如果检测到多个文件名包含'train'、 'dev'、 'test'则会报错:

data_bundle = xxxLoader().load('/path/to/dir')  # 返回的DataBundle中datasets根据目录下是否检测到train
#  dev、 test等有所变化,可以通过以下的方式取出DataSet
tr_data = data_bundle.get_dataset('train')
te_data = data_bundle.get_dataset('test')  # 如果目录下有文件包含test这个字段

2.传入一个dict,比如train,dev,test不在同一个目录下,或者名称中不包含train, dev, test:

paths = {'train':"/path/to/tr.conll", 'dev':"/to/validate.conll", "test":"/to/te.conll"}
data_bundle = xxxLoader().load(paths)  # 返回的DataBundle中的dataset中包含"train", "dev", "test"
dev_data = data_bundle.get_dataset('dev')

3.传入文件路径:

data_bundle = xxxLoader().load("/path/to/a/train.conll") # 返回DataBundle对象, datasets中仅包含'train'
tr_data = data_bundle.get_dataset('train')  # 取出DataSet
返回:返回的 DataBundle
class fastNLP.io.loader.WeiboNERLoader[源代码]

基类 fastNLP.io.CNNERLoader

别名 fastNLP.io.WeiboNERLoader fastNLP.io.loader.WeiboNERLoader

读取WeiboNER数据,数据中的格式应该类似与下列的内容

Example:

       B-PER.NOM
       I-PER.NOM
       I-PER.NOM

       O

...

读取后的DataSet包含以下的field

.. csv-table::

    :header: "raw_chars", "target"

    "['老', '百', '姓']", "['B-PER.NOM', 'I-PER.NOM', 'I-PER.NOM']"
    "['心']", "['O']"
    "[...]", "[...]"
download() → str[源代码]

自动下载Weibo-NER的数据,如果你使用了该数据,请引用 Nanyun Peng and Mark Dredze, 2015, Named Entity Recognition for Chinese Social Media with Jointly Trained Embeddings.

返回:str
load(paths: Union[str, Dict[str, str]] = None) → fastNLP.io.data_bundle.DataBundle

从指定一个或多个路径中的文件中读取数据,返回 DataBundle

参数:Dict[str, str]] paths (Union[str,) --

支持以下的几种输入方式:

0.如果为None,则先查看本地是否有缓存,如果没有则自动下载并缓存。

1.传入一个目录, 该目录下名称包含train的被认为是train,包含test的被认为是test,包含dev的被认为是dev,如果检测到多个文件名包含'train'、 'dev'、 'test'则会报错:

data_bundle = xxxLoader().load('/path/to/dir')  # 返回的DataBundle中datasets根据目录下是否检测到train
#  dev、 test等有所变化,可以通过以下的方式取出DataSet
tr_data = data_bundle.get_dataset('train')
te_data = data_bundle.get_dataset('test')  # 如果目录下有文件包含test这个字段

2.传入一个dict,比如train,dev,test不在同一个目录下,或者名称中不包含train, dev, test:

paths = {'train':"/path/to/tr.conll", 'dev':"/to/validate.conll", "test":"/to/te.conll"}
data_bundle = xxxLoader().load(paths)  # 返回的DataBundle中的dataset中包含"train", "dev", "test"
dev_data = data_bundle.get_dataset('dev')

3.传入文件路径:

data_bundle = xxxLoader().load("/path/to/a/train.conll") # 返回DataBundle对象, datasets中仅包含'train'
tr_data = data_bundle.get_dataset('train')  # 取出DataSet
返回:返回的 DataBundle
class fastNLP.io.loader.CSVLoader(headers=None, sep=', ', dropna=False)[源代码]

基类 fastNLP.io.Loader

别名 fastNLP.io.CSVLoader fastNLP.io.loader.CSVLoader

读取CSV格式的数据集, 返回 DataSet
__init__(headers=None, sep=', ', dropna=False)[源代码]
参数:
  • headers (List[str]) -- CSV文件的文件头.定义每一列的属性名称,即返回的DataSet中`field`的名称 若为 None ,则将读入文件的第一行视作 headers . Default: None
  • sep (str) -- CSV文件中列与列之间的分隔符. Default: ","
  • dropna (bool) -- 是否忽略非法数据,若 True 则忽略,若 False ,在遇到非法数据时,抛出 ValueError . Default: False
download() → str

自动下载该数据集

返回:下载后解压目录
load(paths: Union[str, Dict[str, str]] = None) → fastNLP.io.data_bundle.DataBundle

从指定一个或多个路径中的文件中读取数据,返回 DataBundle

参数:Dict[str, str]] paths (Union[str,) --

支持以下的几种输入方式:

0.如果为None,则先查看本地是否有缓存,如果没有则自动下载并缓存。

1.传入一个目录, 该目录下名称包含train的被认为是train,包含test的被认为是test,包含dev的被认为是dev,如果检测到多个文件名包含'train'、 'dev'、 'test'则会报错:

data_bundle = xxxLoader().load('/path/to/dir')  # 返回的DataBundle中datasets根据目录下是否检测到train
#  dev、 test等有所变化,可以通过以下的方式取出DataSet
tr_data = data_bundle.get_dataset('train')
te_data = data_bundle.get_dataset('test')  # 如果目录下有文件包含test这个字段

2.传入一个dict,比如train,dev,test不在同一个目录下,或者名称中不包含train, dev, test:

paths = {'train':"/path/to/tr.conll", 'dev':"/to/validate.conll", "test":"/to/te.conll"}
data_bundle = xxxLoader().load(paths)  # 返回的DataBundle中的dataset中包含"train", "dev", "test"
dev_data = data_bundle.get_dataset('dev')

3.传入文件路径:

data_bundle = xxxLoader().load("/path/to/a/train.conll") # 返回DataBundle对象, datasets中仅包含'train'
tr_data = data_bundle.get_dataset('train')  # 取出DataSet
返回:返回的 DataBundle
class fastNLP.io.loader.JsonLoader(fields=None, dropna=False)[源代码]

基类 fastNLP.io.Loader

别名 fastNLP.io.JsonLoader fastNLP.io.loader.JsonLoader

别名:fastNLP.io.JsonLoader fastNLP.io.loader.JsonLoader

读取json格式数据.数据必须按行存储,每行是一个包含各类属性的json对象

param dict fields:
 需要读入的json属性名称, 和读入后在DataSet中存储的field_name fieldskey 必须是json对象的属性名. fieldsvalue 为读入后在DataSet存储的 field_name , value 也可为 None , 这时读入后的 field_name 与json对象对应属性同名 fields 可为 None , 这时,json对象所有属性都保存在DataSet中. Default: None
param bool dropna:
 是否忽略非法数据,若 True 则忽略,若 False ,在遇到非法数据时,抛出 ValueError . Default: False
download() → str

自动下载该数据集

返回:下载后解压目录
load(paths: Union[str, Dict[str, str]] = None) → fastNLP.io.data_bundle.DataBundle

从指定一个或多个路径中的文件中读取数据,返回 DataBundle

参数:Dict[str, str]] paths (Union[str,) --

支持以下的几种输入方式:

0.如果为None,则先查看本地是否有缓存,如果没有则自动下载并缓存。

1.传入一个目录, 该目录下名称包含train的被认为是train,包含test的被认为是test,包含dev的被认为是dev,如果检测到多个文件名包含'train'、 'dev'、 'test'则会报错:

data_bundle = xxxLoader().load('/path/to/dir')  # 返回的DataBundle中datasets根据目录下是否检测到train
#  dev、 test等有所变化,可以通过以下的方式取出DataSet
tr_data = data_bundle.get_dataset('train')
te_data = data_bundle.get_dataset('test')  # 如果目录下有文件包含test这个字段

2.传入一个dict,比如train,dev,test不在同一个目录下,或者名称中不包含train, dev, test:

paths = {'train':"/path/to/tr.conll", 'dev':"/to/validate.conll", "test":"/to/te.conll"}
data_bundle = xxxLoader().load(paths)  # 返回的DataBundle中的dataset中包含"train", "dev", "test"
dev_data = data_bundle.get_dataset('dev')

3.传入文件路径:

data_bundle = xxxLoader().load("/path/to/a/train.conll") # 返回DataBundle对象, datasets中仅包含'train'
tr_data = data_bundle.get_dataset('train')  # 取出DataSet
返回:返回的 DataBundle
class fastNLP.io.loader.CWSLoader(dataset_name: str = None)[源代码]

基类 fastNLP.io.Loader

别名 fastNLP.io.CWSLoader fastNLP.io.loader.CWSLoader

CWSLoader支持的数据格式为,一行一句话,不同词之间用空格隔开, 例如:

Example:

上海 浦东 开发 与 法制 建设 同步
新华社 上海 二月 十日 电 ( 记者 谢金虎 、 张持坚 )
...

该Loader读取后的DataSet具有如下的结构

raw_words
上海 浦东 开发 与 法制 建设 同步
新华社 上海 二月 十日 电 ( 记者 谢金虎 、 张持坚 )
...
__init__(dataset_name: str = None)[源代码]
参数:dataset_name (str) -- data的名称,支持pku, msra, cityu(繁体), as(繁体), None
download(dev_ratio=0.1, re_download=False) → str[源代码]

如果你使用了该数据集,请引用以下的文章:Thomas Emerson, The Second International Chinese Word Segmentation Bakeoff, 2005. 更多信息可以在http://sighan.cs.uchicago.edu/bakeoff2005/查看

参数:
  • dev_ratio (float) -- 如果路径中没有dev集,从train划分多少作为dev的数据. 如果为0,则不划分dev。
  • re_download (bool) -- 是否重新下载数据,以重新切分数据。
返回:

str

load(paths: Union[str, Dict[str, str]] = None) → fastNLP.io.data_bundle.DataBundle

从指定一个或多个路径中的文件中读取数据,返回 DataBundle

参数:Dict[str, str]] paths (Union[str,) --

支持以下的几种输入方式:

0.如果为None,则先查看本地是否有缓存,如果没有则自动下载并缓存。

1.传入一个目录, 该目录下名称包含train的被认为是train,包含test的被认为是test,包含dev的被认为是dev,如果检测到多个文件名包含'train'、 'dev'、 'test'则会报错:

data_bundle = xxxLoader().load('/path/to/dir')  # 返回的DataBundle中datasets根据目录下是否检测到train
#  dev、 test等有所变化,可以通过以下的方式取出DataSet
tr_data = data_bundle.get_dataset('train')
te_data = data_bundle.get_dataset('test')  # 如果目录下有文件包含test这个字段

2.传入一个dict,比如train,dev,test不在同一个目录下,或者名称中不包含train, dev, test:

paths = {'train':"/path/to/tr.conll", 'dev':"/to/validate.conll", "test":"/to/te.conll"}
data_bundle = xxxLoader().load(paths)  # 返回的DataBundle中的dataset中包含"train", "dev", "test"
dev_data = data_bundle.get_dataset('dev')

3.传入文件路径:

data_bundle = xxxLoader().load("/path/to/a/train.conll") # 返回DataBundle对象, datasets中仅包含'train'
tr_data = data_bundle.get_dataset('train')  # 取出DataSet
返回:返回的 DataBundle
class fastNLP.io.loader.MNLILoader[源代码]

基类 fastNLP.io.Loader

别名 fastNLP.io.MNLILoader fastNLP.io.loader.MNLILoader

读取的数据格式为:

Example:

index   promptID        pairID  genre   sentence1_binary_parse  sentence2_binary_parse  sentence1_parse sentence2_parse sentence1       sentence2       label1  gold_label
0       31193   31193n  government      ( ( Conceptually ( cream skimming ) ) ...
1       101457  101457e telephone       ( you ( ( know ( during ( ( ( the season ) and ) ( i guess ) ) )...
...

读取MNLI任务的数据,读取之后的DataSet中包含以下的内容,words0是sentence1, words1是sentence2, target是gold_label, 测试集中没 有target列。

raw_words1 raw_words2 target
Conceptually cream ... Product and geography... neutral
you know during the ... You lose the things to the... entailment
... ... ...
download()[源代码]

如果你使用了这个数据,请引用

https://www.nyu.edu/projects/bowman/multinli/paper.pdf :return:

load(paths: str = None)[源代码]
参数:paths (str) -- 传入数据所在目录,会在该目录下寻找dev_matched.tsv, dev_mismatched.tsv, test_matched.tsv, test_mismatched.tsv, train.tsv文件夹
返回:DataBundle
class fastNLP.io.loader.QuoraLoader[源代码]

基类 fastNLP.io.Loader

别名 fastNLP.io.QuoraLoader fastNLP.io.loader.QuoraLoader

Quora matching任务的数据集Loader

支持读取的文件中的内容,应该有以下的形式, 以制表符分隔,且前三列的内容必须是:第一列是label,第二列和第三列是句子

Example:

1       How do I get funding for my web based startup idea ?    How do I get seed funding pre product ? 327970
0       Is honey a viable alternative to sugar for diabetics ?  How would you compare the United States ' euthanasia laws to Denmark ?  90348
...

加载的DataSet将具备以下的field

raw_words1 raw_words2 target
How do I get funding for my web based... How do I get seed funding... 1
Is honey a viable alternative ... How would you compare the United... 0
... ... ...
download()[源代码]

由于版权限制,不能提供自动下载功能。可参考

https://www.kaggle.com/c/quora-question-pairs/data

返回:
load(paths: Union[str, Dict[str, str]] = None) → fastNLP.io.data_bundle.DataBundle

从指定一个或多个路径中的文件中读取数据,返回 DataBundle

参数:Dict[str, str]] paths (Union[str,) --

支持以下的几种输入方式:

0.如果为None,则先查看本地是否有缓存,如果没有则自动下载并缓存。

1.传入一个目录, 该目录下名称包含train的被认为是train,包含test的被认为是test,包含dev的被认为是dev,如果检测到多个文件名包含'train'、 'dev'、 'test'则会报错:

data_bundle = xxxLoader().load('/path/to/dir')  # 返回的DataBundle中datasets根据目录下是否检测到train
#  dev、 test等有所变化,可以通过以下的方式取出DataSet
tr_data = data_bundle.get_dataset('train')
te_data = data_bundle.get_dataset('test')  # 如果目录下有文件包含test这个字段

2.传入一个dict,比如train,dev,test不在同一个目录下,或者名称中不包含train, dev, test:

paths = {'train':"/path/to/tr.conll", 'dev':"/to/validate.conll", "test":"/to/te.conll"}
data_bundle = xxxLoader().load(paths)  # 返回的DataBundle中的dataset中包含"train", "dev", "test"
dev_data = data_bundle.get_dataset('dev')

3.传入文件路径:

data_bundle = xxxLoader().load("/path/to/a/train.conll") # 返回DataBundle对象, datasets中仅包含'train'
tr_data = data_bundle.get_dataset('train')  # 取出DataSet
返回:返回的 DataBundle
class fastNLP.io.loader.SNLILoader[源代码]

基类 fastNLP.io.JsonLoader

别名 fastNLP.io.SNLILoader fastNLP.io.loader.SNLILoader

文件每一行是一个sample,每一行都为一个json对象,其数据格式为:

Example:

{"annotator_labels": ["neutral", "entailment", "neutral", "neutral", "neutral"], "captionID": "4705552913.jpg#2",
 "gold_label": "neutral", "pairID": "4705552913.jpg#2r1n",
 "sentence1": "Two women are embracing while holding to go packages.",
 "sentence1_binary_parse": "( ( Two women ) ( ( are ( embracing ( while ( holding ( to ( go packages ) ) ) ) ) ) . ) )",
 "sentence1_parse": "(ROOT (S (NP (CD Two) (NNS women)) (VP (VBP are) (VP (VBG embracing) (SBAR (IN while) (S (NP (VBG holding)) (VP (TO to) (VP (VB go) (NP (NNS packages)))))))) (. .)))",
 "sentence2": "The sisters are hugging goodbye while holding to go packages after just eating lunch.",
 "sentence2_binary_parse": "( ( The sisters ) ( ( are ( ( hugging goodbye ) ( while ( holding ( to ( ( go packages ) ( after ( just ( eating lunch ) ) ) ) ) ) ) ) ) . ) )",
 "sentence2_parse": "(ROOT (S (NP (DT The) (NNS sisters)) (VP (VBP are) (VP (VBG hugging) (NP (UH goodbye)) (PP (IN while) (S (VP (VBG holding) (S (VP (TO to) (VP (VB go) (NP (NNS packages)) (PP (IN after) (S (ADVP (RB just)) (VP (VBG eating) (NP (NN lunch))))))))))))) (. .)))"
 }

读取之后的DataSet中的field情况为

下面是使用SNLILoader加载的DataSet所具备的field
target raw_words1 raw_words2  
neutral Two women are embracing while holding.. The sisters are hugging goodbye...  
entailment Two women are embracing while holding... Two woman are holding packages.  
... ... ...  
download()[源代码]

如果您的文章使用了这份数据,请引用

http://nlp.stanford.edu/pubs/snli_paper.pdf

返回:str
load(paths: Union[str, Dict[str, str]] = None) → fastNLP.io.data_bundle.DataBundle[源代码]

从指定一个或多个路径中的文件中读取数据,返回 DataBundle

读取的field根据Loader初始化时传入的field决定。

参数:paths (str) -- 传入一个目录, 将在该目录下寻找snli_1.0_train.jsonl, snli_1.0_dev.jsonl 和snli_1.0_test.jsonl三个文件。
返回:返回的 DataBundle
class fastNLP.io.loader.QNLILoader[源代码]

基类 fastNLP.io.JsonLoader

别名 fastNLP.io.QNLILoader fastNLP.io.loader.QNLILoader

第一行为标题(具体内容会被忽略),之后每一行是一个sample,由index、问题、句子和标签构成(以制表符分割),数据结构如下:

Example:

index   question        sentence        label
0       What came into force after the new constitution was herald?     As of that day, the new constitution heralding the Second Republic came into force.     entailment

QNLI数据集的Loader, 加载的DataSet将具备以下的field, raw_words1是question, raw_words2是sentence, target是label

raw_words1 raw_words2 target
What came into force after the new... As of that day... entailment
... .  

test数据集没有target列

download()[源代码]

如果您的实验使用到了该数据,请引用

https://arxiv.org/pdf/1809.05053.pdf

返回:
load(paths: Union[str, Dict[str, str]] = None) → fastNLP.io.data_bundle.DataBundle

从指定一个或多个路径中的文件中读取数据,返回 DataBundle

参数:Dict[str, str]] paths (Union[str,) --

支持以下的几种输入方式:

0.如果为None,则先查看本地是否有缓存,如果没有则自动下载并缓存。

1.传入一个目录, 该目录下名称包含train的被认为是train,包含test的被认为是test,包含dev的被认为是dev,如果检测到多个文件名包含'train'、 'dev'、 'test'则会报错:

data_bundle = xxxLoader().load('/path/to/dir')  # 返回的DataBundle中datasets根据目录下是否检测到train
#  dev、 test等有所变化,可以通过以下的方式取出DataSet
tr_data = data_bundle.get_dataset('train')
te_data = data_bundle.get_dataset('test')  # 如果目录下有文件包含test这个字段

2.传入一个dict,比如train,dev,test不在同一个目录下,或者名称中不包含train, dev, test:

paths = {'train':"/path/to/tr.conll", 'dev':"/to/validate.conll", "test":"/to/te.conll"}
data_bundle = xxxLoader().load(paths)  # 返回的DataBundle中的dataset中包含"train", "dev", "test"
dev_data = data_bundle.get_dataset('dev')

3.传入文件路径:

data_bundle = xxxLoader().load("/path/to/a/train.conll") # 返回DataBundle对象, datasets中仅包含'train'
tr_data = data_bundle.get_dataset('train')  # 取出DataSet
返回:返回的 DataBundle
class fastNLP.io.loader.RTELoader[源代码]

基类 fastNLP.io.Loader

别名 fastNLP.io.RTELoader fastNLP.io.loader.RTELoader

第一行为标题(具体内容会被忽略),之后每一行是一个sample,由index、句子1、句子2和标签构成(以制表符分割),数据结构如下:

Example:

index   sentence1       sentence2       label
0       Dana Reeve, the widow of the actor Christopher Reeve, has died of lung cancer at age 44, according to the Christopher Reeve Foundation. Christopher Reeve had an accident.      not_entailment

RTE数据的loader 加载的DataSet将具备以下的field, raw_words1是sentence0,raw_words2是sentence1, target是label

raw_words1 raw_words2 target
Dana Reeve, the widow of the actor... Christopher Reeve had an... not_entailment
... ...  

test数据集没有target列

download()[源代码]

如果您的实验使用到了该数据,请引用GLUE Benchmark

https://openreview.net/pdf?id=rJ4km2R5t7

返回:
load(paths: Union[str, Dict[str, str]] = None) → fastNLP.io.data_bundle.DataBundle

从指定一个或多个路径中的文件中读取数据,返回 DataBundle

参数:Dict[str, str]] paths (Union[str,) --

支持以下的几种输入方式:

0.如果为None,则先查看本地是否有缓存,如果没有则自动下载并缓存。

1.传入一个目录, 该目录下名称包含train的被认为是train,包含test的被认为是test,包含dev的被认为是dev,如果检测到多个文件名包含'train'、 'dev'、 'test'则会报错:

data_bundle = xxxLoader().load('/path/to/dir')  # 返回的DataBundle中datasets根据目录下是否检测到train
#  dev、 test等有所变化,可以通过以下的方式取出DataSet
tr_data = data_bundle.get_dataset('train')
te_data = data_bundle.get_dataset('test')  # 如果目录下有文件包含test这个字段

2.传入一个dict,比如train,dev,test不在同一个目录下,或者名称中不包含train, dev, test:

paths = {'train':"/path/to/tr.conll", 'dev':"/to/validate.conll", "test":"/to/te.conll"}
data_bundle = xxxLoader().load(paths)  # 返回的DataBundle中的dataset中包含"train", "dev", "test"
dev_data = data_bundle.get_dataset('dev')

3.传入文件路径:

data_bundle = xxxLoader().load("/path/to/a/train.conll") # 返回DataBundle对象, datasets中仅包含'train'
tr_data = data_bundle.get_dataset('train')  # 取出DataSet
返回:返回的 DataBundle
class fastNLP.io.loader.CNXNLILoader[源代码]

基类 fastNLP.io.Loader

别名 fastNLP.io.CNXNLILoader fastNLP.io.loader.CNXNLILoader

数据集简介:中文句对NLI(本为multi-lingual的数据集,但是这里只取了中文的数据集)。原句子已被MOSES tokenizer处理,这里我们将其还原并重新按字tokenize 原始数据数据为:

Example:

premise hypo    label
我们 家里  一个    找到  可以   时间 我们 家里  一个   从来 没有 时间 使用  .  entailment

dev和test中的数据为csv或json格式,包括十多个field,这里只取与以上三个field中的数据 读取后的Dataset将具有以下数据结构:

raw_chars1 raw_chars2 target
我们 家里 有 一个 但 我 没 找到 我 可以 用 的 时间 我们 家里 有 一个 但 我 从来 没有 时间 使用 它 . 0
... ... ...
download() → str[源代码]

自动下载数据,该数据取自 https://arxiv.org/abs/1809.05053https://arxiv.org/pdf/1905.05526.pdf https://arxiv.org/pdf/1901.10125.pdf https://arxiv.org/pdf/1809.05053.pdf 有使用 :return:

class fastNLP.io.loader.BQCorpusLoader[源代码]

基类 fastNLP.io.Loader

别名 fastNLP.io.BQCorpusLoader fastNLP.io.loader.BQCorpusLoader

别名: 数据集简介:句子对二分类任务(判断是否具有相同的语义) 原始数据结构为:

Example:

sentence1,sentence2,label
综合评分不足什么原因,综合评估的依据,0
什么时候我能使用微粒贷,你就赶快给我开通就行了,0

读取后的Dataset将具有以下数据结构:

raw_chars1 raw_chars2 target
综合评分不足什么原因 综合评估的依据 0
什么时候我能使用微粒贷 你就赶快给我开通就行了 0
... ... ...
download()[源代码]

由于版权限制,不能提供自动下载功能。可参考

https://github.com/ymcui/Chinese-BERT-wwm

返回:
load(paths: Union[str, Dict[str, str]] = None) → fastNLP.io.data_bundle.DataBundle

从指定一个或多个路径中的文件中读取数据,返回 DataBundle

参数:Dict[str, str]] paths (Union[str,) --

支持以下的几种输入方式:

0.如果为None,则先查看本地是否有缓存,如果没有则自动下载并缓存。

1.传入一个目录, 该目录下名称包含train的被认为是train,包含test的被认为是test,包含dev的被认为是dev,如果检测到多个文件名包含'train'、 'dev'、 'test'则会报错:

data_bundle = xxxLoader().load('/path/to/dir')  # 返回的DataBundle中datasets根据目录下是否检测到train
#  dev、 test等有所变化,可以通过以下的方式取出DataSet
tr_data = data_bundle.get_dataset('train')
te_data = data_bundle.get_dataset('test')  # 如果目录下有文件包含test这个字段

2.传入一个dict,比如train,dev,test不在同一个目录下,或者名称中不包含train, dev, test:

paths = {'train':"/path/to/tr.conll", 'dev':"/to/validate.conll", "test":"/to/te.conll"}
data_bundle = xxxLoader().load(paths)  # 返回的DataBundle中的dataset中包含"train", "dev", "test"
dev_data = data_bundle.get_dataset('dev')

3.传入文件路径:

data_bundle = xxxLoader().load("/path/to/a/train.conll") # 返回DataBundle对象, datasets中仅包含'train'
tr_data = data_bundle.get_dataset('train')  # 取出DataSet
返回:返回的 DataBundle
class fastNLP.io.loader.LCQMCLoader[源代码]

基类 fastNLP.io.Loader

别名 fastNLP.io.LCQMCLoader fastNLP.io.loader.LCQMCLoader

数据集简介:句对匹配(question matching)

原始数据为:

Example:

喜欢打篮球的男生喜欢什么样的女生        爱打篮球的男生喜欢什么样的女生 1
你帮我设计小说的封面吧     谁能帮我给小说设计个封面?   0

读取后的Dataset将具有以下的数据结构

raw_chars1 raw_chars2 target
喜欢打篮球的男生喜欢什么样的女生 爱打篮球的男生喜欢什么样的女生 1
你帮我设计小说的封面吧 妇可以戴耳机听音乐吗? 0
... ... ...
download()[源代码]

由于版权限制,不能提供自动下载功能。可参考

https://github.com/ymcui/Chinese-BERT-wwm

返回:
load(paths: Union[str, Dict[str, str]] = None) → fastNLP.io.data_bundle.DataBundle

从指定一个或多个路径中的文件中读取数据,返回 DataBundle

参数:Dict[str, str]] paths (Union[str,) --

支持以下的几种输入方式:

0.如果为None,则先查看本地是否有缓存,如果没有则自动下载并缓存。

1.传入一个目录, 该目录下名称包含train的被认为是train,包含test的被认为是test,包含dev的被认为是dev,如果检测到多个文件名包含'train'、 'dev'、 'test'则会报错:

data_bundle = xxxLoader().load('/path/to/dir')  # 返回的DataBundle中datasets根据目录下是否检测到train
#  dev、 test等有所变化,可以通过以下的方式取出DataSet
tr_data = data_bundle.get_dataset('train')
te_data = data_bundle.get_dataset('test')  # 如果目录下有文件包含test这个字段

2.传入一个dict,比如train,dev,test不在同一个目录下,或者名称中不包含train, dev, test:

paths = {'train':"/path/to/tr.conll", 'dev':"/to/validate.conll", "test":"/to/te.conll"}
data_bundle = xxxLoader().load(paths)  # 返回的DataBundle中的dataset中包含"train", "dev", "test"
dev_data = data_bundle.get_dataset('dev')

3.传入文件路径:

data_bundle = xxxLoader().load("/path/to/a/train.conll") # 返回DataBundle对象, datasets中仅包含'train'
tr_data = data_bundle.get_dataset('train')  # 取出DataSet
返回:返回的 DataBundle
class fastNLP.io.loader.CoReferenceLoader(fields=None, dropna=False)[源代码]

基类 fastNLP.io.loader.JsonLoader

别名 fastNLP.io.CoReferenceLoader fastNLP.io.loader.CoReferenceLoader

原始数据中内容应该为, 每一行为一个json对象,其中doc_key包含文章的种类信息,speakers包含每句话的说话者信息,cluster是指向现实中同一个事物的聚集,sentences是文本信息内容。

Example:

{"doc_key": "bc/cctv/00/cctv_0000_0",
 "speakers": [["Speaker#1", "Speaker#1", "Speaker#1", "Speaker#1", "Speaker#1", "Speaker#1", "Speaker#1", "Speaker#1", "Speaker#1", "Speaker#1", "Speaker#1", "Speaker#1", "Speaker#1", "Speaker#1", "Speaker#1", "Speaker#1", "Speaker#1", "Speaker#1", "Speaker#1", "Speaker#1", "Speaker#1", "Speaker#1", "Speaker#1", "Speaker#1", "Speaker#1", "Speaker#1", "Speaker#1"], ["Speaker#1", "Speaker#1", "Speaker#1", "Speaker#1", "Speaker#1", "Speaker#1", "Speaker#1", "Speaker#1", "Speaker#1", "Speaker#1", "Speaker#1", "Speaker#1", "Speaker#1", "Speaker#1", "Speaker#1", "Speaker#1", "Speaker#1", "Speaker#1", "Speaker#1", "Speaker#1", "Speaker#1", "Speaker#1", "Speaker#1", "Speaker#1"], ["Speaker#1", "Speaker#1", "Speaker#1", "Speaker#1", "Speaker#1", "Speaker#1", "Speaker#1", "Speaker#1", "Speaker#1", "Speaker#1", "Speaker#1", "Speaker#1", "Speaker#1", "Speaker#1"]],
 "clusters": [[[70, 70], [485, 486], [500, 500], [73, 73], [55, 55], [153, 154], [366, 366]]],
 "sentences": [["In", "the", "summer", "of", "2005", ",", "a", "picture", "that", "people", "have", "long", "been", "looking", "forward", "to", "started", "emerging", "with", "frequency", "in", "various", "major", "Hong", "Kong", "media", "."], ["With", "their", "unique", "charm", ",", "these", "well", "-", "known", "cartoon", "images", "once", "again", "caused", "Hong", "Kong", "to", "be", "a", "focus", "of", "worldwide", "attention", "."]]
 }

读取预处理好的Conll2012数据,数据结构如下:

raw_words1 raw_words2 raw_words3 raw_words4
bc/cctv/00/cctv_0000_0 [['Speaker#1', 'Speaker#1', 'Speaker#1... [[[70, 70], [485, 486], [500, 500], [7... [['In', 'the', 'summer', 'of', '2005',...
... ... ... ...
download()[源代码]

由于版权限制,不能提供自动下载功能。可参考

https://www.aclweb.org/anthology/W12-4501

返回:
load(paths: Union[str, Dict[str, str]] = None) → fastNLP.io.data_bundle.DataBundle

从指定一个或多个路径中的文件中读取数据,返回 DataBundle

参数:Dict[str, str]] paths (Union[str,) --

支持以下的几种输入方式:

0.如果为None,则先查看本地是否有缓存,如果没有则自动下载并缓存。

1.传入一个目录, 该目录下名称包含train的被认为是train,包含test的被认为是test,包含dev的被认为是dev,如果检测到多个文件名包含'train'、 'dev'、 'test'则会报错:

data_bundle = xxxLoader().load('/path/to/dir')  # 返回的DataBundle中datasets根据目录下是否检测到train
#  dev、 test等有所变化,可以通过以下的方式取出DataSet
tr_data = data_bundle.get_dataset('train')
te_data = data_bundle.get_dataset('test')  # 如果目录下有文件包含test这个字段

2.传入一个dict,比如train,dev,test不在同一个目录下,或者名称中不包含train, dev, test:

paths = {'train':"/path/to/tr.conll", 'dev':"/to/validate.conll", "test":"/to/te.conll"}
data_bundle = xxxLoader().load(paths)  # 返回的DataBundle中的dataset中包含"train", "dev", "test"
dev_data = data_bundle.get_dataset('dev')

3.传入文件路径:

data_bundle = xxxLoader().load("/path/to/a/train.conll") # 返回DataBundle对象, datasets中仅包含'train'
tr_data = data_bundle.get_dataset('train')  # 取出DataSet
返回:返回的 DataBundle
class fastNLP.io.loader.CMRC2018Loader[源代码]

基类 fastNLP.io.Loader

别名 fastNLP.io.CMRC2018Loader fastNLP.io.loader.qa.CMRC2018Loader

请直接使用从fastNLP下载的数据进行处理。该数据集未提供测试集,测试需要通过上传到对应的系统进行评测

读取之后训练集DataSet将具备以下的内容,每个问题的答案只有一个

:header:"title", "context", "question", "answers", "answer_starts", "id"
范廷颂 范廷颂枢机(,),圣名保禄·若瑟()... 范廷颂是什么时候被任为主教的? ["1963年"] ["30"] TRAIN_186_QUERY_0
范廷颂 范廷颂枢机(,),圣名保禄·若瑟()... 1990年,范廷颂担任什么职务? ["1990年被擢升为天..."] ["41"] TRAIN_186_QUERY_1
... ... ... ... . ...

其中title是文本的标题,多条记录可能是相同的title;id是该问题的id,具备唯一性

验证集DataSet将具备以下的内容,每个问题的答案可能有三个(有时候只是3个重复的答案)

title context question answers answer_starts id
战国无双3 《战国无双3》()是由光荣和ω-force开发... 《战国无双3》是由哪两个公司合作开发的? ['光荣和ω-force', '光荣和ω-force', '光荣和ω-force'] [30, 30, 30] DEV_0_QUERY_0
战国无双3 《战国无双3》()是由光荣和ω-force开发... 男女主角亦有专属声优这一模式是由谁改编的? ['村雨城', '村雨城', '任天堂游戏谜之村雨城'] [226, 226, 219] DEV_0_QUERY_1
... ... ... ... . ...

其中answer_starts是从0开始的index。例如"我来自a复旦大学?",其中"复"的开始index为4。另外"Russell评价说"中的说的index为9, 因为 英文和数字都直接按照character计量的。

download() → str[源代码]

如果您使用了本数据,请引用A Span-Extraction Dataset for Chinese Machine Reading Comprehension. Yiming Cui, Ting Liu, etc.

返回:
load(paths: Union[str, Dict[str, str]] = None) → fastNLP.io.data_bundle.DataBundle

从指定一个或多个路径中的文件中读取数据,返回 DataBundle

参数:Dict[str, str]] paths (Union[str,) --

支持以下的几种输入方式:

0.如果为None,则先查看本地是否有缓存,如果没有则自动下载并缓存。

1.传入一个目录, 该目录下名称包含train的被认为是train,包含test的被认为是test,包含dev的被认为是dev,如果检测到多个文件名包含'train'、 'dev'、 'test'则会报错:

data_bundle = xxxLoader().load('/path/to/dir')  # 返回的DataBundle中datasets根据目录下是否检测到train
#  dev、 test等有所变化,可以通过以下的方式取出DataSet
tr_data = data_bundle.get_dataset('train')
te_data = data_bundle.get_dataset('test')  # 如果目录下有文件包含test这个字段

2.传入一个dict,比如train,dev,test不在同一个目录下,或者名称中不包含train, dev, test:

paths = {'train':"/path/to/tr.conll", 'dev':"/to/validate.conll", "test":"/to/te.conll"}
data_bundle = xxxLoader().load(paths)  # 返回的DataBundle中的dataset中包含"train", "dev", "test"
dev_data = data_bundle.get_dataset('dev')

3.传入文件路径:

data_bundle = xxxLoader().load("/path/to/a/train.conll") # 返回DataBundle对象, datasets中仅包含'train'
tr_data = data_bundle.get_dataset('train')  # 取出DataSet
返回:返回的 DataBundle
fastNLP.io.model_io

用于载入和保存模型

class fastNLP.io.model_io.ModelLoader[源代码]

别名 fastNLP.io.ModelLoader fastNLP.io.model_io.ModelLoader

用于读取模型

static load_pytorch(empty_model, model_path)[源代码]

从 ".pkl" 文件读取 PyTorch 模型

参数:
  • empty_model -- 初始化参数的 PyTorch 模型
  • model_path (str) -- 模型保存的路径
static load_pytorch_model(model_path)[源代码]

读取整个模型

参数:model_path (str) -- 模型保存的路径
class fastNLP.io.model_io.ModelSaver(save_path)[源代码]

别名 fastNLP.io.ModelSaver fastNLP.io.model_io.ModelSaver

用于保存模型

Example:

saver = ModelSaver("./save/model_ckpt_100.pkl")
saver.save_pytorch(model)
__init__(save_path)[源代码]
参数:save_path -- 模型保存的路径
save_pytorch(model, param_only=True)[源代码]

把 PyTorch 模型存入 ".pkl" 文件

参数:
  • model -- PyTorch 模型
  • param_only (bool) -- 是否只保存模型的参数(否则保存整个模型)
fastNLP.io.pipe

Pipe用于处理通过 Loader 读取的数据,所有的 Pipe 都包含 processprocess_from_file 两种方法。 process(data_bundle) 传入一个 DataBundle 类型的对象, 在传入的 data_bundle 上进行原位修改,并将其返回; process_from_file(paths) 传入的文件路径,返回一个 DataBundle 类型的对象。 process(data_bundle) 或者 process_from_file(paths) 的返回 data_bundle 中的 DataSet 一般都包含原文与转换为index的输入以及转换为index的target;除了 DataSet 之外, data_bundle 还会包含将field转为index时所建立的词表。

class fastNLP.io.pipe.Pipe[源代码]

别名 fastNLP.io.Pipe fastNLP.io.pipe.Pipe

Pipe是fastNLP中用于处理DataBundle的类,但实际是处理DataBundle中的DataSet。所有Pipe都会在其process()函数的文档中指出该Pipe可处理的DataSet应该具备怎样的格式;在Pipe 文档中说明该Pipe返回后DataSet的格式以及其field的信息;以及新增的Vocabulary的信息。

一般情况下Pipe处理包含以下的几个过程,(1)将raw_words或raw_chars进行tokenize以切分成不同的词或字; (2) 再建立词或字的 Vocabulary , 并将词或字转换为index; (3)将target列建立词表并将target列转为index;

Pipe中提供了两个方法

-process()函数,输入为DataBundle -process_from_file()函数,输入为对应Loader的load函数可接受的类型。

__init__

Initialize self. See help(type(self)) for accurate signature.

process(data_bundle: fastNLP.io.data_bundle.DataBundle) → fastNLP.io.data_bundle.DataBundle[源代码]

对输入的DataBundle进行处理,然后返回该DataBundle。

参数:data_bundle (DataBundle) -- 需要处理的DataBundle对象
返回:
process_from_file(paths) → fastNLP.io.data_bundle.DataBundle[源代码]

传入文件路径,生成处理好的DataBundle对象。paths支持的路径形式可以参考 :fastNLP.io.Loader.load()

参数:paths --
返回:DataBundle
class fastNLP.io.pipe.CWSPipe(dataset_name=None, encoding_type='bmes', replace_num_alpha=True, bigrams=False, trigrams=False)[源代码]

基类 fastNLP.io.Pipe

别名 fastNLP.io.CWSPipe fastNLP.io.pipe.CWSPipe

对CWS数据进行预处理, 处理之后的数据,具备以下的结构

raw_words chars target seq_len
共同 创造 美好... [2, 3, 4...] [0, 2, 0, 2,...] 13
2001年 新年 钟声... [8, 9, 9, 7, ...] [0, 1, 1, 1, 2...] 20
... [...] [...] .

dataset的print_field_meta()函数输出的各个field的被设置成input和target的情况为:

+-------------+-----------+-------+--------+---------+
| field_names | raw_words | chars | target | seq_len |
+-------------+-----------+-------+--------+---------+
|   is_input  |   False   |  True |  True  |   True  |
|  is_target  |   False   | False |  True  |   True  |
| ignore_type |           | False | False  |  False  |
|  pad_value  |           |   0   |   0    |    0    |
+-------------+-----------+-------+--------+---------+
__init__(dataset_name=None, encoding_type='bmes', replace_num_alpha=True, bigrams=False, trigrams=False)[源代码]
参数:
  • dataset_name (str,None) -- 支持'pku', 'msra', 'cityu', 'as', None
  • encoding_type (str) -- 可以选择'bmes', 'segapp'两种。"我 来自 复旦大学...", bmes的tag为[S, B, E, B, M, M, E...]; segapp 的tag为[seg, app, seg, app, app, app, seg, ...]
  • replace_num_alpha (bool) -- 是否将数字和字母用特殊字符替换。
  • bigrams (bool) -- 是否增加一列bigram. bigram的构成是['复', '旦', '大', '学', ...]->["复旦", "旦大", ...]
  • trigrams (bool) -- 是否增加一列trigram. trigram的构成是 ['复', '旦', '大', '学', ...]->["复旦大", "旦大学", ...]
process(data_bundle: fastNLP.io.data_bundle.DataBundle) → fastNLP.io.data_bundle.DataBundle[源代码]

可以处理的DataSet需要包含raw_words列

raw_words
上海 浦东 开发 与 法制 建设 同步
新华社 上海 二月 十日 电 ( 记者 谢金虎 、 张持坚 )
...
参数:data_bundle --
返回:
process_from_file(paths=None) → fastNLP.io.data_bundle.DataBundle[源代码]
参数:paths (str) --
返回:
class fastNLP.io.pipe.AGsNewsPipe(lower: bool = False, tokenizer: str = 'spacy')[源代码]

基类 fastNLP.io.CLSBasePipe

别名 fastNLP.io.AGsNewsPipe fastNLP.io.pipe.AGsNewsPipe

处理AG's News的数据, 处理之后DataSet中的内容如下

下面是使用AGsNewsPipe处理后的DataSet所具备的field
raw_words target words seq_len
I got 'new' tires from them and within... 0 [7, 110, 22, 107, 22, 499, 59, 140, 3,...] 160
Don't waste your time. We had two dif...
0 [277, 17, 278, 38, 30, 112, 24, 85, 27... 40
... . [...] .

dataset的print_field_meta()函数输出的各个field的被设置成input和target的情况为:

+-------------+-----------+--------+-------+---------+
| field_names | raw_words | target | words | seq_len |
+-------------+-----------+--------+-------+---------+
|   is_input  |   False   | False  |  True |   True  |
|  is_target  |   False   |  True  | False |  False  |
| ignore_type |           | False  | False |  False  |
|  pad_value  |           |   0    |   0   |    0    |
+-------------+-----------+--------+-------+---------+
__init__(lower: bool = False, tokenizer: str = 'spacy')[源代码]
参数:
  • lower (bool) -- 是否对输入进行小写化。
  • tokenizer (str) -- 使用哪种tokenize方式将数据切成单词。支持'spacy'和'raw'。raw使用空格作为切分。
process(data_bundle: fastNLP.io.data_bundle.DataBundle)

传入的DataSet应该具备如下的结构

raw_words target
I got 'new' tires from them and... 1
Don't waste your time. We had two... 1
... ...
参数:data_bundle --
返回:
process_from_file(paths=None)[源代码]
参数:paths (str) --
返回:DataBundle
class fastNLP.io.pipe.DBPediaPipe(lower: bool = False, tokenizer: str = 'spacy')[源代码]

基类 fastNLP.io.CLSBasePipe

别名 fastNLP.io.DBPediaPipe fastNLP.io.pipe.DBPediaPipe

处理DBPedia的数据, 处理之后DataSet中的内容如下

下面是使用DBPediaPipe处理后的DataSet所具备的field
raw_words target words seq_len
I got 'new' tires from them and within... 0 [7, 110, 22, 107, 22, 499, 59, 140, 3,...] 160
Don't waste your time. We had two dif...
0 [277, 17, 278, 38, 30, 112, 24, 85, 27... 40
... . [...] .

dataset的print_field_meta()函数输出的各个field的被设置成input和target的情况为:

+-------------+-----------+--------+-------+---------+
| field_names | raw_words | target | words | seq_len |
+-------------+-----------+--------+-------+---------+
|   is_input  |   False   | False  |  True |   True  |
|  is_target  |   False   |  True  | False |  False  |
| ignore_type |           | False  | False |  False  |
|  pad_value  |           |   0    |   0   |    0    |
+-------------+-----------+--------+-------+---------+
__init__(lower: bool = False, tokenizer: str = 'spacy')[源代码]
参数:
  • lower (bool) -- 是否对输入进行小写化。
  • tokenizer (str) -- 使用哪种tokenize方式将数据切成单词。支持'spacy'和'raw'。raw使用空格作为切分。
process(data_bundle: fastNLP.io.data_bundle.DataBundle)

传入的DataSet应该具备如下的结构

raw_words target
I got 'new' tires from them and... 1
Don't waste your time. We had two... 1
... ...
参数:data_bundle --
返回:
process_from_file(paths=None)[源代码]
参数:paths (str) --
返回:DataBundle
class fastNLP.io.pipe.YelpFullPipe(lower: bool = False, granularity=5, tokenizer: str = 'spacy')[源代码]

基类 fastNLP.io.CLSBasePipe

别名 fastNLP.io.YelpFullPipe fastNLP.io.pipe.YelpFullPipe

处理YelpFull的数据, 处理之后DataSet中的内容如下

下面是使用YelpFullPipe处理后的DataSet所具备的field
raw_words target words seq_len
I got 'new' tires from them and within... 0 [7, 110, 22, 107, 22, 499, 59, 140, 3,...] 160
Don't waste your time. We had two dif...
0 [277, 17, 278, 38, 30, 112, 24, 85, 27... 40
... . [...] .

dataset的print_field_meta()函数输出的各个field的被设置成input和target的情况为:

+-------------+-----------+--------+-------+---------+
| field_names | raw_words | target | words | seq_len |
+-------------+-----------+--------+-------+---------+
|   is_input  |   False   | False  |  True |   True  |
|  is_target  |   False   |  True  | False |  False  |
| ignore_type |           | False  | False |  False  |
|  pad_value  |           |   0    |   0   |    0    |
+-------------+-----------+--------+-------+---------+
__init__(lower: bool = False, granularity=5, tokenizer: str = 'spacy')[源代码]
参数:
  • lower (bool) -- 是否对输入进行小写化。
  • granularity (int) -- 支持2, 3, 5。若为2, 则认为是2分类问题,将1、2归为1类,4、5归为一类,丢掉2;若为3, 则有3分类问题,将 1、2归为1类,3归为1类,4、5归为1类;若为5, 则有5分类问题。
  • tokenizer (str) -- 使用哪种tokenize方式将数据切成单词。支持'spacy'和'raw'。raw使用空格作为切分。
process(data_bundle)[源代码]

传入的DataSet应该具备如下的结构

raw_words target
I got 'new' tires from them and... 1
Don't waste your time. We had two... 1
... ...
参数:data_bundle --
返回:
process_from_file(paths=None)[源代码]
参数:paths --
返回:DataBundle
class fastNLP.io.pipe.YelpPolarityPipe(lower: bool = False, tokenizer: str = 'spacy')[源代码]

基类 fastNLP.io.CLSBasePipe

别名 fastNLP.io.YelpPolarityPipe fastNLP.io.pipe.YelpPolarityPipe

处理YelpPolarity的数据, 处理之后DataSet中的内容如下

下面是使用YelpFullPipe处理后的DataSet所具备的field
raw_words target words seq_len
I got 'new' tires from them and within... 0 [7, 110, 22, 107, 22, 499, 59, 140, 3,...] 160
Don't waste your time. We had two dif...
0 [277, 17, 278, 38, 30, 112, 24, 85, 27... 40
... . [...] .

dataset的print_field_meta()函数输出的各个field的被设置成input和target的情况为:

+-------------+-----------+--------+-------+---------+
| field_names | raw_words | target | words | seq_len |
+-------------+-----------+--------+-------+---------+
|   is_input  |   False   | False  |  True |   True  |
|  is_target  |   False   |  True  | False |  False  |
| ignore_type |           | False  | False |  False  |
|  pad_value  |           |   0    |   0   |    0    |
+-------------+-----------+--------+-------+---------+
__init__(lower: bool = False, tokenizer: str = 'spacy')[源代码]
参数:
  • lower (bool) -- 是否对输入进行小写化。
  • tokenizer (str) -- 使用哪种tokenize方式将数据切成单词。支持'spacy'和'raw'。raw使用空格作为切分。
process(data_bundle: fastNLP.io.data_bundle.DataBundle)

传入的DataSet应该具备如下的结构

raw_words target
I got 'new' tires from them and... 1
Don't waste your time. We had two... 1
... ...
参数:data_bundle --
返回:
process_from_file(paths=None)[源代码]
参数:paths (str) --
返回:DataBundle
class fastNLP.io.pipe.SSTPipe(subtree=False, train_subtree=True, lower=False, granularity=5, tokenizer='spacy')[源代码]

基类 fastNLP.io.CLSBasePipe

别名 fastNLP.io.SSTPipe fastNLP.io.pipe.SSTPipe

经过该Pipe之后,DataSet中具备的field如下所示

下面是使用SSTPipe处理后的DataSet所具备的field
raw_words words target seq_len
It 's a lovely film with lovely perfor... 1 [187, 6, 5, 132, 120, 70, 132, 188, 25... 13
No one goes unindicted here , which is... 0 [191, 126, 192, 193, 194, 4, 195, 17, ... 13
... . [...] .

dataset的print_field_meta()函数输出的各个field的被设置成input和target的情况为:

+-------------+-----------+--------+-------+---------+
| field_names | raw_words | target | words | seq_len |
+-------------+-----------+--------+-------+---------+
|   is_input  |   False   | False  |  True |   True  |
|  is_target  |   False   |  True  | False |  False  |
| ignore_type |           | False  | False |  False  |
|  pad_value  |           |   0    |   0   |    0    |
+-------------+-----------+--------+-------+---------+
__init__(subtree=False, train_subtree=True, lower=False, granularity=5, tokenizer='spacy')[源代码]
参数:
  • subtree (bool) -- 是否将train, test, dev数据展开为子树,扩充数据量。 Default: False
  • train_subtree (bool) -- 是否将train集通过子树扩展数据。
  • lower (bool) -- 是否对输入进行小写化。
  • granularity (int) -- 支持2, 3, 5。若为2, 则认为是2分类问题,将0、1归为1类,3、4归为一类,丢掉2;若为3, 则有3分类问题,将 0、1归为1类,2归为1类,3、4归为1类;若为5, 则有5分类问题。
  • tokenizer (str) -- 使用哪种tokenize方式将数据切成单词。支持'spacy'和'raw'。raw使用空格作为切分。
process(data_bundle: fastNLP.io.data_bundle.DataBundle)[源代码]

对DataBundle中的数据进行预处理。输入的DataSet应该至少拥有raw_words这一列,且内容类似与

下面是使用SSTLoader读取的DataSet所具备的field
raw_words
(2 (3 (3 Effective) (2 but)) (1 (1 too-tepid)...
(3 (3 (2 If) (3 (2 you) (3 (2 sometimes) ...
...
参数:data_bundle (DataBundle) -- 需要处理的DataBundle对象
返回:
class fastNLP.io.pipe.SST2Pipe(lower=False, tokenizer='spacy')[源代码]

基类 fastNLP.io.CLSBasePipe

别名 fastNLP.io.SST2Pipe fastNLP.io.pipe.SST2Pipe

加载SST2的数据, 处理完成之后DataSet将拥有以下的field

raw_words target words seq_len
it 's a charming and often affecting j... 1 [19, 9, 6, 111, 5, 112, 113, 114, 3] 9
unflinchingly bleak and desperate 0 [115, 116, 5, 117] 4
... ... . .

dataset的print_field_meta()函数输出的各个field的被设置成input和target的情况为:

+-------------+-----------+--------+-------+---------+
| field_names | raw_words | target | words | seq_len |
+-------------+-----------+--------+-------+---------+
|   is_input  |   False   | False  |  True |   True  |
|  is_target  |   False   |  True  | False |  False  |
| ignore_type |           | False  | False |  False  |
|  pad_value  |           |   0    |   0   |    0    |
+-------------+-----------+--------+-------+---------+
__init__(lower=False, tokenizer='spacy')[源代码]
参数:
  • lower (bool) -- 是否对输入进行小写化。
  • tokenizer (str) -- 使用哪种tokenize方式将数据切成单词。支持'spacy'和'raw'。raw使用空格作为切分。
process(data_bundle: fastNLP.io.data_bundle.DataBundle)

传入的DataSet应该具备如下的结构

raw_words target
I got 'new' tires from them and... 1
Don't waste your time. We had two... 1
... ...
参数:data_bundle --
返回:
process_from_file(paths=None)[源代码]
参数:paths (str) -- 如果为None,则自动下载并缓存到fastNLP的缓存地址。
返回:DataBundle
class fastNLP.io.pipe.IMDBPipe(lower: bool = False, tokenizer: str = 'spacy')[源代码]

基类 fastNLP.io.CLSBasePipe

别名 fastNLP.io.IMDBPipe fastNLP.io.pipe.IMDBPipe

经过本Pipe处理后DataSet将如下

输出DataSet的field
raw_words target words seq_len
Bromwell High is a cartoon ... 0 [3, 5, 6, 9, ...] 20
Story of a man who has ... 1 [20, 43, 9, 10, ...] 31
... . [...] .

其中raw_words为str类型,是原文; words是转换为index的输入; target是转换为index的目标值; words列被设置为input; target列被设置为target。

dataset的print_field_meta()函数输出的各个field的被设置成input和target的情况为:

+-------------+-----------+--------+-------+---------+
| field_names | raw_words | target | words | seq_len |
+-------------+-----------+--------+-------+---------+
|   is_input  |   False   | False  |  True |   True  |
|  is_target  |   False   |  True  | False |  False  |
| ignore_type |           | False  | False |  False  |
|  pad_value  |           |   0    |   0   |    0    |
+-------------+-----------+--------+-------+---------+
__init__(lower: bool = False, tokenizer: str = 'spacy')[源代码]
参数:
  • lower (bool) -- 是否将words列的数据小写。
  • tokenizer (str) -- 使用什么tokenizer来将句子切分为words. 支持spacy, raw两种。raw即使用空格拆分。
process(data_bundle: fastNLP.io.data_bundle.DataBundle)[源代码]

期待的DataBunlde中输入的DataSet应该类似于如下,有两个field,raw_words和target,且均为str类型

输入DataSet的field
raw_words target
Bromwell High is a cartoon ... pos
Story of a man who has ... neg
... ...
参数:data_bundle (DataBunlde) -- 传入的DataBundle中的DataSet必须包含raw_words和target两个field,且raw_words列应该为str, target列应该为str。
返回:DataBundle
process_from_file(paths=None)[源代码]
参数:paths -- 支持路径类型参见 fastNLP.io.loader.Loader 的load函数。
返回:DataBundle
class fastNLP.io.pipe.ChnSentiCorpPipe(bigrams=False, trigrams=False)[源代码]

基类 fastNLP.io.Pipe

别名 fastNLP.io.ChnSentiCorpPipe fastNLP.io.pipe.ChnSentiCorpPipe

处理之后的DataSet有以下的结构

raw_chars target chars seq_len
這間酒店環境和服務態度亦算不錯,但房間空間太小~~ 1 [2, 3, 4, 5, ...] 31
<荐书> 推荐所有喜欢<红楼>... 1 [10, 21, ....] 25
...      

其中chars, seq_len是input,target是target dataset的print_field_meta()函数输出的各个field的被设置成input和target的情况为:

+-------------+-----------+--------+-------+---------+
| field_names | raw_chars | target | chars | seq_len |
+-------------+-----------+--------+-------+---------+
|   is_input  |   False   |  True  |  True |   True  |
|  is_target  |   False   |  True  | False |  False  |
| ignore_type |           | False  | False |  False  |
|  pad_value  |           |   0    |   0   |    0    |
+-------------+-----------+--------+-------+---------+
__init__(bigrams=False, trigrams=False)[源代码]
参数:
  • bigrams (bool) -- 是否增加一列bigrams. bigrams的构成是['复', '旦', '大', '学', ...]->["复旦", "旦大", ...]。如果 设置为True,返回的DataSet将有一列名为bigrams, 且已经转换为了index并设置为input,对应的vocab可以通过 data_bundle.get_vocab('bigrams')获取.
  • trigrams (bool) -- 是否增加一列trigrams. trigrams的构成是 ['复', '旦', '大', '学', ...]->["复旦大", "旦大学", ...] 。如果设置为True,返回的DataSet将有一列名为trigrams, 且已经转换为了index并设置为input,对应的vocab可以通过 data_bundle.get_vocab('trigrams')获取.
process(data_bundle: fastNLP.io.data_bundle.DataBundle)[源代码]

可以处理的DataSet应该具备以下的field

raw_chars target
這間酒店環境和服務態度亦算不錯,但房間空間太小~~ 1
<荐书> 推荐所有喜欢<红楼>... 1
...  
参数:data_bundle --
返回:
process_from_file(paths=None)[源代码]
参数:paths -- 支持路径类型参见 fastNLP.io.loader.Loader 的load函数。
返回:DataBundle
class fastNLP.io.pipe.THUCNewsPipe(bigrams=False, trigrams=False)[源代码]

基类 fastNLP.io.CLSBasePipe

别名 fastNLP.io.THUCNewsPipe fastNLP.io.pipe.THUCNewsPipe

处理之后的DataSet有以下的结构

raw_chars target chars seq_len
马晓旭意外受伤让国奥警惕 无奈大雨格外青睐殷家军记者傅亚雨沈阳报道... 0 [409, 1197, 2146, 213, ...] 746
...      

其中chars, seq_len是input,target是target dataset的print_field_meta()函数输出的各个field的被设置成input和target的情况为:

+-------------+-----------+--------+-------+---------+
| field_names | raw_chars | target | chars | seq_len |
+-------------+-----------+--------+-------+---------+
|   is_input  |   False   |  True  |  True |   True  |
|  is_target  |   False   |  True  | False |  False  |
| ignore_type |           | False  | False |  False  |
|  pad_value  |           |   0    |   0   |    0    |
+-------------+-----------+--------+-------+---------+
param bool bigrams:
 是否增加一列bigrams. bigrams的构成是['复', '旦', '大', '学', ...]->["复旦", "旦大", ...]。如果 设置为True,返回的DataSet将有一列名为bigrams, 且已经转换为了index并设置为input,对应的vocab可以通过 data_bundle.get_vocab('bigrams')获取.
param bool trigrams:
 是否增加一列trigrams. trigrams的构成是 ['复', '旦', '大', '学', ...]->["复旦大", "旦大学", ...] 。如果设置为True,返回的DataSet将有一列名为trigrams, 且已经转换为了index并设置为input,对应的vocab可以通过 data_bundle.get_vocab('trigrams')获取.
process(data_bundle: fastNLP.io.data_bundle.DataBundle)[源代码]

可处理的DataSet应具备如下的field

raw_words target
马晓旭意外受伤让国奥警惕 无奈大雨格外青睐殷家军记者傅亚雨沈阳报道 ... 体育
... ...
参数:data_bundle --
返回:
process_from_file(paths=None)[源代码]
参数:paths -- 支持路径类型参见 fastNLP.io.loader.Loader 的load函数。
返回:DataBundle
class fastNLP.io.pipe.WeiboSenti100kPipe(bigrams=False, trigrams=False)[源代码]

基类 fastNLP.io.CLSBasePipe

别名 fastNLP.io.WeiboSenti100kPipe fastNLP.io.pipe.WeiboSenti100kPipe

处理之后的DataSet有以下的结构

raw_chars target chars seq_len
六一出生的?好讽刺…… //@祭春姬:他爸爸是外星人吧 //@面孔小高:现在的孩子都怎么了 [怒][怒][怒] 0 [0, 690, 18, ...] 56
...      

其中chars, seq_len是input,target是target dataset的print_field_meta()函数输出的各个field的被设置成input和target的情况为:

+-------------+-----------+--------+-------+---------+
| field_names | raw_chars | target | chars | seq_len |
+-------------+-----------+--------+-------+---------+
|   is_input  |   False   |  True  |  True |   True  |
|  is_target  |   False   |  True  | False |  False  |
| ignore_type |           | False  | False |  False  |
|  pad_value  |           |   0    |   0   |    0    |
+-------------+-----------+--------+-------+---------+
param bool bigrams:
 是否增加一列bigrams. bigrams的构成是['复', '旦', '大', '学', ...]->["复旦", "旦大", ...]。如果 设置为True,返回的DataSet将有一列名为bigrams, 且已经转换为了index并设置为input,对应的vocab可以通过 data_bundle.get_vocab('bigrams')获取.
param bool trigrams:
 是否增加一列trigrams. trigrams的构成是 ['复', '旦', '大', '学', ...]->["复旦大", "旦大学", ...] 。如果设置为True,返回的DataSet将有一列名为trigrams, 且已经转换为了index并设置为input,对应的vocab可以通过 data_bundle.get_vocab('trigrams')获取.
process(data_bundle: fastNLP.io.data_bundle.DataBundle)[源代码]

可处理的DataSet应具备以下的field

raw_chars target
六一出生的?好讽刺…… //@祭春姬:他爸爸是外星人吧 //@面孔小高:现在的孩子都怎么了 [怒][怒][怒] 0
... ...
参数:data_bundle --
返回:
process_from_file(paths=None)[源代码]
参数:paths -- 支持路径类型参见 fastNLP.io.loader.Loader 的load函数。
返回:DataBundle
class fastNLP.io.pipe.Conll2003NERPipe(encoding_type: str = 'bio', lower: bool = False)[源代码]

基类 fastNLP.io._NERPipe

别名 fastNLP.io.Conll2003NERPipe fastNLP.io.pipe.Conll2003NERPipe

Conll2003的NER任务的处理Pipe, 该Pipe会(1)复制raw_words列,并命名为words; (2)在words, target列建立词表 (创建 fastNLP.Vocabulary 对象,所以在返回的DataBundle中将有两个Vocabulary); (3)将words,target列根据相应的 Vocabulary转换为index。 经过该Pipe过后,DataSet中的内容如下所示

Following is a demo layout of DataSet returned by Conll2003Loader
raw_words target words seq_len
[Nadim, Ladki] [1, 2] [2, 3] 2
[AL-AIN, United, Arab, ...] [3, 4,...] [4, 5, 6,...] 6
[...] [...] [...] .

raw_words列为List[str], 是未转换的原始数据; words列为List[int],是转换为index的输入数据; target列是List[int],是转换为index的 target。返回的DataSet中被设置为input有words, target, seq_len; 设置为target有target。

dataset的print_field_meta()函数输出的各个field的被设置成input和target的情况为:

+-------------+-----------+--------+-------+---------+
| field_names | raw_words | target | words | seq_len |
+-------------+-----------+--------+-------+---------+
|   is_input  |   False   |  True  |  True |   True  |
|  is_target  |   False   |  True  | False |   True  |
| ignore_type |           | False  | False |  False  |
|  pad_value  |           |   0    |   0   |    0    |
+-------------+-----------+--------+-------+---------+
__init__(encoding_type: str = 'bio', lower: bool = False)
Param:str encoding_type: target列使用什么类型的encoding方式,支持bioes, bio两种。
参数:lower (bool) -- 是否将words小写化后再建立词表,绝大多数情况都不需要设置为True。
process(data_bundle: fastNLP.io.data_bundle.DataBundle) → fastNLP.io.data_bundle.DataBundle

支持的DataSet的field为

raw_words target
[Nadim, Ladki] [B-PER, I-PER]
[AL-AIN, United, Arab, ...] [B-LOC, B-LOC, I-LOC, ...]
[...] [...]
参数:data_bundle (DataBundle) -- 传入的DataBundle中的DataSet必须包含raw_words和ner两个field,且两个field的内容均为List[str]在传入DataBundle基础上原位修改。
Return DataBundle:
 
process_from_file(paths) → fastNLP.io.data_bundle.DataBundle[源代码]
参数:paths -- 支持路径类型参见 fastNLP.io.loader.ConllLoader 的load函数。
返回:DataBundle
class fastNLP.io.pipe.OntoNotesNERPipe(encoding_type: str = 'bio', lower: bool = False)[源代码]

基类 fastNLP.io._NERPipe

别名 fastNLP.io.OntoNotesNERPipe fastNLP.io.pipe.OntoNotesNERPipe

处理OntoNotes的NER数据,处理之后DataSet中的field情况为

raw_words target words seq_len
[Nadim, Ladki] [1, 2] [2, 3] 2
[AL-AIN, United, Arab, ...] [3, 4] [4, 5, 6,...] 6
[...] [...] [...] .

raw_words列为List[str], 是未转换的原始数据; words列为List[int],是转换为index的输入数据; target列是List[int],是转换为index的 target。返回的DataSet中被设置为input有words, target, seq_len; 设置为target有target。

dataset的print_field_meta()函数输出的各个field的被设置成input和target的情况为:

+-------------+-----------+--------+-------+---------+
| field_names | raw_words | target | words | seq_len |
+-------------+-----------+--------+-------+---------+
|   is_input  |   False   |  True  |  True |   True  |
|  is_target  |   False   |  True  | False |   True  |
| ignore_type |           | False  | False |  False  |
|  pad_value  |           |   0    |   0   |    0    |
+-------------+-----------+--------+-------+---------+
__init__(encoding_type: str = 'bio', lower: bool = False)
Param:str encoding_type: target列使用什么类型的encoding方式,支持bioes, bio两种。
参数:lower (bool) -- 是否将words小写化后再建立词表,绝大多数情况都不需要设置为True。
process(data_bundle: fastNLP.io.data_bundle.DataBundle) → fastNLP.io.data_bundle.DataBundle

支持的DataSet的field为

raw_words target
[Nadim, Ladki] [B-PER, I-PER]
[AL-AIN, United, Arab, ...] [B-LOC, B-LOC, I-LOC, ...]
[...] [...]
参数:data_bundle (DataBundle) -- 传入的DataBundle中的DataSet必须包含raw_words和ner两个field,且两个field的内容均为List[str]在传入DataBundle基础上原位修改。
Return DataBundle:
 
class fastNLP.io.pipe.MsraNERPipe(encoding_type: str = 'bio', bigrams=False, trigrams=False)[源代码]

基类 fastNLP.io._CNNERPipe

别名 fastNLP.io.MsraNERPipe fastNLP.io.pipe.MsraNERPipe

处理MSRA-NER的数据,处理之后的DataSet的field情况为

raw_chars target chars seq_len
[相, 比, 之, 下,...] [0, 0, 0, 0, ...] [2, 3, 4, 5, ...] 11
[青, 岛, 海, 牛, 队, 和, ...] [1, 2, 3, ...] [10, 21, ....] 21
[...] [...] [...] .

raw_chars列为List[str], 是未转换的原始数据; chars列为List[int],是转换为index的输入数据; target列是List[int],是转换为index的 target。返回的DataSet中被设置为input有chars, target, seq_len; 设置为target有target。

dataset的print_field_meta()函数输出的各个field的被设置成input和target的情况为:

+-------------+-----------+--------+-------+---------+
| field_names | raw_chars | target | chars | seq_len |
+-------------+-----------+--------+-------+---------+
|   is_input  |   False   |  True  |  True |   True  |
|  is_target  |   False   |  True  | False |   True  |
| ignore_type |           | False  | False |  False  |
|  pad_value  |           |   0    |   0   |    0    |
+-------------+-----------+--------+-------+---------+
__init__(encoding_type: str = 'bio', bigrams=False, trigrams=False)
参数:
  • encoding_type (str) -- target列使用什么类型的encoding方式,支持bioes, bio两种。
  • bigrams (bool) -- 是否增加一列bigrams. bigrams的构成是['复', '旦', '大', '学', ...]->["复旦", "旦大", ...]。如果 设置为True,返回的DataSet将有一列名为bigrams, 且已经转换为了index并设置为input,对应的vocab可以通过 data_bundle.get_vocab('bigrams')获取.
  • trigrams (bool) -- 是否增加一列trigrams. trigrams的构成是 ['复', '旦', '大', '学', ...]->["复旦大", "旦大学", ...] 。如果设置为True,返回的DataSet将有一列名为trigrams, 且已经转换为了index并设置为input,对应的vocab可以通过 data_bundle.get_vocab('trigrams')获取.
process(data_bundle: fastNLP.io.data_bundle.DataBundle) → fastNLP.io.data_bundle.DataBundle

支持的DataSet的field为

raw_chars target
[相, 比, 之, 下,...] [O, O, O, O, ...]
[青, 岛, 海, 牛, 队, 和, ...] [B-ORG, I-ORG, I-ORG, ...]
[...] [...]

raw_chars列为List[str], 是未转换的原始数据; chars列为List[int],是转换为index的输入数据; target列是List[int], 是转换为index的target。返回的DataSet中被设置为input有chars, target, seq_len; 设置为target有target。

参数:data_bundle (DataBundle) -- 传入的DataBundle中的DataSet必须包含raw_words和ner两个field,且两个field的内容均为List[str]。在传入DataBundle基础上原位修改。
返回:DataBundle
class fastNLP.io.pipe.WeiboNERPipe(encoding_type: str = 'bio', bigrams=False, trigrams=False)[源代码]

基类 fastNLP.io._CNNERPipe

别名 fastNLP.io.WeiboNERPipe fastNLP.io.pipe.WeiboNERPipe

处理weibo的ner的数据,处理之后的DataSet的field情况为

raw_chars chars target seq_len
['老', '百', '姓'] [4, 3, 3] [38, 39, 40] 3
['心'] [0] [41] 1
[...] [...] [...] .

raw_chars列为List[str], 是未转换的原始数据; chars列为List[int],是转换为index的输入数据; target列是List[int],是转换为index的 target。返回的DataSet中被设置为input有chars, target, seq_len; 设置为target有target。

dataset的print_field_meta()函数输出的各个field的被设置成input和target的情况为:

+-------------+-----------+--------+-------+---------+
| field_names | raw_chars | target | chars | seq_len |
+-------------+-----------+--------+-------+---------+
|   is_input  |   False   |  True  |  True |   True  |
|  is_target  |   False   |  True  | False |   True  |
| ignore_type |           | False  | False |  False  |
|  pad_value  |           |   0    |   0   |    0    |
+-------------+-----------+--------+-------+---------+
__init__(encoding_type: str = 'bio', bigrams=False, trigrams=False)
参数:
  • encoding_type (str) -- target列使用什么类型的encoding方式,支持bioes, bio两种。
  • bigrams (bool) -- 是否增加一列bigrams. bigrams的构成是['复', '旦', '大', '学', ...]->["复旦", "旦大", ...]。如果 设置为True,返回的DataSet将有一列名为bigrams, 且已经转换为了index并设置为input,对应的vocab可以通过 data_bundle.get_vocab('bigrams')获取.
  • trigrams (bool) -- 是否增加一列trigrams. trigrams的构成是 ['复', '旦', '大', '学', ...]->["复旦大", "旦大学", ...] 。如果设置为True,返回的DataSet将有一列名为trigrams, 且已经转换为了index并设置为input,对应的vocab可以通过 data_bundle.get_vocab('trigrams')获取.
process(data_bundle: fastNLP.io.data_bundle.DataBundle) → fastNLP.io.data_bundle.DataBundle

支持的DataSet的field为

raw_chars target
[相, 比, 之, 下,...] [O, O, O, O, ...]
[青, 岛, 海, 牛, 队, 和, ...] [B-ORG, I-ORG, I-ORG, ...]
[...] [...]

raw_chars列为List[str], 是未转换的原始数据; chars列为List[int],是转换为index的输入数据; target列是List[int], 是转换为index的target。返回的DataSet中被设置为input有chars, target, seq_len; 设置为target有target。

参数:data_bundle (DataBundle) -- 传入的DataBundle中的DataSet必须包含raw_words和ner两个field,且两个field的内容均为List[str]。在传入DataBundle基础上原位修改。
返回:DataBundle
class fastNLP.io.pipe.PeopleDailyPipe(encoding_type: str = 'bio', bigrams=False, trigrams=False)[源代码]

基类 fastNLP.io._CNNERPipe

别名 fastNLP.io.PeopleDailyPipe fastNLP.io.pipe.PeopleDailyPipe

处理people daily的ner的数据,处理之后的DataSet的field情况为

raw_chars target chars seq_len
[相, 比, 之, 下,...] [0, 0, 0, 0, ...] [2, 3, 4, 5, ...] 11
[青, 岛, 海, 牛, 队, 和, ...] [1, 2, 3, ...] [10, 21, ....] 21
[...] [...] [...] .

raw_chars列为List[str], 是未转换的原始数据; chars列为List[int],是转换为index的输入数据; target列是List[int],是转换为index的 target。返回的DataSet中被设置为input有chars, target, seq_len; 设置为target有target。

dataset的print_field_meta()函数输出的各个field的被设置成input和target的情况为:

+-------------+-----------+--------+-------+---------+
| field_names | raw_chars | target | chars | seq_len |
+-------------+-----------+--------+-------+---------+
|   is_input  |   False   |  True  |  True |   True  |
|  is_target  |   False   |  True  | False |   True  |
| ignore_type |           | False  | False |  False  |
|  pad_value  |           |   0    |   0   |    0    |
+-------------+-----------+--------+-------+---------+
__init__(encoding_type: str = 'bio', bigrams=False, trigrams=False)
参数:
  • encoding_type (str) -- target列使用什么类型的encoding方式,支持bioes, bio两种。
  • bigrams (bool) -- 是否增加一列bigrams. bigrams的构成是['复', '旦', '大', '学', ...]->["复旦", "旦大", ...]。如果 设置为True,返回的DataSet将有一列名为bigrams, 且已经转换为了index并设置为input,对应的vocab可以通过 data_bundle.get_vocab('bigrams')获取.
  • trigrams (bool) -- 是否增加一列trigrams. trigrams的构成是 ['复', '旦', '大', '学', ...]->["复旦大", "旦大学", ...] 。如果设置为True,返回的DataSet将有一列名为trigrams, 且已经转换为了index并设置为input,对应的vocab可以通过 data_bundle.get_vocab('trigrams')获取.
process(data_bundle: fastNLP.io.data_bundle.DataBundle) → fastNLP.io.data_bundle.DataBundle

支持的DataSet的field为

raw_chars target
[相, 比, 之, 下,...] [O, O, O, O, ...]
[青, 岛, 海, 牛, 队, 和, ...] [B-ORG, I-ORG, I-ORG, ...]
[...] [...]

raw_chars列为List[str], 是未转换的原始数据; chars列为List[int],是转换为index的输入数据; target列是List[int], 是转换为index的target。返回的DataSet中被设置为input有chars, target, seq_len; 设置为target有target。

参数:data_bundle (DataBundle) -- 传入的DataBundle中的DataSet必须包含raw_words和ner两个field,且两个field的内容均为List[str]。在传入DataBundle基础上原位修改。
返回:DataBundle
class fastNLP.io.pipe.Conll2003Pipe(chunk_encoding_type='bioes', ner_encoding_type='bioes', lower: bool = False)[源代码]

基类 fastNLP.io.Pipe

别名 fastNLP.io.Conll2003Pipe fastNLP.io.pipe.Conll2003Pipe

经过该Pipe后,DataSet中的内容如下

raw_words pos chunk ner words seq_len
[Nadim, Ladki] [0, 0] [1, 2] [1, 2] [2, 3] 2
[AL-AIN, United, Arab, ...] [1, 2...] [3, 4...] [3, 4...] [4, 5, 6,...] 6
[...] [...] [...] [...] [...] .

其中words, seq_len是input; pos, chunk, ner, seq_len是target dataset的print_field_meta()函数输出的各个field的被设置成input和target的情况为:

+-------------+-----------+-------+-------+-------+-------+---------+
| field_names | raw_words |  pos  | chunk |  ner  | words | seq_len |
+-------------+-----------+-------+-------+-------+-------+---------+
|   is_input  |   False   | False | False | False |  True |   True  |
|  is_target  |   False   |  True |  True |  True | False |   True  |
| ignore_type |           | False | False | False | False |  False  |
|  pad_value  |           |   0   |   0   |   0   |   0   |    0    |
+-------------+-----------+-------+-------+-------+-------+---------+
__init__(chunk_encoding_type='bioes', ner_encoding_type='bioes', lower: bool = False)[源代码]
参数:
  • chunk_encoding_type (str) -- 支持bioes, bio。
  • ner_encoding_type (str) -- 支持bioes, bio。
  • lower (bool) -- 是否将words列小写化后再建立词表
process(data_bundle) → fastNLP.io.data_bundle.DataBundle[源代码]

输入的DataSet应该类似于如下的形式

raw_words pos chunk ner  
[Nadim, Ladki] [NNP, NNP] [B-NP, I-NP] [B-PER, I-PER]  
[AL-AIN, United, Arab, ...] [NNP, NNP...] [B-NP, B-NP, ...] [B-LOC, B-LOC,...]  
[...] [...] [...] [...] .
参数:data_bundle --
返回:传入的DataBundle
process_from_file(paths)[源代码]
参数:paths --
返回:
class fastNLP.io.pipe.MatchingBertPipe(lower=False, tokenizer: str = 'raw')[源代码]

基类 fastNLP.io.Pipe

别名 fastNLP.io.MatchingBertPipe fastNLP.io.pipe.MatchingBertPipe

Matching任务的Bert pipe,输出的DataSet将包含以下的field

raw_words1 raw_words2 target words seq_len
The new rights are... Everyone really likes.. 1 [2, 3, 4, 5, ...] 10
This site includes a... The Government Executive... 0 [11, 12, 13,...] 5
... ... . [...] .

words列是将raw_words1(即premise), raw_words2(即hypothesis)使用"[SEP]"链接起来转换为index的。 words列被设置为input,target列被设置为target和input(设置为input以方便在forward函数中计算loss, 如果不在forward函数中计算loss也不影响,fastNLP将根据forward函数的形参名进行传参).

dataset的print_field_meta()函数输出的各个field的被设置成input和target的情况为:

+-------------+------------+------------+--------+-------+---------+
| field_names | raw_words1 | raw_words2 | target | words | seq_len |
+-------------+------------+------------+--------+-------+---------+
|   is_input  |   False    |   False    | False  |  True |   True  |
|  is_target  |   False    |   False    |  True  | False |  False  |
| ignore_type |            |            | False  | False |  False  |
|  pad_value  |            |            |   0    |   0   |    0    |
+-------------+------------+------------+--------+-------+---------+
__init__(lower=False, tokenizer: str = 'raw')[源代码]
参数:
  • lower (bool) -- 是否将word小写化。
  • tokenizer (str) -- 使用什么tokenizer来将句子切分为words. 支持spacy, raw两种。raw即使用空格拆分。
process(data_bundle)[源代码]

输入的data_bundle中的dataset需要具有以下结构:

raw_words1 raw_words2 target
Dana Reeve, the widow of the actor... Christopher Reeve had an... not_entailment
... ...  
参数:data_bundle --
返回:
process_from_file(paths) → fastNLP.io.data_bundle.DataBundle

传入文件路径,生成处理好的DataBundle对象。paths支持的路径形式可以参考 :fastNLP.io.Loader.load()

参数:paths --
返回:DataBundle
class fastNLP.io.pipe.MatchingPipe(lower=False, tokenizer: str = 'raw')[源代码]

基类 fastNLP.io.Pipe

别名 fastNLP.io.MatchingPipe fastNLP.io.pipe.MatchingPipe

Matching任务的Pipe。输出的DataSet将包含以下的field

raw_words1 raw_words2 target words1 words2 seq_len1 seq_len2
The new rights are... Everyone really likes.. 1 [2, 3, 4, 5, ...] [10, 20, 6] 10 13
This site includes a... The Government Executive... 0 [11, 12, 13,...] [2, 7, ...] 6 7
... ... . [...] [...] . .

words1是premise,words2是hypothesis。其中words1,words2,seq_len1,seq_len2被设置为input;target被设置为target 和input(设置为input以方便在forward函数中计算loss,如果不在forward函数中计算loss也不影响,fastNLP将根据forward函数 的形参名进行传参)。

dataset的print_field_meta()函数输出的各个field的被设置成input和target的情况为:

+-------------+------------+------------+--------+--------+--------+----------+----------+
| field_names | raw_words1 | raw_words2 | target | words1 | words2 | seq_len1 | seq_len2 |
+-------------+------------+------------+--------+--------+--------+----------+----------+
|   is_input  |   False    |   False    | False  |  True  |  True  |   True   |   True   |
|  is_target  |   False    |   False    |  True  | False  | False  |  False   |  False   |
| ignore_type |            |            | False  | False  | False  |  False   |  False   |
|  pad_value  |            |            |   0    |   0    |   0    |    0     |    0     |
+-------------+------------+------------+--------+--------+--------+----------+----------+
__init__(lower=False, tokenizer: str = 'raw')[源代码]
参数:
  • lower (bool) -- 是否将所有raw_words转为小写。
  • tokenizer (str) -- 将原始数据tokenize的方式。支持spacy, raw. spacy是使用spacy切分,raw就是用空格切分。
process(data_bundle)[源代码]

接受的DataBundle中的DataSet应该具有以下的field, target列可以没有

raw_words1 raw_words2 target
The new rights are... Everyone really likes.. entailment
This site includes a... The Government Executive... not_entailment
... ...  
参数:data_bundle (DataBundle) -- 通过loader读取得到的data_bundle,里面包含了数据集的原始数据内容
返回:data_bundle
process_from_file(paths) → fastNLP.io.data_bundle.DataBundle

传入文件路径,生成处理好的DataBundle对象。paths支持的路径形式可以参考 :fastNLP.io.Loader.load()

参数:paths --
返回:DataBundle
class fastNLP.io.pipe.CoReferencePipe(config)[源代码]

基类 fastNLP.io.pipe.Pipe

别名 fastNLP.io.CoReferencePipe fastNLP.io.pipe.CoReferencePipe

对Coreference resolution问题进行处理,得到文章种类/说话者/字符级信息/序列长度。

处理完成后数据包含文章类别、speaker信息、句子信息、句子对应的index、char、句子长度、target:

words1 words2 words3 words4 chars seq_len target
bc [[0,0],[1,1]] [['I','am'],[]] [[1,2],[]] [[[1],[2,3]],[]] [2,3] [[[2,3],[6,7]],[[10,12],[20,22]]]
[...] [...] [...] [...] [...] [...] [...]

dataset的print_field_meta()函数输出的各个field的被设置成input和target的情况为:

+-------------+-----------+--------+-------+---------+
| field_names | raw_chars | target | chars | seq_len |
+-------------+-----------+--------+-------+---------+
|   is_input  |   False   |  True  |  True |   True  |
|  is_target  |   False   |  True  | False |   True  |
| ignore_type |           | False  | False |  False  |
|  pad_value  |           |   0    |   0   |    0    |
+-------------+-----------+--------+-------+---------+
process(data_bundle: fastNLP.io.data_bundle.DataBundle)[源代码]

对load进来的数据进一步处理原始数据包含:raw_key,raw_speaker,raw_words,raw_clusters

raw_key raw_speaker raw_words raw_clusters
bc/cctv/00/cctv_0000_0 [[Speaker#1, Speaker#1],[]] [['I','am'],[]] [[[2,3],[6,7]],[[10,12],[20,22]]]
bc/cctv/00/cctv_0000_1 [['Speaker#1', 'peaker#1'],[]] [['He','is'],[]] [[[2,3],[6,7]],[[10,12],[20,22]]]
[...] [...] [...] [...]
参数:data_bundle --
返回:
class fastNLP.io.pipe.CMRC2018BertPipe(max_len=510)[源代码]

基类 fastNLP.io.Pipe

别名 fastNLP.io.CMRC2018BertPipe fastNLP.io.pipe.qa.CMRC2018BertPipe

处理之后的DataSet将新增以下的field(传入的field仍然保留)

context_len raw_chars target_start target_end chars    
492 ['范' '廷' '颂... ] 30 34 [21, 25, ...]
491 ['范' '廷' '颂... ] 41 61 [21, 25, ...]
             
. ... ... ... ...    

raw_words列是context与question拼起来的结果(连接的地方加入了[SEP]),words是转为index的值, target_start为答案start的index,target_end为答案end的index (闭区间);context_len指示的是words列中context的长度。

其中各列的meta信息如下:

+-------------+-------------+-----------+--------------+------------+-------+---------+
| field_names | context_len | raw_chars | target_start | target_end | chars | answers |
+-------------+-------------+-----------+--------------+------------+-------+---------|
|   is_input  |    False    |   False   |    False     |   False    |  True |  False  |
|  is_target  |     True    |    True   |     True     |    True    | False |  True   |
| ignore_type |    False    |    True   |    False     |   False    | False |  True   |
|  pad_value  |      0      |     0     |      0       |     0      |   0   |   0     |
+-------------+-------------+-----------+--------------+------------+-------+---------+
process(data_bundle: fastNLP.io.data_bundle.DataBundle) → fastNLP.io.data_bundle.DataBundle[源代码]

传入的DataSet应该具备以下的field

:header:"title", "context", "question", "answers", "answer_starts", "id"
范廷颂 范廷颂枢机(,),圣名保禄·若瑟()... 范廷颂是什么时候被任为主教的? ["1963年"] ["30"] TRAIN_186_QUERY_0
范廷颂 范廷颂枢机(,),圣名保禄·若瑟()... 1990年,范廷颂担任什么职务? ["1990年被擢升为天..."] ["41"] TRAIN_186_QUERY_1
... ... ... ... . ...
参数:data_bundle --
返回:
fastNLP.io.utils
fastNLP.io.utils.check_loader_paths(paths: Union[str, Dict[str, str]]) → Dict[str, str][源代码]

检查传入dataloader的文件的合法性。如果为合法路径,将返回至少包含'train'这个key的dict。类似于下面的结果:

{
    'train': '/some/path/to/', # 一定包含,建词表应该在这上面建立,剩下的其它文件应该只需要处理并index。
    'test': 'xxx' # 可能有,也可能没有
    ...
}

如果paths为不合法的,将直接进行raise相应的错误. 如果paths内不包含train也会报错。

参数:paths (str) -- 路径. 可以为一个文件路径(则认为该文件就是train的文件); 可以为一个文件目录,将在该目录下寻找包含train(文件名 中包含train这个字段), test, dev这三个字段的文件或文件夹; 可以为一个dict, 则key是用户自定义的某个文件的名称,value是这个文件的路径。
返回:
fastNLP.models

fastNLP 在 models 模块中内置了如 CNNTextSeqLabeling 等完整的模型,以供用户直接使用。

class fastNLP.models.CNNText(embed, num_classes, kernel_nums=(30, 40, 50), kernel_sizes=(1, 3, 5), dropout=0.5)[源代码]

别名 fastNLP.models.CNNText fastNLP.models.cnn_text_classification.CNNText

使用CNN进行文本分类的模型 'Yoon Kim. 2014. Convolution Neural Networks for Sentence Classification.'

__init__(embed, num_classes, kernel_nums=(30, 40, 50), kernel_sizes=(1, 3, 5), dropout=0.5)[源代码]
参数:
  • embed (tuple(int,int),torch.FloatTensor,nn.Embedding,numpy.ndarray) -- Embedding的大小(传入tuple(int, int), 第一个int为vocab_zie, 第二个int为embed_dim); 如果为Tensor, Embedding, ndarray等则直接使用该值初始化Embedding
  • num_classes (int) -- 一共有多少类
  • kernel_sizes (int,tuple(int)) -- 输出channel的kernel大小。
  • dropout (float) -- Dropout的大小
forward(words, seq_len=None)[源代码]
参数:
  • words (torch.LongTensor) -- [batch_size, seq_len],句子中word的index
  • seq_len (torch.LongTensor) -- [batch,] 每个句子的长度
Return output:

dict of torch.LongTensor, [batch_size, num_classes]

predict(words, seq_len=None)[源代码]
参数:
  • words (torch.LongTensor) -- [batch_size, seq_len],句子中word的index
  • seq_len (torch.LongTensor) -- [batch,] 每个句子的长度
Return predict:

dict of torch.LongTensor, [batch_size, ]

class fastNLP.models.SeqLabeling(embed, hidden_size, num_classes)[源代码]

基类 fastNLP.models.BaseModel

别名 fastNLP.models.SeqLabeling fastNLP.models.sequence_labeling.SeqLabeling

一个基础的Sequence labeling的模型。 用于做sequence labeling的基础类。结构包含一层Embedding,一层LSTM(单向,一层),一层FC,以及一层CRF。
__init__(embed, hidden_size, num_classes)[源代码]
参数:
  • embed (tuple(int,int),torch.FloatTensor,nn.Embedding,numpy.ndarray) -- Embedding的大小(传入tuple(int, int), 第一个int为vocab_zie, 第二个int为embed_dim); 如果为Tensor, embedding, ndarray等则直接使用该值初始化Embedding
  • hidden_size (int) -- LSTM隐藏层的大小
  • num_classes (int) -- 一共有多少类
forward(words, seq_len, target)[源代码]
参数:
  • words (torch.LongTensor) -- [batch_size, max_len],序列的index
  • seq_len (torch.LongTensor) -- [batch_size,], 这个序列的长度
  • target (torch.LongTensor) -- [batch_size, max_len], 序列的目标值
Return y:

If truth is None, return list of [decode path(list)]. Used in testing and predicting. If truth is not None, return loss, a scalar. Used in training.

predict(words, seq_len)[源代码]

用于在预测时使用

参数:
  • words (torch.LongTensor) -- [batch_size, max_len]
  • seq_len (torch.LongTensor) -- [batch_size,]
返回:

{'pred': xx}, [batch_size, max_len]

class fastNLP.models.AdvSeqLabel(embed, hidden_size, num_classes, dropout=0.3, id2words=None, encoding_type='bmes')[源代码]

别名 fastNLP.models.AdvSeqLabel fastNLP.models.sequence_labeling.AdvSeqLabel

更复杂的Sequence Labelling模型。结构为Embedding, LayerNorm, 双向LSTM(两层),FC,LayerNorm,DropOut,FC,CRF。

__init__(embed, hidden_size, num_classes, dropout=0.3, id2words=None, encoding_type='bmes')[源代码]
参数:
  • embed (tuple(int,int),torch.FloatTensor,nn.Embedding,numpy.ndarray) -- Embedding的大小(传入tuple(int, int), 第一个int为vocab_zie, 第二个int为embed_dim); 如果为Tensor, Embedding, ndarray等则直接使用该值初始化Embedding
  • hidden_size (int) -- LSTM的隐层大小
  • num_classes (int) -- 有多少个类
  • dropout (float) -- LSTM中以及DropOut层的drop概率
  • id2words (dict) -- tag id转为其tag word的表。用于在CRF解码时防止解出非法的顺序,比如'BMES'这个标签规范中,'S' 不能出现在'B'之后。这里也支持类似与'B-NN',即'-'前为标签类型的指示,后面为具体的tag的情况。这里不但会保证 'B-NN'后面不为'S-NN'还会保证'B-NN'后面不会出现'M-xx'(任何非'M-NN'和'E-NN'的情况。)
  • encoding_type (str) -- 支持"BIO", "BMES", "BEMSO", 只有在id2words不为None的情况有用。
forward(words, seq_len, target)[源代码]
参数:
  • words (torch.LongTensor) -- [batch_size, mex_len]
  • seq_len (torch.LongTensor) -- [batch_size, ]
  • target (torch.LongTensor) -- [batch_size, max_len], 目标
Return torch.Tensor:
 

a scalar loss

predict(words, seq_len)[源代码]
参数:
  • words (torch.LongTensor) -- [batch_size, mex_len]
  • seq_len (torch.LongTensor) -- [batch_size, ]
Return torch.LongTensor:
 

[batch_size, max_len]

class fastNLP.models.ESIM(embed, hidden_size=None, num_labels=3, dropout_rate=0.3, dropout_embed=0.1)[源代码]

基类 fastNLP.models.BaseModel

别名 fastNLP.models.ESIM fastNLP.models.snli.ESIM

ESIM model的一个PyTorch实现 论文参见: https://arxiv.org/pdf/1609.06038.pdf
__init__(embed, hidden_size=None, num_labels=3, dropout_rate=0.3, dropout_embed=0.1)[源代码]
参数:
  • embed -- 初始化的Embedding
  • hidden_size (int) -- 隐藏层大小,默认值为Embedding的维度
  • num_labels (int) -- 目标标签种类数量,默认值为3
  • dropout_rate (float) -- dropout的比率,默认值为0.3
  • dropout_embed (float) -- 对Embedding的dropout比率,默认值为0.1
forward(words1, words2, seq_len1, seq_len2, target=None)[源代码]
参数:
  • words1 -- [batch, seq_len]
  • words2 -- [batch, seq_len]
  • seq_len1 -- [batch]
  • seq_len2 -- [batch]
  • target --
返回:

class fastNLP.models.StarTransEnc(embed, hidden_size, num_layers, num_head, head_dim, max_len, emb_dropout, dropout)[源代码]

别名 fastNLP.models.StarTransEnc fastNLP.models.star_transformer.StarTransEnc

带word embedding的Star-Transformer Encoder

__init__(embed, hidden_size, num_layers, num_head, head_dim, max_len, emb_dropout, dropout)[源代码]
参数:
  • embed -- 单词词典, 可以是 tuple, 包括(num_embedings, embedding_dim), 即 embedding的大小和每个词的维度. 也可以传入 nn.Embedding 对象,此时就以传入的对象作为embedding
  • hidden_size -- 模型中特征维度.
  • num_layers -- 模型层数.
  • num_head -- 模型中multi-head的head个数.
  • head_dim -- 模型中multi-head中每个head特征维度.
  • max_len -- 模型能接受的最大输入长度.
  • emb_dropout -- 词嵌入的dropout概率.
  • dropout -- 模型除词嵌入外的dropout概率.
forward(x, mask)[源代码]
参数:
  • x (FloatTensor) -- [batch, length, hidden] 输入的序列
  • mask (ByteTensor) -- [batch, length] 输入序列的padding mask, 在没有内容(padding 部分) 为 0, 否则为 1
返回:

[batch, length, hidden] 编码后的输出序列

[batch, hidden] 全局 relay 节点, 详见论文

class fastNLP.models.STSeqLabel(embed, num_cls, hidden_size=300, num_layers=4, num_head=8, head_dim=32, max_len=512, cls_hidden_size=600, emb_dropout=0.1, dropout=0.1)[源代码]

别名 fastNLP.models.STSeqLabel fastNLP.models.star_transformer.STSeqLabel

用于序列标注的Star-Transformer模型

__init__(embed, num_cls, hidden_size=300, num_layers=4, num_head=8, head_dim=32, max_len=512, cls_hidden_size=600, emb_dropout=0.1, dropout=0.1)[源代码]
参数:
  • embed -- 单词词典, 可以是 tuple, 包括(num_embedings, embedding_dim), 即 embedding的大小和每个词的维度. 也可以传入 nn.Embedding 对象, 此时就以传入的对象作为embedding
  • num_cls -- 输出类别个数
  • hidden_size -- 模型中特征维度. Default: 300
  • num_layers -- 模型层数. Default: 4
  • num_head -- 模型中multi-head的head个数. Default: 8
  • head_dim -- 模型中multi-head中每个head特征维度. Default: 32
  • max_len -- 模型能接受的最大输入长度. Default: 512
  • cls_hidden_size -- 分类器隐层维度. Default: 600
  • emb_dropout -- 词嵌入的dropout概率. Default: 0.1
  • dropout -- 模型除词嵌入外的dropout概率. Default: 0.1
forward(words, seq_len)[源代码]
参数:
  • words -- [batch, seq_len] 输入序列
  • seq_len -- [batch,] 输入序列的长度
Return output:

[batch, num_cls, seq_len] 输出序列中每个元素的分类的概率

predict(words, seq_len)[源代码]
参数:
  • words -- [batch, seq_len] 输入序列
  • seq_len -- [batch,] 输入序列的长度
Return output:

[batch, seq_len] 输出序列中每个元素的分类

class fastNLP.models.STNLICls(embed, num_cls, hidden_size=300, num_layers=4, num_head=8, head_dim=32, max_len=512, cls_hidden_size=600, emb_dropout=0.1, dropout=0.1)[源代码]

别名 fastNLP.models.STNLICls fastNLP.models.star_transformer.STNLICls

用于自然语言推断(NLI)的Star-Transformer

__init__(embed, num_cls, hidden_size=300, num_layers=4, num_head=8, head_dim=32, max_len=512, cls_hidden_size=600, emb_dropout=0.1, dropout=0.1)[源代码]
参数:
  • embed -- 单词词典, 可以是 tuple, 包括(num_embedings, embedding_dim), 即 embedding的大小和每个词的维度. 也可以传入 nn.Embedding 对象, 此时就以传入的对象作为embedding
  • num_cls -- 输出类别个数
  • hidden_size -- 模型中特征维度. Default: 300
  • num_layers -- 模型层数. Default: 4
  • num_head -- 模型中multi-head的head个数. Default: 8
  • head_dim -- 模型中multi-head中每个head特征维度. Default: 32
  • max_len -- 模型能接受的最大输入长度. Default: 512
  • cls_hidden_size -- 分类器隐层维度. Default: 600
  • emb_dropout -- 词嵌入的dropout概率. Default: 0.1
  • dropout -- 模型除词嵌入外的dropout概率. Default: 0.1
forward(words1, words2, seq_len1, seq_len2)[源代码]
参数:
  • words1 -- [batch, seq_len] 输入序列1
  • words2 -- [batch, seq_len] 输入序列2
  • seq_len1 -- [batch,] 输入序列1的长度
  • seq_len2 -- [batch,] 输入序列2的长度
Return output:

[batch, num_cls] 输出分类的概率

predict(words1, words2, seq_len1, seq_len2)[源代码]
参数:
  • words1 -- [batch, seq_len] 输入序列1
  • words2 -- [batch, seq_len] 输入序列2
  • seq_len1 -- [batch,] 输入序列1的长度
  • seq_len2 -- [batch,] 输入序列2的长度
Return output:

[batch, num_cls] 输出分类的概率

class fastNLP.models.STSeqCls(embed, num_cls, hidden_size=300, num_layers=4, num_head=8, head_dim=32, max_len=512, cls_hidden_size=600, emb_dropout=0.1, dropout=0.1)[源代码]

别名 fastNLP.models.STSeqCls fastNLP.models.star_transformer.STSeqCls

用于分类任务的Star-Transformer

__init__(embed, num_cls, hidden_size=300, num_layers=4, num_head=8, head_dim=32, max_len=512, cls_hidden_size=600, emb_dropout=0.1, dropout=0.1)[源代码]
参数:
  • embed -- 单词词典, 可以是 tuple, 包括(num_embedings, embedding_dim), 即 embedding的大小和每个词的维度. 也可以传入 nn.Embedding 对象, 此时就以传入的对象作为embedding
  • num_cls -- 输出类别个数
  • hidden_size -- 模型中特征维度. Default: 300
  • num_layers -- 模型层数. Default: 4
  • num_head -- 模型中multi-head的head个数. Default: 8
  • head_dim -- 模型中multi-head中每个head特征维度. Default: 32
  • max_len -- 模型能接受的最大输入长度. Default: 512
  • cls_hidden_size -- 分类器隐层维度. Default: 600
  • emb_dropout -- 词嵌入的dropout概率. Default: 0.1
  • dropout -- 模型除词嵌入外的dropout概率. Default: 0.1
forward(words, seq_len)[源代码]
参数:
  • words -- [batch, seq_len] 输入序列
  • seq_len -- [batch,] 输入序列的长度
Return output:

[batch, num_cls] 输出序列的分类的概率

predict(words, seq_len)[源代码]
参数:
  • words -- [batch, seq_len] 输入序列
  • seq_len -- [batch,] 输入序列的长度
Return output:

[batch, num_cls] 输出序列的分类

class fastNLP.models.BiaffineParser(embed, pos_vocab_size, pos_emb_dim, num_label, rnn_layers=1, rnn_hidden_size=200, arc_mlp_size=100, label_mlp_size=100, dropout=0.3, encoder='lstm', use_greedy_infer=False)[源代码]

基类 fastNLP.models.GraphParser

别名 fastNLP.models.BiaffineParser fastNLP.models.biaffine_parser.BiaffineParser

__init__(embed, pos_vocab_size, pos_emb_dim, num_label, rnn_layers=1, rnn_hidden_size=200, arc_mlp_size=100, label_mlp_size=100, dropout=0.3, encoder='lstm', use_greedy_infer=False)[源代码]
参数:
  • embed -- 单词词典, 可以是 tuple, 包括(num_embedings, embedding_dim), 即 embedding的大小和每个词的维度. 也可以传入 nn.Embedding 对象, 此时就以传入的对象作为embedding
  • pos_vocab_size -- part-of-speech 词典大小
  • pos_emb_dim -- part-of-speech 向量维度
  • num_label -- 边的类别个数
  • rnn_layers -- rnn encoder的层数
  • rnn_hidden_size -- rnn encoder 的隐状态维度
  • arc_mlp_size -- 边预测的MLP维度
  • label_mlp_size -- 类别预测的MLP维度
  • dropout -- dropout概率.
  • encoder -- encoder类别, 可选 ('lstm', 'var-lstm', 'transformer'). Default: lstm
  • use_greedy_infer -- 是否在inference时使用贪心算法. 若 False , 使用更加精确但相对缓慢的MST算法. Default: False
forward(words1, words2, seq_len, target1=None)[源代码]

模型forward阶段

参数:
  • words1 -- [batch_size, seq_len] 输入word序列
  • words2 -- [batch_size, seq_len] 输入pos序列
  • seq_len -- [batch_size, seq_len] 输入序列长度
  • target1 -- [batch_size, seq_len] 输入真实标注的heads, 仅在训练阶段有效, 用于训练label分类器. 若为 None , 使用预测的heads输入到label分类器 Default: None
Return dict:

parsing 结果:

pred1: [batch_size, seq_len, seq_len] 边预测logits
pred2: [batch_size, seq_len, num_label] label预测logits
pred3: [batch_size, seq_len] heads的预测结果, 在 ``target1=None`` 时预测
static loss(pred1, pred2, target1, target2, seq_len)[源代码]

计算parser的loss

参数:
  • pred1 -- [batch_size, seq_len, seq_len] 边预测logits
  • pred2 -- [batch_size, seq_len, num_label] label预测logits
  • target1 -- [batch_size, seq_len] 真实边的标注
  • target2 -- [batch_size, seq_len] 真实类别的标注
  • seq_len -- [batch_size, seq_len] 真实目标的长度
Return loss:

scalar

predict(words1, words2, seq_len)[源代码]

模型预测API

参数:
  • words1 -- [batch_size, seq_len] 输入word序列
  • words2 -- [batch_size, seq_len] 输入pos序列
  • seq_len -- [batch_size, seq_len] 输入序列长度
Return dict:

parsing 结果:

pred1: [batch_size, seq_len] heads的预测结果
pred2: [batch_size, seq_len, num_label] label预测logits
class fastNLP.models.GraphParser[源代码]

基类 fastNLP.models.BaseModel

别名 fastNLP.models.GraphParser fastNLP.models.biaffine_parser.GraphParser

基于图的parser base class, 支持贪婪解码和最大生成树解码
static greedy_decoder(arc_matrix, mask=None)[源代码]

贪心解码方式, 输入图, 输出贪心解码的parsing结果, 不保证合法的构成树

参数:
  • arc_matrix -- [batch, seq_len, seq_len] 输入图矩阵
  • mask -- [batch, seq_len] 输入图的padding mask, 有内容的部分为 1, 否则为 0. 若为 None 时, 默认为全1向量. Default: None
Return heads:

[batch, seq_len] 每个元素在树中对应的head(parent)预测结果

static mst_decoder(arc_matrix, mask=None)[源代码]

用最大生成树算法, 计算parsing结果, 保证输出合法的树结构

参数:
  • arc_matrix -- [batch, seq_len, seq_len] 输入图矩阵
  • mask -- [batch, seq_len] 输入图的padding mask, 有内容的部分为 1, 否则为 0. 若为 None 时, 默认为全1向量. Default: None
Return heads:

[batch, seq_len] 每个元素在树中对应的head(parent)预测结果

class fastNLP.models.BertForSequenceClassification(embed: fastNLP.embeddings.bert_embedding.BertEmbedding, num_labels: int = 2, dropout=0.1)[源代码]

基类 fastNLP.models.BaseModel

别名 fastNLP.models.BertForSequenceClassification fastNLP.models.bert.BertForSequenceClassification

BERT model for classification.
__init__(embed: fastNLP.embeddings.bert_embedding.BertEmbedding, num_labels: int = 2, dropout=0.1)[源代码]
参数:
  • embed (fastNLP.embeddings.BertEmbedding) -- 下游模型的编码器(encoder).
  • num_labels (int) -- 文本分类类别数目,默认值为2.
  • dropout (float) -- dropout的大小,默认值为0.1.
forward(words)[源代码]
参数:words (torch.LongTensor) -- [batch_size, seq_len]
返回:{ fastNLP.Const.OUTPUT : logits}: torch.Tensor [batch_size, num_labels]
predict(words)[源代码]
参数:words (torch.LongTensor) -- [batch_size, seq_len]
返回:{ fastNLP.Const.OUTPUT : logits}: torch.LongTensor [batch_size]
class fastNLP.models.BertForSentenceMatching(embed: fastNLP.embeddings.bert_embedding.BertEmbedding, num_labels: int = 2, dropout=0.1)[源代码]

基类 fastNLP.models.BaseModel

别名 fastNLP.models.BertForSentenceMatching fastNLP.models.bert.BertForSentenceMatching

BERT model for sentence matching.
__init__(embed: fastNLP.embeddings.bert_embedding.BertEmbedding, num_labels: int = 2, dropout=0.1)[源代码]
参数:
  • embed (fastNLP.embeddings.BertEmbedding) -- 下游模型的编码器(encoder).
  • num_labels (int) -- Matching任务类别数目,默认值为2.
  • dropout (float) -- dropout的大小,默认值为0.1.
forward(words)[源代码]
参数:words (torch.LongTensor) -- [batch_size, seq_len]
返回:{ fastNLP.Const.OUTPUT : logits}: torch.Tensor [batch_size, num_labels]
predict(words)[源代码]
参数:words (torch.LongTensor) -- [batch_size, seq_len]
返回:{ fastNLP.Const.OUTPUT : logits}: torch.LongTensor [batch_size]
class fastNLP.models.BertForMultipleChoice(embed: fastNLP.embeddings.bert_embedding.BertEmbedding, num_choices=2, dropout=0.1)[源代码]

基类 fastNLP.models.BaseModel

别名 fastNLP.models.BertForMultipleChoice fastNLP.models.bert.BertForMultipleChoice

BERT model for multiple choice.
__init__(embed: fastNLP.embeddings.bert_embedding.BertEmbedding, num_choices=2, dropout=0.1)[源代码]
参数:
  • embed (fastNLP.embeddings.BertEmbedding) -- 下游模型的编码器(encoder).
  • num_choices (int) -- 多选任务选项数目,默认值为2.
  • dropout (float) -- dropout的大小,默认值为0.1.
forward(words)[源代码]
参数:words (torch.LongTensor) -- [batch_size, num_choices, seq_len]
返回:{ fastNLP.Const.OUTPUT : logits}: torch.LongTensor [batch_size, num_choices]
predict(words)[源代码]
参数:words (torch.LongTensor) -- [batch_size, num_choices, seq_len]
返回:{ fastNLP.Const.OUTPUT : logits}: torch.LongTensor [batch_size]
class fastNLP.models.BertForTokenClassification(embed: fastNLP.embeddings.bert_embedding.BertEmbedding, num_labels, dropout=0.1)[源代码]

基类 fastNLP.models.BaseModel

别名 fastNLP.models.BertForTokenClassification fastNLP.models.bert.BertForTokenClassification

BERT model for token classification.
__init__(embed: fastNLP.embeddings.bert_embedding.BertEmbedding, num_labels, dropout=0.1)[源代码]
参数:
  • embed (fastNLP.embeddings.BertEmbedding) -- 下游模型的编码器(encoder).
  • num_labels (int) -- 序列标注标签数目,无默认值.
  • dropout (float) -- dropout的大小,默认值为0.1.
forward(words)[源代码]
参数:words (torch.LongTensor) -- [batch_size, seq_len]
返回:{ fastNLP.Const.OUTPUT : logits}: torch.Tensor [batch_size, seq_len, num_labels]
predict(words)[源代码]
参数:words (torch.LongTensor) -- [batch_size, seq_len]
返回:{ fastNLP.Const.OUTPUT : logits}: torch.LongTensor [batch_size, seq_len]
class fastNLP.models.BertForQuestionAnswering(embed: fastNLP.embeddings.bert_embedding.BertEmbedding)[源代码]

基类 fastNLP.models.BaseModel

别名 fastNLP.models.BertForQuestionAnswering fastNLP.models.bert.BertForQuestionAnswering

用于做Q&A的Bert模型,如果是Squad2.0请将BertEmbedding的include_cls_sep设置为True,Squad1.0或CMRC则设置为False
__init__(embed: fastNLP.embeddings.bert_embedding.BertEmbedding)[源代码]
参数:
  • embed (fastNLP.embeddings.BertEmbedding) -- 下游模型的编码器(encoder).
  • num_labels (int) -- 抽取式QA列数,默认值为2(即第一列为start_span, 第二列为end_span).
forward(words)[源代码]
参数:words (torch.LongTensor) -- [batch_size, seq_len]
返回:一个包含num_labels个logit的dict,每一个logit的形状都是[batch_size, seq_len + 2]
子模块
fastNLP.models.bert

fastNLP提供了BERT应用到五个下游任务的模型代码,可以直接调用。这五个任务分别为

每一个模型必须要传入一个名字为 embedfastNLP.embeddings.BertEmbedding ,这个参数包含了 fastNLP.modules.encoder.BertModel ,是下游模型的编码器(encoder)。

除此以外,还需要传入一个数字,这个数字在不同下游任务模型上的意义如下:

下游任务模型                     参数名称      含义
BertForSequenceClassification  num_labels  文本分类类别数目,默认值为2
BertForSentenceMatching        num_labels  Matching任务类别数目,默认值为2
BertForMultipleChoice          num_choices 多选任务选项数目,默认值为2
BertForTokenClassification     num_labels  序列标注标签数目,无默认值
BertForQuestionAnswering       num_labels  抽取式QA列数,默认值为2(即第一列为start_span, 第二列为end_span)

最后还可以传入dropout的大小,默认值为0.1。

class fastNLP.models.bert.BertForSequenceClassification(embed: fastNLP.embeddings.bert_embedding.BertEmbedding, num_labels: int = 2, dropout=0.1)[源代码]

基类 fastNLP.models.BaseModel

别名 fastNLP.models.BertForSequenceClassification fastNLP.models.bert.BertForSequenceClassification

BERT model for classification.
__init__(embed: fastNLP.embeddings.bert_embedding.BertEmbedding, num_labels: int = 2, dropout=0.1)[源代码]
参数:
  • embed (fastNLP.embeddings.BertEmbedding) -- 下游模型的编码器(encoder).
  • num_labels (int) -- 文本分类类别数目,默认值为2.
  • dropout (float) -- dropout的大小,默认值为0.1.
forward(words)[源代码]
参数:words (torch.LongTensor) -- [batch_size, seq_len]
返回:{ fastNLP.Const.OUTPUT : logits}: torch.Tensor [batch_size, num_labels]
predict(words)[源代码]
参数:words (torch.LongTensor) -- [batch_size, seq_len]
返回:{ fastNLP.Const.OUTPUT : logits}: torch.LongTensor [batch_size]
class fastNLP.models.bert.BertForSentenceMatching(embed: fastNLP.embeddings.bert_embedding.BertEmbedding, num_labels: int = 2, dropout=0.1)[源代码]

基类 fastNLP.models.BaseModel

别名 fastNLP.models.BertForSentenceMatching fastNLP.models.bert.BertForSentenceMatching

BERT model for sentence matching.
__init__(embed: fastNLP.embeddings.bert_embedding.BertEmbedding, num_labels: int = 2, dropout=0.1)[源代码]
参数:
  • embed (fastNLP.embeddings.BertEmbedding) -- 下游模型的编码器(encoder).
  • num_labels (int) -- Matching任务类别数目,默认值为2.
  • dropout (float) -- dropout的大小,默认值为0.1.
forward(words)[源代码]
参数:words (torch.LongTensor) -- [batch_size, seq_len]
返回:{ fastNLP.Const.OUTPUT : logits}: torch.Tensor [batch_size, num_labels]
predict(words)[源代码]
参数:words (torch.LongTensor) -- [batch_size, seq_len]
返回:{ fastNLP.Const.OUTPUT : logits}: torch.LongTensor [batch_size]
class fastNLP.models.bert.BertForMultipleChoice(embed: fastNLP.embeddings.bert_embedding.BertEmbedding, num_choices=2, dropout=0.1)[源代码]

基类 fastNLP.models.BaseModel

别名 fastNLP.models.BertForMultipleChoice fastNLP.models.bert.BertForMultipleChoice

BERT model for multiple choice.
__init__(embed: fastNLP.embeddings.bert_embedding.BertEmbedding, num_choices=2, dropout=0.1)[源代码]
参数:
  • embed (fastNLP.embeddings.BertEmbedding) -- 下游模型的编码器(encoder).
  • num_choices (int) -- 多选任务选项数目,默认值为2.
  • dropout (float) -- dropout的大小,默认值为0.1.
forward(words)[源代码]
参数:words (torch.LongTensor) -- [batch_size, num_choices, seq_len]
返回:{ fastNLP.Const.OUTPUT : logits}: torch.LongTensor [batch_size, num_choices]
predict(words)[源代码]
参数:words (torch.LongTensor) -- [batch_size, num_choices, seq_len]
返回:{ fastNLP.Const.OUTPUT : logits}: torch.LongTensor [batch_size]
class fastNLP.models.bert.BertForTokenClassification(embed: fastNLP.embeddings.bert_embedding.BertEmbedding, num_labels, dropout=0.1)[源代码]

基类 fastNLP.models.BaseModel

别名 fastNLP.models.BertForTokenClassification fastNLP.models.bert.BertForTokenClassification

BERT model for token classification.
__init__(embed: fastNLP.embeddings.bert_embedding.BertEmbedding, num_labels, dropout=0.1)[源代码]
参数:
  • embed (fastNLP.embeddings.BertEmbedding) -- 下游模型的编码器(encoder).
  • num_labels (int) -- 序列标注标签数目,无默认值.
  • dropout (float) -- dropout的大小,默认值为0.1.
forward(words)[源代码]
参数:words (torch.LongTensor) -- [batch_size, seq_len]
返回:{ fastNLP.Const.OUTPUT : logits}: torch.Tensor [batch_size, seq_len, num_labels]
predict(words)[源代码]
参数:words (torch.LongTensor) -- [batch_size, seq_len]
返回:{ fastNLP.Const.OUTPUT : logits}: torch.LongTensor [batch_size, seq_len]
class fastNLP.models.bert.BertForQuestionAnswering(embed: fastNLP.embeddings.bert_embedding.BertEmbedding)[源代码]

基类 fastNLP.models.BaseModel

别名 fastNLP.models.BertForQuestionAnswering fastNLP.models.bert.BertForQuestionAnswering

用于做Q&A的Bert模型,如果是Squad2.0请将BertEmbedding的include_cls_sep设置为True,Squad1.0或CMRC则设置为False
__init__(embed: fastNLP.embeddings.bert_embedding.BertEmbedding)[源代码]
参数:
  • embed (fastNLP.embeddings.BertEmbedding) -- 下游模型的编码器(encoder).
  • num_labels (int) -- 抽取式QA列数,默认值为2(即第一列为start_span, 第二列为end_span).
forward(words)[源代码]
参数:words (torch.LongTensor) -- [batch_size, seq_len]
返回:一个包含num_labels个logit的dict,每一个logit的形状都是[batch_size, seq_len + 2]
fastNLP.models.biaffine_parser

Biaffine Dependency Parser 的 Pytorch 实现.

class fastNLP.models.biaffine_parser.BiaffineParser(embed, pos_vocab_size, pos_emb_dim, num_label, rnn_layers=1, rnn_hidden_size=200, arc_mlp_size=100, label_mlp_size=100, dropout=0.3, encoder='lstm', use_greedy_infer=False)[源代码]

基类 fastNLP.models.GraphParser

别名 fastNLP.models.BiaffineParser fastNLP.models.biaffine_parser.BiaffineParser

__init__(embed, pos_vocab_size, pos_emb_dim, num_label, rnn_layers=1, rnn_hidden_size=200, arc_mlp_size=100, label_mlp_size=100, dropout=0.3, encoder='lstm', use_greedy_infer=False)[源代码]
参数:
  • embed -- 单词词典, 可以是 tuple, 包括(num_embedings, embedding_dim), 即 embedding的大小和每个词的维度. 也可以传入 nn.Embedding 对象, 此时就以传入的对象作为embedding
  • pos_vocab_size -- part-of-speech 词典大小
  • pos_emb_dim -- part-of-speech 向量维度
  • num_label -- 边的类别个数
  • rnn_layers -- rnn encoder的层数
  • rnn_hidden_size -- rnn encoder 的隐状态维度
  • arc_mlp_size -- 边预测的MLP维度
  • label_mlp_size -- 类别预测的MLP维度
  • dropout -- dropout概率.
  • encoder -- encoder类别, 可选 ('lstm', 'var-lstm', 'transformer'). Default: lstm
  • use_greedy_infer -- 是否在inference时使用贪心算法. 若 False , 使用更加精确但相对缓慢的MST算法. Default: False
forward(words1, words2, seq_len, target1=None)[源代码]

模型forward阶段

参数:
  • words1 -- [batch_size, seq_len] 输入word序列
  • words2 -- [batch_size, seq_len] 输入pos序列
  • seq_len -- [batch_size, seq_len] 输入序列长度
  • target1 -- [batch_size, seq_len] 输入真实标注的heads, 仅在训练阶段有效, 用于训练label分类器. 若为 None , 使用预测的heads输入到label分类器 Default: None
Return dict:

parsing 结果:

pred1: [batch_size, seq_len, seq_len] 边预测logits
pred2: [batch_size, seq_len, num_label] label预测logits
pred3: [batch_size, seq_len] heads的预测结果, 在 ``target1=None`` 时预测
static loss(pred1, pred2, target1, target2, seq_len)[源代码]

计算parser的loss

参数:
  • pred1 -- [batch_size, seq_len, seq_len] 边预测logits
  • pred2 -- [batch_size, seq_len, num_label] label预测logits
  • target1 -- [batch_size, seq_len] 真实边的标注
  • target2 -- [batch_size, seq_len] 真实类别的标注
  • seq_len -- [batch_size, seq_len] 真实目标的长度
Return loss:

scalar

predict(words1, words2, seq_len)[源代码]

模型预测API

参数:
  • words1 -- [batch_size, seq_len] 输入word序列
  • words2 -- [batch_size, seq_len] 输入pos序列
  • seq_len -- [batch_size, seq_len] 输入序列长度
Return dict:

parsing 结果:

pred1: [batch_size, seq_len] heads的预测结果
pred2: [batch_size, seq_len, num_label] label预测logits
class fastNLP.models.biaffine_parser.GraphParser[源代码]

基类 fastNLP.models.BaseModel

别名 fastNLP.models.GraphParser fastNLP.models.biaffine_parser.GraphParser

基于图的parser base class, 支持贪婪解码和最大生成树解码
static greedy_decoder(arc_matrix, mask=None)[源代码]

贪心解码方式, 输入图, 输出贪心解码的parsing结果, 不保证合法的构成树

参数:
  • arc_matrix -- [batch, seq_len, seq_len] 输入图矩阵
  • mask -- [batch, seq_len] 输入图的padding mask, 有内容的部分为 1, 否则为 0. 若为 None 时, 默认为全1向量. Default: None
Return heads:

[batch, seq_len] 每个元素在树中对应的head(parent)预测结果

static mst_decoder(arc_matrix, mask=None)[源代码]

用最大生成树算法, 计算parsing结果, 保证输出合法的树结构

参数:
  • arc_matrix -- [batch, seq_len, seq_len] 输入图矩阵
  • mask -- [batch, seq_len] 输入图的padding mask, 有内容的部分为 1, 否则为 0. 若为 None 时, 默认为全1向量. Default: None
Return heads:

[batch, seq_len] 每个元素在树中对应的head(parent)预测结果

fastNLP.models.cnn_text_classification
class fastNLP.models.cnn_text_classification.CNNText(embed, num_classes, kernel_nums=(30, 40, 50), kernel_sizes=(1, 3, 5), dropout=0.5)[源代码]

别名 fastNLP.models.CNNText fastNLP.models.cnn_text_classification.CNNText

使用CNN进行文本分类的模型 'Yoon Kim. 2014. Convolution Neural Networks for Sentence Classification.'

__init__(embed, num_classes, kernel_nums=(30, 40, 50), kernel_sizes=(1, 3, 5), dropout=0.5)[源代码]
参数:
  • embed (tuple(int,int),torch.FloatTensor,nn.Embedding,numpy.ndarray) -- Embedding的大小(传入tuple(int, int), 第一个int为vocab_zie, 第二个int为embed_dim); 如果为Tensor, Embedding, ndarray等则直接使用该值初始化Embedding
  • num_classes (int) -- 一共有多少类
  • kernel_sizes (int,tuple(int)) -- 输出channel的kernel大小。
  • dropout (float) -- Dropout的大小
forward(words, seq_len=None)[源代码]
参数:
  • words (torch.LongTensor) -- [batch_size, seq_len],句子中word的index
  • seq_len (torch.LongTensor) -- [batch,] 每个句子的长度
Return output:

dict of torch.LongTensor, [batch_size, num_classes]

predict(words, seq_len=None)[源代码]
参数:
  • words (torch.LongTensor) -- [batch_size, seq_len],句子中word的index
  • seq_len (torch.LongTensor) -- [batch,] 每个句子的长度
Return predict:

dict of torch.LongTensor, [batch_size, ]

fastNLP.models.sequence_labeling

本模块实现了几种序列标注模型

class fastNLP.models.sequence_labeling.SeqLabeling(embed, hidden_size, num_classes)[源代码]

基类 fastNLP.models.BaseModel

别名 fastNLP.models.SeqLabeling fastNLP.models.sequence_labeling.SeqLabeling

一个基础的Sequence labeling的模型。 用于做sequence labeling的基础类。结构包含一层Embedding,一层LSTM(单向,一层),一层FC,以及一层CRF。
__init__(embed, hidden_size, num_classes)[源代码]
参数:
  • embed (tuple(int,int),torch.FloatTensor,nn.Embedding,numpy.ndarray) -- Embedding的大小(传入tuple(int, int), 第一个int为vocab_zie, 第二个int为embed_dim); 如果为Tensor, embedding, ndarray等则直接使用该值初始化Embedding
  • hidden_size (int) -- LSTM隐藏层的大小
  • num_classes (int) -- 一共有多少类
forward(words, seq_len, target)[源代码]
参数:
  • words (torch.LongTensor) -- [batch_size, max_len],序列的index
  • seq_len (torch.LongTensor) -- [batch_size,], 这个序列的长度
  • target (torch.LongTensor) -- [batch_size, max_len], 序列的目标值
Return y:

If truth is None, return list of [decode path(list)]. Used in testing and predicting. If truth is not None, return loss, a scalar. Used in training.

predict(words, seq_len)[源代码]

用于在预测时使用

参数:
  • words (torch.LongTensor) -- [batch_size, max_len]
  • seq_len (torch.LongTensor) -- [batch_size,]
返回:

{'pred': xx}, [batch_size, max_len]

class fastNLP.models.sequence_labeling.AdvSeqLabel(embed, hidden_size, num_classes, dropout=0.3, id2words=None, encoding_type='bmes')[源代码]

别名 fastNLP.models.AdvSeqLabel fastNLP.models.sequence_labeling.AdvSeqLabel

更复杂的Sequence Labelling模型。结构为Embedding, LayerNorm, 双向LSTM(两层),FC,LayerNorm,DropOut,FC,CRF。

__init__(embed, hidden_size, num_classes, dropout=0.3, id2words=None, encoding_type='bmes')[源代码]
参数:
  • embed (tuple(int,int),torch.FloatTensor,nn.Embedding,numpy.ndarray) -- Embedding的大小(传入tuple(int, int), 第一个int为vocab_zie, 第二个int为embed_dim); 如果为Tensor, Embedding, ndarray等则直接使用该值初始化Embedding
  • hidden_size (int) -- LSTM的隐层大小
  • num_classes (int) -- 有多少个类
  • dropout (float) -- LSTM中以及DropOut层的drop概率
  • id2words (dict) -- tag id转为其tag word的表。用于在CRF解码时防止解出非法的顺序,比如'BMES'这个标签规范中,'S' 不能出现在'B'之后。这里也支持类似与'B-NN',即'-'前为标签类型的指示,后面为具体的tag的情况。这里不但会保证 'B-NN'后面不为'S-NN'还会保证'B-NN'后面不会出现'M-xx'(任何非'M-NN'和'E-NN'的情况。)
  • encoding_type (str) -- 支持"BIO", "BMES", "BEMSO", 只有在id2words不为None的情况有用。
forward(words, seq_len, target)[源代码]
参数:
  • words (torch.LongTensor) -- [batch_size, mex_len]
  • seq_len (torch.LongTensor) -- [batch_size, ]
  • target (torch.LongTensor) -- [batch_size, max_len], 目标
Return torch.Tensor:
 

a scalar loss

predict(words, seq_len)[源代码]
参数:
  • words (torch.LongTensor) -- [batch_size, mex_len]
  • seq_len (torch.LongTensor) -- [batch_size, ]
Return torch.LongTensor:
 

[batch_size, max_len]

class fastNLP.models.sequence_labeling.BiLSTMCRF(embed, num_classes, num_layers=1, hidden_size=100, dropout=0.5, target_vocab=None)[源代码]

基类 fastNLP.models.BaseModel

别名 fastNLP.models.BiLSTMCRF fastNLP.models.sequence_labeling.BiLSTMCRF

结构为embedding + BiLSTM + FC + Dropout + CRF.
__init__(embed, num_classes, num_layers=1, hidden_size=100, dropout=0.5, target_vocab=None)[源代码]
参数:
  • embed -- 支持(1)fastNLP的各种Embedding, (2) tuple, 指明num_embedding, dimension, 如(1000, 100)
  • num_classes -- 一共多少个类
  • num_layers -- BiLSTM的层数
  • hidden_size -- BiLSTM的hidden_size,实际hidden size为该值的两倍(前向、后向)
  • dropout -- dropout的概率,0为不dropout
  • target_vocab -- Vocabulary对象,target与index的对应关系。如果传入该值,将自动避免非法的解码序列。
fastNLP.models.snli
class fastNLP.models.snli.ESIM(embed, hidden_size=None, num_labels=3, dropout_rate=0.3, dropout_embed=0.1)[源代码]

基类 fastNLP.models.BaseModel

别名 fastNLP.models.ESIM fastNLP.models.snli.ESIM

ESIM model的一个PyTorch实现 论文参见: https://arxiv.org/pdf/1609.06038.pdf
__init__(embed, hidden_size=None, num_labels=3, dropout_rate=0.3, dropout_embed=0.1)[源代码]
参数:
  • embed -- 初始化的Embedding
  • hidden_size (int) -- 隐藏层大小,默认值为Embedding的维度
  • num_labels (int) -- 目标标签种类数量,默认值为3
  • dropout_rate (float) -- dropout的比率,默认值为0.3
  • dropout_embed (float) -- 对Embedding的dropout比率,默认值为0.1
forward(words1, words2, seq_len1, seq_len2, target=None)[源代码]
参数:
  • words1 -- [batch, seq_len]
  • words2 -- [batch, seq_len]
  • seq_len1 -- [batch]
  • seq_len2 -- [batch]
  • target --
返回:

fastNLP.models.star_transformer

Star-Transformer 的 Pytorch 实现。

class fastNLP.models.star_transformer.StarTransEnc(embed, hidden_size, num_layers, num_head, head_dim, max_len, emb_dropout, dropout)[源代码]

别名 fastNLP.models.StarTransEnc fastNLP.models.star_transformer.StarTransEnc

带word embedding的Star-Transformer Encoder

__init__(embed, hidden_size, num_layers, num_head, head_dim, max_len, emb_dropout, dropout)[源代码]
参数:
  • embed -- 单词词典, 可以是 tuple, 包括(num_embedings, embedding_dim), 即 embedding的大小和每个词的维度. 也可以传入 nn.Embedding 对象,此时就以传入的对象作为embedding
  • hidden_size -- 模型中特征维度.
  • num_layers -- 模型层数.
  • num_head -- 模型中multi-head的head个数.
  • head_dim -- 模型中multi-head中每个head特征维度.
  • max_len -- 模型能接受的最大输入长度.
  • emb_dropout -- 词嵌入的dropout概率.
  • dropout -- 模型除词嵌入外的dropout概率.
forward(x, mask)[源代码]
参数:
  • x (FloatTensor) -- [batch, length, hidden] 输入的序列
  • mask (ByteTensor) -- [batch, length] 输入序列的padding mask, 在没有内容(padding 部分) 为 0, 否则为 1
返回:

[batch, length, hidden] 编码后的输出序列

[batch, hidden] 全局 relay 节点, 详见论文

class fastNLP.models.star_transformer.STNLICls(embed, num_cls, hidden_size=300, num_layers=4, num_head=8, head_dim=32, max_len=512, cls_hidden_size=600, emb_dropout=0.1, dropout=0.1)[源代码]

别名 fastNLP.models.STNLICls fastNLP.models.star_transformer.STNLICls

用于自然语言推断(NLI)的Star-Transformer

__init__(embed, num_cls, hidden_size=300, num_layers=4, num_head=8, head_dim=32, max_len=512, cls_hidden_size=600, emb_dropout=0.1, dropout=0.1)[源代码]
参数:
  • embed -- 单词词典, 可以是 tuple, 包括(num_embedings, embedding_dim), 即 embedding的大小和每个词的维度. 也可以传入 nn.Embedding 对象, 此时就以传入的对象作为embedding
  • num_cls -- 输出类别个数
  • hidden_size -- 模型中特征维度. Default: 300
  • num_layers -- 模型层数. Default: 4
  • num_head -- 模型中multi-head的head个数. Default: 8
  • head_dim -- 模型中multi-head中每个head特征维度. Default: 32
  • max_len -- 模型能接受的最大输入长度. Default: 512
  • cls_hidden_size -- 分类器隐层维度. Default: 600
  • emb_dropout -- 词嵌入的dropout概率. Default: 0.1
  • dropout -- 模型除词嵌入外的dropout概率. Default: 0.1
forward(words1, words2, seq_len1, seq_len2)[源代码]
参数:
  • words1 -- [batch, seq_len] 输入序列1
  • words2 -- [batch, seq_len] 输入序列2
  • seq_len1 -- [batch,] 输入序列1的长度
  • seq_len2 -- [batch,] 输入序列2的长度
Return output:

[batch, num_cls] 输出分类的概率

predict(words1, words2, seq_len1, seq_len2)[源代码]
参数:
  • words1 -- [batch, seq_len] 输入序列1
  • words2 -- [batch, seq_len] 输入序列2
  • seq_len1 -- [batch,] 输入序列1的长度
  • seq_len2 -- [batch,] 输入序列2的长度
Return output:

[batch, num_cls] 输出分类的概率

class fastNLP.models.star_transformer.STSeqCls(embed, num_cls, hidden_size=300, num_layers=4, num_head=8, head_dim=32, max_len=512, cls_hidden_size=600, emb_dropout=0.1, dropout=0.1)[源代码]

别名 fastNLP.models.STSeqCls fastNLP.models.star_transformer.STSeqCls

用于分类任务的Star-Transformer

__init__(embed, num_cls, hidden_size=300, num_layers=4, num_head=8, head_dim=32, max_len=512, cls_hidden_size=600, emb_dropout=0.1, dropout=0.1)[源代码]
参数:
  • embed -- 单词词典, 可以是 tuple, 包括(num_embedings, embedding_dim), 即 embedding的大小和每个词的维度. 也可以传入 nn.Embedding 对象, 此时就以传入的对象作为embedding
  • num_cls -- 输出类别个数
  • hidden_size -- 模型中特征维度. Default: 300
  • num_layers -- 模型层数. Default: 4
  • num_head -- 模型中multi-head的head个数. Default: 8
  • head_dim -- 模型中multi-head中每个head特征维度. Default: 32
  • max_len -- 模型能接受的最大输入长度. Default: 512
  • cls_hidden_size -- 分类器隐层维度. Default: 600
  • emb_dropout -- 词嵌入的dropout概率. Default: 0.1
  • dropout -- 模型除词嵌入外的dropout概率. Default: 0.1
forward(words, seq_len)[源代码]
参数:
  • words -- [batch, seq_len] 输入序列
  • seq_len -- [batch,] 输入序列的长度
Return output:

[batch, num_cls] 输出序列的分类的概率

predict(words, seq_len)[源代码]
参数:
  • words -- [batch, seq_len] 输入序列
  • seq_len -- [batch,] 输入序列的长度
Return output:

[batch, num_cls] 输出序列的分类

class fastNLP.models.star_transformer.STSeqLabel(embed, num_cls, hidden_size=300, num_layers=4, num_head=8, head_dim=32, max_len=512, cls_hidden_size=600, emb_dropout=0.1, dropout=0.1)[源代码]

别名 fastNLP.models.STSeqLabel fastNLP.models.star_transformer.STSeqLabel

用于序列标注的Star-Transformer模型

__init__(embed, num_cls, hidden_size=300, num_layers=4, num_head=8, head_dim=32, max_len=512, cls_hidden_size=600, emb_dropout=0.1, dropout=0.1)[源代码]
参数:
  • embed -- 单词词典, 可以是 tuple, 包括(num_embedings, embedding_dim), 即 embedding的大小和每个词的维度. 也可以传入 nn.Embedding 对象, 此时就以传入的对象作为embedding
  • num_cls -- 输出类别个数
  • hidden_size -- 模型中特征维度. Default: 300
  • num_layers -- 模型层数. Default: 4
  • num_head -- 模型中multi-head的head个数. Default: 8
  • head_dim -- 模型中multi-head中每个head特征维度. Default: 32
  • max_len -- 模型能接受的最大输入长度. Default: 512
  • cls_hidden_size -- 分类器隐层维度. Default: 600
  • emb_dropout -- 词嵌入的dropout概率. Default: 0.1
  • dropout -- 模型除词嵌入外的dropout概率. Default: 0.1
forward(words, seq_len)[源代码]
参数:
  • words -- [batch, seq_len] 输入序列
  • seq_len -- [batch,] 输入序列的长度
Return output:

[batch, num_cls, seq_len] 输出序列中每个元素的分类的概率

predict(words, seq_len)[源代码]
参数:
  • words -- [batch, seq_len] 输入序列
  • seq_len -- [batch,] 输入序列的长度
Return output:

[batch, seq_len] 输出序列中每个元素的分类

fastNLP.modules
_images/text_classification.png

大部分用于的 NLP 任务神经网络都可以看做由 embeddingencoderdecoder 三种模块组成。 本模块中实现了 fastNLP 提供的诸多模块组件, 可以帮助用户快速搭建自己所需的网络。几种模块的功能和常见组件如下:

类型 功能 常见组件
embedding 参见 /fastNLP.embeddings Elmo, Bert
encoder 将输入编码为具有表示能力的向量 CNN, LSTM, Transformer
decoder 将具有某种表示意义的向量解码为需要的输出形式 MLP, CRF
其它 配合其它组件使用的组件 Dropout
class fastNLP.modules.ConvolutionCharEncoder(char_emb_size=50, feature_maps=(40, 30, 30), kernels=(1, 3, 5), initial_method=None)[源代码]

别名 fastNLP.modules.ConvolutionCharEncoder fastNLP.modules.encoder.ConvolutionCharEncoder

char级别的卷积编码器.

__init__(char_emb_size=50, feature_maps=(40, 30, 30), kernels=(1, 3, 5), initial_method=None)[源代码]
参数:
  • char_emb_size (int) -- char级别embedding的维度. Default: 50 :例: 有26个字符, 每一个的embedding是一个50维的向量, 所以输入的向量维度为50.
  • feature_maps (tuple) -- 一个由int组成的tuple. tuple的长度是char级别卷积操作的数目, 第`i`个int表示第`i`个卷积操作的filter.
  • kernels (tuple) -- 一个由int组成的tuple. tuple的长度是char级别卷积操作的数目, 第`i`个int表示第`i`个卷积操作的卷积核.
  • initial_method -- 初始化参数的方式, 默认为`xavier normal`
forward(x)[源代码]
参数:x (torch.Tensor) -- [batch_size * sent_length, word_length, char_emb_size] 输入字符的embedding
返回:torch.Tensor : 卷积计算的结果, 维度为[batch_size * sent_length, sum(feature_maps), 1]
class fastNLP.modules.LSTMCharEncoder(char_emb_size=50, hidden_size=None, initial_method=None)[源代码]

别名 fastNLP.modules.LSTMCharEncoder fastNLP.modules.encoder.LSTMCharEncoder

char级别基于LSTM的encoder.

__init__(char_emb_size=50, hidden_size=None, initial_method=None)[源代码]
参数:
  • char_emb_size (int) -- char级别embedding的维度. Default: 50 例: 有26个字符, 每一个的embedding是一个50维的向量, 所以输入的向量维度为50.
  • hidden_size (int) -- LSTM隐层的大小, 默认为char的embedding维度
  • initial_method -- 初始化参数的方式, 默认为`xavier normal`
forward(x)[源代码]
参数:x (torch.Tensor) -- [ n_batch*n_word, word_length, char_emb_size] 输入字符的embedding
返回:torch.Tensor : [ n_batch*n_word, char_emb_size]经过LSTM编码的结果
class fastNLP.modules.ConvMaxpool(in_channels, out_channels, kernel_sizes, activation='relu')[源代码]

别名 fastNLP.modules.ConvMaxpool fastNLP.modules.encoder.ConvMaxpool

集合了Convolution和Max-Pooling于一体的层。给定一个batch_size x max_len x input_size的输入,返回batch_size x sum(output_channels) 大小的matrix。在内部,是先使用CNN给输入做卷积,然后经过activation激活层,在通过在长度(max_len) 这一维进行max_pooling。最后得到每个sample的一个向量表示。

__init__(in_channels, out_channels, kernel_sizes, activation='relu')[源代码]
参数:
  • in_channels (int) -- 输入channel的大小,一般是embedding的维度; 或encoder的output维度
  • out_channels (int,tuple(int)) -- 输出channel的数量。如果为list,则需要与kernel_sizes的数量保持一致
  • kernel_sizes (int,tuple(int)) -- 输出channel的kernel大小。
  • activation (str) -- Convolution后的结果将通过该activation后再经过max-pooling。支持relu, sigmoid, tanh
forward(x, mask=None)[源代码]
参数:
  • x (torch.FloatTensor) -- batch_size x max_len x input_size, 一般是经过embedding后的值
  • mask -- batch_size x max_len, pad的地方为0。不影响卷积运算,max-pool一定不会pool到pad为0的位置
返回:

class fastNLP.modules.LSTM(input_size, hidden_size=100, num_layers=1, dropout=0.0, batch_first=True, bidirectional=False, bias=True)[源代码]

别名 fastNLP.modules.LSTM fastNLP.modules.encoder.LSTM

LSTM 模块, 轻量封装的Pytorch LSTM. 在提供seq_len的情况下,将自动使用pack_padded_sequence; 同时默认将forget gate的bias初始化 为1; 且可以应对DataParallel中LSTM的使用问题。

__init__(input_size, hidden_size=100, num_layers=1, dropout=0.0, batch_first=True, bidirectional=False, bias=True)[源代码]
参数:
  • input_size -- 输入 x 的特征维度
  • hidden_size -- 隐状态 h 的特征维度. 如果bidirectional为True,则输出的维度会是hidde_size*2
  • num_layers -- rnn的层数. Default: 1
  • dropout -- 层间dropout概率. Default: 0
  • bidirectional -- 若为 True, 使用双向的RNN. Default: False
  • batch_first -- 若为 True, 输入和输出 Tensor 形状为 :(batch, seq, feature). Default: False
  • bias -- 如果为 False, 模型将不会使用bias. Default: True
forward(x, seq_len=None, h0=None, c0=None)[源代码]
参数:
  • x -- [batch, seq_len, input_size] 输入序列
  • seq_len -- [batch, ] 序列长度, 若为 None, 所有输入看做一样长. Default: None
  • h0 -- [batch, hidden_size] 初始隐状态, 若为 None , 设为全0向量. Default: None
  • c0 -- [batch, hidden_size] 初始Cell状态, 若为 None , 设为全0向量. Default: None
Return (output, (ht, ct)):
 

output: [batch, seq_len, hidden_size*num_direction] 输出序列 和 ht,ct: [num_layers*num_direction, batch, hidden_size] 最后时刻隐状态.

class fastNLP.modules.StarTransformer(hidden_size, num_layers, num_head, head_dim, dropout=0.1, max_len=None)[源代码]

别名 fastNLP.modules.StarTransformer fastNLP.modules.encoder.StarTransformer

Star-Transformer 的encoder部分。 输入3d的文本输入, 返回相同长度的文本编码

paper: https://arxiv.org/abs/1902.09113

__init__(hidden_size, num_layers, num_head, head_dim, dropout=0.1, max_len=None)[源代码]
参数:
  • hidden_size (int) -- 输入维度的大小。同时也是输出维度的大小。
  • num_layers (int) -- star-transformer的层数
  • num_head (int) -- head的数量。
  • head_dim (int) -- 每个head的维度大小。
  • dropout (float) -- dropout 概率. Default: 0.1
  • max_len (int) -- int or None, 如果为int,输入序列的最大长度, 模型会为输入序列加上position embedding。 若为`None`,忽略加上position embedding的步骤. Default: None
forward(data, mask)[源代码]
参数:
  • data (FloatTensor) -- [batch, length, hidden] 输入的序列
  • mask (ByteTensor) -- [batch, length] 输入序列的padding mask, 在没有内容(padding 部分) 为 0, 否则为 1
返回:

[batch, length, hidden] 编码后的输出序列

[batch, hidden] 全局 relay 节点, 详见论文

class fastNLP.modules.TransformerEncoder(num_layers, **kargs)[源代码]

别名 fastNLP.modules.TransformerEncoder fastNLP.modules.encoder.TransformerEncoder

transformer的encoder模块,不包含embedding层

__init__(num_layers, **kargs)[源代码]
参数:
  • num_layers (int) -- transformer的层数
  • model_size (int) -- 输入维度的大小。同时也是输出维度的大小。
  • inner_size (int) -- FFN层的hidden大小
  • key_size (int) -- 每个head的维度大小。
  • value_size (int) -- 每个head中value的维度。
  • num_head (int) -- head的数量。
  • dropout (float) -- dropout概率. Default: 0.1
forward(x, seq_mask=None)[源代码]
参数:
  • x -- [batch, seq_len, model_size] 输入序列
  • seq_mask -- [batch, seq_len] 输入序列的padding mask, 若为 None , 生成全1向量. Default: None
返回:

[batch, seq_len, model_size] 输出序列

class fastNLP.modules.VarRNN(*args, **kwargs)[源代码]

基类 fastNLP.modules.VarRNNBase

别名 fastNLP.modules.VarRNN fastNLP.modules.encoder.VarRNN

__init__(*args, **kwargs)[源代码]
参数:
  • input_size -- 输入 x 的特征维度
  • hidden_size -- 隐状态 h 的特征维度
  • num_layers -- rnn的层数. Default: 1
  • bias -- 如果为 False, 模型将不会使用bias. Default: True
  • batch_first -- 若为 True, 输入和输出 Tensor 形状为 (batch, seq, feature). Default: False
  • input_dropout -- 对输入的dropout概率. Default: 0
  • hidden_dropout -- 对每个隐状态的dropout概率. Default: 0
  • bidirectional -- 若为 True, 使用双向的RNN. Default: False
class fastNLP.modules.VarLSTM(*args, **kwargs)[源代码]

基类 fastNLP.modules.VarRNNBase

别名 fastNLP.modules.VarLSTM fastNLP.modules.encoder.VarLSTM

__init__(*args, **kwargs)[源代码]
参数:
  • input_size -- 输入 x 的特征维度
  • hidden_size -- 隐状态 h 的特征维度
  • num_layers -- rnn的层数. Default: 1
  • bias -- 如果为 False, 模型将不会使用bias. Default: True
  • batch_first -- 若为 True, 输入和输出 Tensor 形状为 (batch, seq, feature). Default: False
  • input_dropout -- 对输入的dropout概率. Default: 0
  • hidden_dropout -- 对每个隐状态的dropout概率. Default: 0
  • bidirectional -- 若为 True, 使用双向的LSTM. Default: False
class fastNLP.modules.VarGRU(*args, **kwargs)[源代码]

基类 fastNLP.modules.VarRNNBase

别名 fastNLP.modules.VarGRU fastNLP.modules.encoder.VarGRU

__init__(*args, **kwargs)[源代码]
参数:
  • input_size -- 输入 x 的特征维度
  • hidden_size -- 隐状态 h 的特征维度
  • num_layers -- rnn的层数. Default: 1
  • bias -- 如果为 False, 模型将不会使用bias. Default: True
  • batch_first -- 若为 True, 输入和输出 Tensor 形状为 (batch, seq, feature). Default: False
  • input_dropout -- 对输入的dropout概率. Default: 0
  • hidden_dropout -- 对每个隐状态的dropout概率. Default: 0
  • bidirectional -- 若为 True, 使用双向的GRU. Default: False
class fastNLP.modules.MaxPool(stride=None, padding=0, dilation=1, dimension=1, kernel_size=None, ceil_mode=False)[源代码]

别名 fastNLP.modules.MaxPool fastNLP.modules.encoder.MaxPool

Max-pooling模块。

__init__(stride=None, padding=0, dilation=1, dimension=1, kernel_size=None, ceil_mode=False)[源代码]
参数:
  • stride -- 窗口移动大小,默认为kernel_size
  • padding -- padding的内容,默认为0
  • dilation -- 控制窗口内元素移动距离的大小
  • dimension -- MaxPool的维度,支持1,2,3维。
  • kernel_size -- max pooling的窗口大小,默认为tensor最后k维,其中k为dimension
  • ceil_mode --
class fastNLP.modules.MaxPoolWithMask[源代码]

别名 fastNLP.modules.MaxPoolWithMask fastNLP.modules.encoder.MaxPoolWithMask

带mask矩阵的max pooling。在做max-pooling的时候不会考虑mask值为0的位置。

forward(tensor, mask, dim=1)[源代码]
参数:
  • tensor (torch.FloatTensor) -- [batch_size, seq_len, channels] 初始tensor
  • mask (torch.LongTensor) -- [batch_size, seq_len] 0/1的mask矩阵
  • dim (int) -- 需要进行max pooling的维度
返回:

class fastNLP.modules.KMaxPool(k=1)[源代码]

别名 fastNLP.modules.KMaxPool fastNLP.modules.encoder.KMaxPool K max-pooling module.

forward(x)[源代码]
参数:x (torch.Tensor) -- [N, C, L] 初始tensor
返回:torch.Tensor x: [N, C*k] k-max pool后的结果
class fastNLP.modules.AvgPool(stride=None, padding=0)[源代码]

别名 fastNLP.modules.AvgPool fastNLP.modules.encoder.AvgPool

给定形如[batch_size, max_len, hidden_size]的输入,在最后一维进行avg pooling. 输出为[batch_size, hidden_size]

forward(x)[源代码]
参数:x (torch.Tensor) -- [N, C, L] 初始tensor
返回:torch.Tensor x: [N, C] avg pool后的结果
class fastNLP.modules.AvgPoolWithMask[源代码]

别名 fastNLP.modules.AvgPoolWithMask fastNLP.modules.encoder.AvgPoolWithMask

给定形如[batch_size, max_len, hidden_size]的输入,在最后一维进行avg pooling. 输出为[batch_size, hidden_size], pooling 的时候只会考虑mask为1的位置

forward(tensor, mask, dim=1)[源代码]
参数:
  • tensor (torch.FloatTensor) -- [batch_size, seq_len, channels] 初始tensor
  • mask (torch.LongTensor) -- [batch_size, seq_len] 0/1的mask矩阵
  • dim (int) -- 需要进行max pooling的维度
返回:

class fastNLP.modules.MultiHeadAttention(input_size, key_size, value_size, num_head, dropout=0.1)[源代码]

别名 fastNLP.modules.MultiHeadAttention fastNLP.modules.encoder.MultiHeadAttention

Transformer当中的MultiHeadAttention

__init__(input_size, key_size, value_size, num_head, dropout=0.1)[源代码]
参数:
  • input_size -- int, 输入维度的大小。同时也是输出维度的大小。
  • key_size -- int, 每个head的维度大小。
  • value_size -- int,每个head中value的维度。
  • num_head -- int,head的数量。
  • dropout -- float。
forward(Q, K, V, atte_mask_out=None)[源代码]
参数:
  • Q -- [batch, seq_len_q, model_size]
  • K -- [batch, seq_len_k, model_size]
  • V -- [batch, seq_len_k, model_size]
  • seq_mask -- [batch, seq_len]
class fastNLP.modules.MLP(size_layer, activation='relu', output_activation=None, initial_method=None, dropout=0.0)[源代码]

别名 fastNLP.modules.MLP fastNLP.modules.decoder.MLP

多层感知器

注解

隐藏层的激活函数通过activation定义。一个str/function或者一个str/function的list可以被传入activation。 如果只传入了一个str/function,那么所有隐藏层的激活函数都由这个str/function定义; 如果传入了一个str/function的list,那么每一个隐藏层的激活函数由这个list中对应的元素定义,其中list的长度为隐藏层数。 输出层的激活函数由output_activation定义,默认值为None,此时输出层没有激活函数。

Examples:

>>> net1 = MLP([5, 10, 5])
>>> net2 = MLP([5, 10, 5], 'tanh')
>>> net3 = MLP([5, 6, 7, 8, 5], 'tanh')
>>> net4 = MLP([5, 6, 7, 8, 5], 'relu', output_activation='tanh')
>>> net5 = MLP([5, 6, 7, 8, 5], ['tanh', 'relu', 'tanh'], 'tanh')
>>> for net in [net1, net2, net3, net4, net5]:
>>>     x = torch.randn(5, 5)
>>>     y = net(x)
>>>     print(x)
>>>     print(y)
__init__(size_layer, activation='relu', output_activation=None, initial_method=None, dropout=0.0)[源代码]
参数:
  • size_layer (List[int]) -- 一个int的列表,用来定义MLP的层数,列表中的数字为每一层是hidden数目。MLP的层数为 len(size_layer) - 1
  • activation (Union[str,func,List[str]]) -- 一个字符串或者函数的列表,用来定义每一个隐层的激活函数,字符串包括relu,tanh和 sigmoid,默认值为relu
  • output_activation (Union[str,func]) -- 字符串或者函数,用来定义输出层的激活函数,默认值为None,表示输出层没有激活函数
  • initial_method (str) -- 参数初始化方式
  • dropout (float) -- dropout概率,默认值为0
forward(x)[源代码]
参数:x (torch.Tensor) -- MLP接受的输入
返回:torch.Tensor : MLP的输出结果
class fastNLP.modules.ConditionalRandomField(num_tags, include_start_end_trans=False, allowed_transitions=None, initial_method=None)[源代码]

别名 fastNLP.modules.ConditionalRandomField fastNLP.modules.decoder.ConditionalRandomField

条件随机场。提供forward()以及viterbi_decode()两个方法,分别用于训练与inference。

__init__(num_tags, include_start_end_trans=False, allowed_transitions=None, initial_method=None)[源代码]
参数:
  • num_tags (int) -- 标签的数量
  • include_start_end_trans (bool) -- 是否考虑各个tag作为开始以及结尾的分数。
  • to_tag_id(int)]] allowed_transitions (List[Tuple[from_tag_id(int),) -- 内部的Tuple[from_tag_id(int), to_tag_id(int)]视为允许发生的跃迁,其他没有包含的跃迁认为是禁止跃迁,可以通过 allowed_transitions()函数得到;如果为None,则所有跃迁均为合法
  • initial_method (str) -- 初始化方法。见initial_parameter
forward(feats, tags, mask)[源代码]

用于计算CRF的前向loss,返回值为一个batch_size的FloatTensor,可能需要mean()求得loss。

参数:
  • feats (torch.FloatTensor) -- batch_size x max_len x num_tags,特征矩阵。
  • tags (torch.LongTensor) -- batch_size x max_len,标签矩阵。
  • mask (torch.ByteTensor) -- batch_size x max_len,为0的位置认为是padding。
返回:

torch.FloatTensor, (batch_size,)

viterbi_decode(logits, mask, unpad=False)[源代码]

给定一个特征矩阵以及转移分数矩阵,计算出最佳的路径以及对应的分数

参数:
  • logits (torch.FloatTensor) -- batch_size x max_len x num_tags,特征矩阵。
  • mask (torch.ByteTensor) -- batch_size x max_len, 为0的位置认为是pad;如果为None,则认为没有padding。
  • unpad (bool) -- 是否将结果删去padding。False, 返回的是batch_size x max_len的tensor; True,返回的是 List[List[int]], 内部的List[int]为每个sequence的label,已经除去pad部分,即每个List[int]的长度是这 个sample的有效长度。
返回:

返回 (paths, scores)。 paths: 是解码后的路径, 其值参照unpad参数. scores: torch.FloatTensor, size为(batch_size,), 对应每个最优路径的分数。

fastNLP.modules.viterbi_decode(logits, transitions, mask=None, unpad=False)[源代码]

别名 fastNLP.modules.viterbi_decode fastNLP.modules.decoder.viterbi_decode

给定一个特征矩阵以及转移分数矩阵,计算出最佳的路径以及对应的分数

参数:
  • logits (torch.FloatTensor) -- batch_size x max_len x num_tags,特征矩阵。
  • transitions (torch.FloatTensor) -- n_tags x n_tags,[i, j]位置的值认为是从tag i到tag j的转换; 或者(n_tags+2) x (n_tags+2), 其中n_tag是start的index, n_tags+1是end的index;
  • mask (torch.ByteTensor) -- batch_size x max_len, 为0的位置认为是pad;如果为None,则认为没有padding。
  • unpad (bool) -- 是否将结果删去padding。False, 返回的是batch_size x max_len的tensor; True,返回的是 List[List[int]], 内部的List[int]为每个sequence的label,已经除去pad部分,即每个List[int]的长度是这 个sample的有效长度。
返回:

返回 (paths, scores)。 paths: 是解码后的路径, 其值参照unpad参数. scores: torch.FloatTensor, size为(batch_size,), 对应每个最优路径的分数。

fastNLP.modules.allowed_transitions(tag_vocab: Union[fastNLP.core.vocabulary.Vocabulary, dict], encoding_type=None, include_start_end=False)[源代码]

别名 fastNLP.modules.allowed_transitions fastNLP.modules.decoder.allowed_transitions

给定一个id到label的映射表,返回所有可以跳转的(from_tag_id, to_tag_id)列表。

参数:
  • tag_vocab (Vocabulary,dict) -- 支持类型为tag或tag-label。只有tag的,比如"B", "M"; 也可以是"B-NN", "M-NN", tag和label之间一定要用"-"隔开。如果传入dict,格式需要形如{0:"O", 1:"B-tag1"},即index在前,tag在后。
  • encoding_type (str) -- 支持"bio", "bmes", "bmeso", "bioes"。默认为None,通过vocab自动推断
  • include_start_end (bool) -- 是否包含开始与结尾的转换。比如在bio中,b/o可以在开头,但是i不能在开头; 为True,返回的结果中会包含(start_idx, b_idx), (start_idx, o_idx), 但是不包含(start_idx, i_idx); start_idx=len(id2label), end_idx=len(id2label)+1。为False, 返回的结果中不含与开始结尾相关的内容
返回:

List[Tuple(int, int)]], 内部的Tuple是可以进行跳转的(from_tag_id, to_tag_id)。

class fastNLP.modules.TimestepDropout(p=0.5, inplace=False)[源代码]

传入参数的shape为 (batch_size, num_timesteps, embedding_dim) 使用同一个shape为 (batch_size, embedding_dim) 的mask在每个timestamp上做dropout。

子模块
fastNLP.modules.decoder
class fastNLP.modules.decoder.MLP(size_layer, activation='relu', output_activation=None, initial_method=None, dropout=0.0)[源代码]

别名 fastNLP.modules.MLP fastNLP.modules.decoder.MLP

多层感知器

注解

隐藏层的激活函数通过activation定义。一个str/function或者一个str/function的list可以被传入activation。 如果只传入了一个str/function,那么所有隐藏层的激活函数都由这个str/function定义; 如果传入了一个str/function的list,那么每一个隐藏层的激活函数由这个list中对应的元素定义,其中list的长度为隐藏层数。 输出层的激活函数由output_activation定义,默认值为None,此时输出层没有激活函数。

Examples:

>>> net1 = MLP([5, 10, 5])
>>> net2 = MLP([5, 10, 5], 'tanh')
>>> net3 = MLP([5, 6, 7, 8, 5], 'tanh')
>>> net4 = MLP([5, 6, 7, 8, 5], 'relu', output_activation='tanh')
>>> net5 = MLP([5, 6, 7, 8, 5], ['tanh', 'relu', 'tanh'], 'tanh')
>>> for net in [net1, net2, net3, net4, net5]:
>>>     x = torch.randn(5, 5)
>>>     y = net(x)
>>>     print(x)
>>>     print(y)
__init__(size_layer, activation='relu', output_activation=None, initial_method=None, dropout=0.0)[源代码]
参数:
  • size_layer (List[int]) -- 一个int的列表,用来定义MLP的层数,列表中的数字为每一层是hidden数目。MLP的层数为 len(size_layer) - 1
  • activation (Union[str,func,List[str]]) -- 一个字符串或者函数的列表,用来定义每一个隐层的激活函数,字符串包括relu,tanh和 sigmoid,默认值为relu
  • output_activation (Union[str,func]) -- 字符串或者函数,用来定义输出层的激活函数,默认值为None,表示输出层没有激活函数
  • initial_method (str) -- 参数初始化方式
  • dropout (float) -- dropout概率,默认值为0
forward(x)[源代码]
参数:x (torch.Tensor) -- MLP接受的输入
返回:torch.Tensor : MLP的输出结果
class fastNLP.modules.decoder.ConditionalRandomField(num_tags, include_start_end_trans=False, allowed_transitions=None, initial_method=None)[源代码]

别名 fastNLP.modules.ConditionalRandomField fastNLP.modules.decoder.ConditionalRandomField

条件随机场。提供forward()以及viterbi_decode()两个方法,分别用于训练与inference。

__init__(num_tags, include_start_end_trans=False, allowed_transitions=None, initial_method=None)[源代码]
参数:
  • num_tags (int) -- 标签的数量
  • include_start_end_trans (bool) -- 是否考虑各个tag作为开始以及结尾的分数。
  • to_tag_id(int)]] allowed_transitions (List[Tuple[from_tag_id(int),) -- 内部的Tuple[from_tag_id(int), to_tag_id(int)]视为允许发生的跃迁,其他没有包含的跃迁认为是禁止跃迁,可以通过 allowed_transitions()函数得到;如果为None,则所有跃迁均为合法
  • initial_method (str) -- 初始化方法。见initial_parameter
forward(feats, tags, mask)[源代码]

用于计算CRF的前向loss,返回值为一个batch_size的FloatTensor,可能需要mean()求得loss。

参数:
  • feats (torch.FloatTensor) -- batch_size x max_len x num_tags,特征矩阵。
  • tags (torch.LongTensor) -- batch_size x max_len,标签矩阵。
  • mask (torch.ByteTensor) -- batch_size x max_len,为0的位置认为是padding。
返回:

torch.FloatTensor, (batch_size,)

viterbi_decode(logits, mask, unpad=False)[源代码]

给定一个特征矩阵以及转移分数矩阵,计算出最佳的路径以及对应的分数

参数:
  • logits (torch.FloatTensor) -- batch_size x max_len x num_tags,特征矩阵。
  • mask (torch.ByteTensor) -- batch_size x max_len, 为0的位置认为是pad;如果为None,则认为没有padding。
  • unpad (bool) -- 是否将结果删去padding。False, 返回的是batch_size x max_len的tensor; True,返回的是 List[List[int]], 内部的List[int]为每个sequence的label,已经除去pad部分,即每个List[int]的长度是这 个sample的有效长度。
返回:

返回 (paths, scores)。 paths: 是解码后的路径, 其值参照unpad参数. scores: torch.FloatTensor, size为(batch_size,), 对应每个最优路径的分数。

fastNLP.modules.decoder.viterbi_decode(logits, transitions, mask=None, unpad=False)[源代码]

别名 fastNLP.modules.viterbi_decode fastNLP.modules.decoder.viterbi_decode

给定一个特征矩阵以及转移分数矩阵,计算出最佳的路径以及对应的分数

参数:
  • logits (torch.FloatTensor) -- batch_size x max_len x num_tags,特征矩阵。
  • transitions (torch.FloatTensor) -- n_tags x n_tags,[i, j]位置的值认为是从tag i到tag j的转换; 或者(n_tags+2) x (n_tags+2), 其中n_tag是start的index, n_tags+1是end的index;
  • mask (torch.ByteTensor) -- batch_size x max_len, 为0的位置认为是pad;如果为None,则认为没有padding。
  • unpad (bool) -- 是否将结果删去padding。False, 返回的是batch_size x max_len的tensor; True,返回的是 List[List[int]], 内部的List[int]为每个sequence的label,已经除去pad部分,即每个List[int]的长度是这 个sample的有效长度。
返回:

返回 (paths, scores)。 paths: 是解码后的路径, 其值参照unpad参数. scores: torch.FloatTensor, size为(batch_size,), 对应每个最优路径的分数。

fastNLP.modules.decoder.allowed_transitions(tag_vocab: Union[fastNLP.core.vocabulary.Vocabulary, dict], encoding_type=None, include_start_end=False)[源代码]

别名 fastNLP.modules.allowed_transitions fastNLP.modules.decoder.allowed_transitions

给定一个id到label的映射表,返回所有可以跳转的(from_tag_id, to_tag_id)列表。

参数:
  • tag_vocab (Vocabulary,dict) -- 支持类型为tag或tag-label。只有tag的,比如"B", "M"; 也可以是"B-NN", "M-NN", tag和label之间一定要用"-"隔开。如果传入dict,格式需要形如{0:"O", 1:"B-tag1"},即index在前,tag在后。
  • encoding_type (str) -- 支持"bio", "bmes", "bmeso", "bioes"。默认为None,通过vocab自动推断
  • include_start_end (bool) -- 是否包含开始与结尾的转换。比如在bio中,b/o可以在开头,但是i不能在开头; 为True,返回的结果中会包含(start_idx, b_idx), (start_idx, o_idx), 但是不包含(start_idx, i_idx); start_idx=len(id2label), end_idx=len(id2label)+1。为False, 返回的结果中不含与开始结尾相关的内容
返回:

List[Tuple(int, int)]], 内部的Tuple是可以进行跳转的(from_tag_id, to_tag_id)。

fastNLP.modules.encoder
class fastNLP.modules.encoder.ConvolutionCharEncoder(char_emb_size=50, feature_maps=(40, 30, 30), kernels=(1, 3, 5), initial_method=None)[源代码]

别名 fastNLP.modules.ConvolutionCharEncoder fastNLP.modules.encoder.ConvolutionCharEncoder

char级别的卷积编码器.

__init__(char_emb_size=50, feature_maps=(40, 30, 30), kernels=(1, 3, 5), initial_method=None)[源代码]
参数:
  • char_emb_size (int) -- char级别embedding的维度. Default: 50 :例: 有26个字符, 每一个的embedding是一个50维的向量, 所以输入的向量维度为50.
  • feature_maps (tuple) -- 一个由int组成的tuple. tuple的长度是char级别卷积操作的数目, 第`i`个int表示第`i`个卷积操作的filter.
  • kernels (tuple) -- 一个由int组成的tuple. tuple的长度是char级别卷积操作的数目, 第`i`个int表示第`i`个卷积操作的卷积核.
  • initial_method -- 初始化参数的方式, 默认为`xavier normal`
forward(x)[源代码]
参数:x (torch.Tensor) -- [batch_size * sent_length, word_length, char_emb_size] 输入字符的embedding
返回:torch.Tensor : 卷积计算的结果, 维度为[batch_size * sent_length, sum(feature_maps), 1]
class fastNLP.modules.encoder.LSTMCharEncoder(char_emb_size=50, hidden_size=None, initial_method=None)[源代码]

别名 fastNLP.modules.LSTMCharEncoder fastNLP.modules.encoder.LSTMCharEncoder

char级别基于LSTM的encoder.

__init__(char_emb_size=50, hidden_size=None, initial_method=None)[源代码]
参数:
  • char_emb_size (int) -- char级别embedding的维度. Default: 50 例: 有26个字符, 每一个的embedding是一个50维的向量, 所以输入的向量维度为50.
  • hidden_size (int) -- LSTM隐层的大小, 默认为char的embedding维度
  • initial_method -- 初始化参数的方式, 默认为`xavier normal`
forward(x)[源代码]
参数:x (torch.Tensor) -- [ n_batch*n_word, word_length, char_emb_size] 输入字符的embedding
返回:torch.Tensor : [ n_batch*n_word, char_emb_size]经过LSTM编码的结果
class fastNLP.modules.encoder.ConvMaxpool(in_channels, out_channels, kernel_sizes, activation='relu')[源代码]

别名 fastNLP.modules.ConvMaxpool fastNLP.modules.encoder.ConvMaxpool

集合了Convolution和Max-Pooling于一体的层。给定一个batch_size x max_len x input_size的输入,返回batch_size x sum(output_channels) 大小的matrix。在内部,是先使用CNN给输入做卷积,然后经过activation激活层,在通过在长度(max_len) 这一维进行max_pooling。最后得到每个sample的一个向量表示。

__init__(in_channels, out_channels, kernel_sizes, activation='relu')[源代码]
参数:
  • in_channels (int) -- 输入channel的大小,一般是embedding的维度; 或encoder的output维度
  • out_channels (int,tuple(int)) -- 输出channel的数量。如果为list,则需要与kernel_sizes的数量保持一致
  • kernel_sizes (int,tuple(int)) -- 输出channel的kernel大小。
  • activation (str) -- Convolution后的结果将通过该activation后再经过max-pooling。支持relu, sigmoid, tanh
forward(x, mask=None)[源代码]
参数:
  • x (torch.FloatTensor) -- batch_size x max_len x input_size, 一般是经过embedding后的值
  • mask -- batch_size x max_len, pad的地方为0。不影响卷积运算,max-pool一定不会pool到pad为0的位置
返回:

class fastNLP.modules.encoder.LSTM(input_size, hidden_size=100, num_layers=1, dropout=0.0, batch_first=True, bidirectional=False, bias=True)[源代码]

别名 fastNLP.modules.LSTM fastNLP.modules.encoder.LSTM

LSTM 模块, 轻量封装的Pytorch LSTM. 在提供seq_len的情况下,将自动使用pack_padded_sequence; 同时默认将forget gate的bias初始化 为1; 且可以应对DataParallel中LSTM的使用问题。

__init__(input_size, hidden_size=100, num_layers=1, dropout=0.0, batch_first=True, bidirectional=False, bias=True)[源代码]
参数:
  • input_size -- 输入 x 的特征维度
  • hidden_size -- 隐状态 h 的特征维度. 如果bidirectional为True,则输出的维度会是hidde_size*2
  • num_layers -- rnn的层数. Default: 1
  • dropout -- 层间dropout概率. Default: 0
  • bidirectional -- 若为 True, 使用双向的RNN. Default: False
  • batch_first -- 若为 True, 输入和输出 Tensor 形状为 :(batch, seq, feature). Default: False
  • bias -- 如果为 False, 模型将不会使用bias. Default: True
forward(x, seq_len=None, h0=None, c0=None)[源代码]
参数:
  • x -- [batch, seq_len, input_size] 输入序列
  • seq_len -- [batch, ] 序列长度, 若为 None, 所有输入看做一样长. Default: None
  • h0 -- [batch, hidden_size] 初始隐状态, 若为 None , 设为全0向量. Default: None
  • c0 -- [batch, hidden_size] 初始Cell状态, 若为 None , 设为全0向量. Default: None
Return (output, (ht, ct)):
 

output: [batch, seq_len, hidden_size*num_direction] 输出序列 和 ht,ct: [num_layers*num_direction, batch, hidden_size] 最后时刻隐状态.

class fastNLP.modules.encoder.StarTransformer(hidden_size, num_layers, num_head, head_dim, dropout=0.1, max_len=None)[源代码]

别名 fastNLP.modules.StarTransformer fastNLP.modules.encoder.StarTransformer

Star-Transformer 的encoder部分。 输入3d的文本输入, 返回相同长度的文本编码

paper: https://arxiv.org/abs/1902.09113

__init__(hidden_size, num_layers, num_head, head_dim, dropout=0.1, max_len=None)[源代码]
参数:
  • hidden_size (int) -- 输入维度的大小。同时也是输出维度的大小。
  • num_layers (int) -- star-transformer的层数
  • num_head (int) -- head的数量。
  • head_dim (int) -- 每个head的维度大小。
  • dropout (float) -- dropout 概率. Default: 0.1
  • max_len (int) -- int or None, 如果为int,输入序列的最大长度, 模型会为输入序列加上position embedding。 若为`None`,忽略加上position embedding的步骤. Default: None
forward(data, mask)[源代码]
参数:
  • data (FloatTensor) -- [batch, length, hidden] 输入的序列
  • mask (ByteTensor) -- [batch, length] 输入序列的padding mask, 在没有内容(padding 部分) 为 0, 否则为 1
返回:

[batch, length, hidden] 编码后的输出序列

[batch, hidden] 全局 relay 节点, 详见论文

class fastNLP.modules.encoder.TransformerEncoder(num_layers, **kargs)[源代码]

别名 fastNLP.modules.TransformerEncoder fastNLP.modules.encoder.TransformerEncoder

transformer的encoder模块,不包含embedding层

__init__(num_layers, **kargs)[源代码]
参数:
  • num_layers (int) -- transformer的层数
  • model_size (int) -- 输入维度的大小。同时也是输出维度的大小。
  • inner_size (int) -- FFN层的hidden大小
  • key_size (int) -- 每个head的维度大小。
  • value_size (int) -- 每个head中value的维度。
  • num_head (int) -- head的数量。
  • dropout (float) -- dropout概率. Default: 0.1
forward(x, seq_mask=None)[源代码]
参数:
  • x -- [batch, seq_len, model_size] 输入序列
  • seq_mask -- [batch, seq_len] 输入序列的padding mask, 若为 None , 生成全1向量. Default: None
返回:

[batch, seq_len, model_size] 输出序列

class fastNLP.modules.encoder.VarRNN(*args, **kwargs)[源代码]

基类 fastNLP.modules.VarRNNBase

别名 fastNLP.modules.VarRNN fastNLP.modules.encoder.VarRNN

__init__(*args, **kwargs)[源代码]
参数:
  • input_size -- 输入 x 的特征维度
  • hidden_size -- 隐状态 h 的特征维度
  • num_layers -- rnn的层数. Default: 1
  • bias -- 如果为 False, 模型将不会使用bias. Default: True
  • batch_first -- 若为 True, 输入和输出 Tensor 形状为 (batch, seq, feature). Default: False
  • input_dropout -- 对输入的dropout概率. Default: 0
  • hidden_dropout -- 对每个隐状态的dropout概率. Default: 0
  • bidirectional -- 若为 True, 使用双向的RNN. Default: False
class fastNLP.modules.encoder.VarLSTM(*args, **kwargs)[源代码]

基类 fastNLP.modules.VarRNNBase

别名 fastNLP.modules.VarLSTM fastNLP.modules.encoder.VarLSTM

__init__(*args, **kwargs)[源代码]
参数:
  • input_size -- 输入 x 的特征维度
  • hidden_size -- 隐状态 h 的特征维度
  • num_layers -- rnn的层数. Default: 1
  • bias -- 如果为 False, 模型将不会使用bias. Default: True
  • batch_first -- 若为 True, 输入和输出 Tensor 形状为 (batch, seq, feature). Default: False
  • input_dropout -- 对输入的dropout概率. Default: 0
  • hidden_dropout -- 对每个隐状态的dropout概率. Default: 0
  • bidirectional -- 若为 True, 使用双向的LSTM. Default: False
class fastNLP.modules.encoder.VarGRU(*args, **kwargs)[源代码]

基类 fastNLP.modules.VarRNNBase

别名 fastNLP.modules.VarGRU fastNLP.modules.encoder.VarGRU

__init__(*args, **kwargs)[源代码]
参数:
  • input_size -- 输入 x 的特征维度
  • hidden_size -- 隐状态 h 的特征维度
  • num_layers -- rnn的层数. Default: 1
  • bias -- 如果为 False, 模型将不会使用bias. Default: True
  • batch_first -- 若为 True, 输入和输出 Tensor 形状为 (batch, seq, feature). Default: False
  • input_dropout -- 对输入的dropout概率. Default: 0
  • hidden_dropout -- 对每个隐状态的dropout概率. Default: 0
  • bidirectional -- 若为 True, 使用双向的GRU. Default: False
class fastNLP.modules.encoder.MaxPool(stride=None, padding=0, dilation=1, dimension=1, kernel_size=None, ceil_mode=False)[源代码]

别名 fastNLP.modules.MaxPool fastNLP.modules.encoder.MaxPool

Max-pooling模块。

__init__(stride=None, padding=0, dilation=1, dimension=1, kernel_size=None, ceil_mode=False)[源代码]
参数:
  • stride -- 窗口移动大小,默认为kernel_size
  • padding -- padding的内容,默认为0
  • dilation -- 控制窗口内元素移动距离的大小
  • dimension -- MaxPool的维度,支持1,2,3维。
  • kernel_size -- max pooling的窗口大小,默认为tensor最后k维,其中k为dimension
  • ceil_mode --
class fastNLP.modules.encoder.MaxPoolWithMask[源代码]

别名 fastNLP.modules.MaxPoolWithMask fastNLP.modules.encoder.MaxPoolWithMask

带mask矩阵的max pooling。在做max-pooling的时候不会考虑mask值为0的位置。

forward(tensor, mask, dim=1)[源代码]
参数:
  • tensor (torch.FloatTensor) -- [batch_size, seq_len, channels] 初始tensor
  • mask (torch.LongTensor) -- [batch_size, seq_len] 0/1的mask矩阵
  • dim (int) -- 需要进行max pooling的维度
返回:

class fastNLP.modules.encoder.KMaxPool(k=1)[源代码]

别名 fastNLP.modules.KMaxPool fastNLP.modules.encoder.KMaxPool K max-pooling module.

forward(x)[源代码]
参数:x (torch.Tensor) -- [N, C, L] 初始tensor
返回:torch.Tensor x: [N, C*k] k-max pool后的结果
class fastNLP.modules.encoder.AvgPool(stride=None, padding=0)[源代码]

别名 fastNLP.modules.AvgPool fastNLP.modules.encoder.AvgPool

给定形如[batch_size, max_len, hidden_size]的输入,在最后一维进行avg pooling. 输出为[batch_size, hidden_size]

forward(x)[源代码]
参数:x (torch.Tensor) -- [N, C, L] 初始tensor
返回:torch.Tensor x: [N, C] avg pool后的结果
class fastNLP.modules.encoder.AvgPoolWithMask[源代码]

别名 fastNLP.modules.AvgPoolWithMask fastNLP.modules.encoder.AvgPoolWithMask

给定形如[batch_size, max_len, hidden_size]的输入,在最后一维进行avg pooling. 输出为[batch_size, hidden_size], pooling 的时候只会考虑mask为1的位置

forward(tensor, mask, dim=1)[源代码]
参数:
  • tensor (torch.FloatTensor) -- [batch_size, seq_len, channels] 初始tensor
  • mask (torch.LongTensor) -- [batch_size, seq_len] 0/1的mask矩阵
  • dim (int) -- 需要进行max pooling的维度
返回:

class fastNLP.modules.encoder.MultiHeadAttention(input_size, key_size, value_size, num_head, dropout=0.1)[源代码]

别名 fastNLP.modules.MultiHeadAttention fastNLP.modules.encoder.MultiHeadAttention

Transformer当中的MultiHeadAttention

__init__(input_size, key_size, value_size, num_head, dropout=0.1)[源代码]
参数:
  • input_size -- int, 输入维度的大小。同时也是输出维度的大小。
  • key_size -- int, 每个head的维度大小。
  • value_size -- int,每个head中value的维度。
  • num_head -- int,head的数量。
  • dropout -- float。
forward(Q, K, V, atte_mask_out=None)[源代码]
参数:
  • Q -- [batch, seq_len_q, model_size]
  • K -- [batch, seq_len_k, model_size]
  • V -- [batch, seq_len_k, model_size]
  • seq_mask -- [batch, seq_len]
class fastNLP.modules.encoder.BiAttention[源代码]

别名 fastNLP.modules.BiAttention fastNLP.modules.encoder.BiAttention

Bi Attention module

对于给定的两个向量序列 \(a_i\)\(b_j\) , BiAttention模块将通过以下的公式来计算attention结果

\[\begin{split}\begin{array}{ll} \\ e_{ij} = {a}^{\mathrm{T}}_{i}{b}_{j} \\ {\hat{a}}_{i} = \sum_{j=1}^{\mathcal{l}_{b}}{\frac{\mathrm{exp}(e_{ij})}{\sum_{k=1}^{\mathcal{l}_{b}}{\mathrm{exp}(e_{ik})}}}{b}_{j} \\ {\hat{b}}_{j} = \sum_{i=1}^{\mathcal{l}_{a}}{\frac{\mathrm{exp}(e_{ij})}{\sum_{k=1}^{\mathcal{l}_{a}}{\mathrm{exp}(e_{ik})}}}{a}_{i} \\ \end{array}\end{split}\]
forward(premise_batch, premise_mask, hypothesis_batch, hypothesis_mask)[源代码]
参数:
  • premise_batch (torch.Tensor) -- [batch_size, a_seq_len, hidden_size]
  • premise_mask (torch.Tensor) -- [batch_size, a_seq_len]
  • hypothesis_batch (torch.Tensor) -- [batch_size, b_seq_len, hidden_size]
  • hypothesis_mask (torch.Tensor) -- [batch_size, b_seq_len]
返回:

torch.Tensor attended_premises: [batch_size, a_seq_len, hidden_size] torch.Tensor attended_hypotheses: [batch_size, b_seq_len, hidden_size]

class fastNLP.modules.encoder.SelfAttention(input_size, attention_unit=300, attention_hops=10, drop=0.5, initial_method=None)[源代码]

别名 fastNLP.modules.SelfAttention fastNLP.modules.encoder.SelfAttention

这是一个基于论文 A structured self-attentive sentence embedding 的Self Attention Module.

__init__(input_size, attention_unit=300, attention_hops=10, drop=0.5, initial_method=None)[源代码]
参数:
  • input_size (int) -- 输入tensor的hidden维度
  • attention_unit (int) -- 输出tensor的hidden维度
  • attention_hops (int) --
  • drop (float) -- dropout概率,默认值为0.5
  • initial_method (str) -- 初始化参数方法
forward(input, input_origin)[源代码]
参数:
  • input (torch.Tensor) -- [batch_size, seq_len, hidden_size] 要做attention的矩阵
  • input_origin (torch.Tensor) -- [batch_size, seq_len] 原始token的index组成的矩阵,含有pad部分内容
Return torch.Tensor output1:
 

[batch_size, multi-head, hidden_size] 经过attention操作后输入矩阵的结果

Return torch.Tensor output2:
 

[1] attention惩罚项,是一个标量

fastNLP.modules.utils
fastNLP.modules.utils.initial_parameter(net, initial_method=None)[源代码]

A method used to initialize the weights of PyTorch models.

参数:
  • net -- a PyTorch model
  • initial_method (str) --

    one of the following initializations.

    • xavier_uniform
    • xavier_normal (default)
    • kaiming_normal, or msra
    • kaiming_uniform
    • orthogonal
    • sparse
    • normal
    • uniform
fastNLP.modules.utils.summary(model: torch.nn.modules.module.Module)[源代码]

别名 fastNLP.modules.summary fastNLP.modules.utils.summary

得到模型的总参数量

Params model:Pytorch 模型
Return tuple:包含总参数量,可训练参数量,不可训练参数量

API变动列表

fitlog文档

您可以 点此 查看fitlog的文档。 fitlog 是由我们团队开发的日志记录+代码管理的工具。