fastNLP 中文文档¶
fastNLP 是一款轻量级的自然语言处理(NLP)工具包。你既可以用它来快速地完成一个NLP任务, 也可以用它在研究中快速构建更复杂的模型。
提示
如果你是从 readthedocs 访问的该文档,请跳转到我们的 最新网站
fastNLP具有如下的特性:
统一的Tabular式数据容器,简化数据预处理过程;
各种方便的NLP工具,例如Embedding加载(包括
ElmoEmbedding
和BertEmbedding
)、中间数据cache等;部分 数据集与预训练模型 的自动下载;
提供多种神经网络组件以及复现模型(涵盖中文分词、命名实体识别、句法分析、文本分类、文本匹配、指代消解、摘要等任务);
用户手册¶
安装指南¶
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在这个数据上训练一个分类网络。

步骤¶
一共有以下的几个步骤:
(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任务中,预处理一般包括:
将一整句话切分成汉字或者词;
将文本转换为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}}
PS: 使用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}}
PS: 基于词进行文本分类¶
由于汉字中没有显示的字与字的边界,一般需要通过分词器先将句子进行分词操作。 下面的例子演示了如何不基于fastNLP已有的数据读取、预处理代码进行文本分类。
(1) 读取数据¶
这里我们继续以之前的数据为例,但这次我们不使用fastNLP自带的数据读取代码
from fastNLP.io import ChnSentiCorpLoader
loader = ChnSentiCorpLoader() # 初始化一个中文情感分类的loader
data_dir = loader.download() # 这一行代码将自动下载数据到默认的缓存地址, 并将该地址返回
获取到的data_dir下应该有类似以下的文件
- chn_senti_corp
- train.tsv
- dev.tsv
- test.tsv
如果打开任何一个文件查看,会发现里面的格式均为
target raw_chars
1 这个宾馆比较陈旧了,特价的房间也很一般。总体来说一般
0 怀着十分激动的心情放映...
下面我们先定义一个read_file_to_dataset的函数, 即给定一个文件路径,读取其中的内容,并返回一个DataSet。然后我们将所有的DataSet放入到DataBundle对象中来方便接下来的预处理
import os
from fastNLP import DataSet, Instance
from fastNLP.io import DataBundle
def read_file_to_dataset(fp):
ds = DataSet()
with open(fp, 'r') as f:
f.readline() # 第一行是title名称,忽略掉
for line in f:
line = line.strip()
target, chars = line.split('\t')
ins = Instance(target=target, raw_chars=chars)
ds.append(ins)
return ds
data_bundle = DataBundle()
for name in ['train.tsv', 'dev.tsv', 'test.tsv']:
fp = os.path.join(data_dir, name)
ds = read_file_to_dataset(fp)
data_bundle.set_dataset(name=name.split('.')[0], dataset=ds)
print(data_bundle) # 查看以下数据集的情况
# In total 3 datasets:
# train has 9600 instances.
# dev has 1200 instances.
# test has 1200 instances.
(2) 数据预处理¶
在这里,我们首先把句子通过 fastHan 进行分词操作,然后创建词表,并将词语转换为序号。
from fastHan import FastHan
from fastNLP import Vocabulary
model=FastHan()
# model.set_device('cuda') # 可以注视掉这一行增加速度
# 定义分词处理操作
def word_seg(ins):
raw_chars = ins['raw_chars']
# 由于有些句子比较长,我们只截取前128个汉字
raw_words = model(raw_chars[:128], target='CWS')[0]
return raw_words
for name, ds in data_bundle.iter_datasets():
# apply函数将对内部的instance依次执行word_seg操作,并把其返回值放入到raw_words这个field
ds.apply(word_seg, new_field_name='raw_words')
# 除了apply函数,fastNLP还支持apply_field, apply_more(可同时创建多个field)等操作
# 同时我们增加一个seq_len的field
ds.add_seq_len('raw_words')
vocab = Vocabulary()
# 对raw_words列创建词表, 建议把非训练集的dataset放在no_create_entry_dataset参数中
# 也可以通过add_word(), add_word_lst()等建立词表,请参考http://www.fastnlp.top/docs/fastNLP/tutorials/tutorial_2_vocabulary.html
vocab.from_dataset(data_bundle.get_dataset('train'), field_name='raw_words',
no_create_entry_dataset=[data_bundle.get_dataset('dev'),
data_bundle.get_dataset('test')])
# 将建立好词表的Vocabulary用于对raw_words列建立词表,并把转为序号的列存入到words列
vocab.index_dataset(data_bundle.get_dataset('train'), data_bundle.get_dataset('dev'),
data_bundle.get_dataset('test'), field_name='raw_words', new_field_name='words')
# 建立target的词表,target的词表一般不需要padding和unknown
target_vocab = Vocabulary(padding=None, unknown=None)
# 一般情况下我们可以只用训练集建立target的词表
target_vocab.from_dataset(data_bundle.get_dataset('train'), field_name='target')
# 如果没有传递new_field_name, 则默认覆盖原词表
target_vocab.index_dataset(data_bundle.get_dataset('train'), data_bundle.get_dataset('dev'),
data_bundle.get_dataset('test'), field_name='target')
# 我们可以把词表保存到data_bundle中,方便之后使用
data_bundle.set_vocab(field_name='words', vocab=vocab)
data_bundle.set_vocab(field_name='target', vocab=target_vocab)
# 我们把words和target分别设置为input和target,这样它们才会在训练循环中被取出并自动padding, 有关这部分更多的内容参考
# http://www.fastnlp.top/docs/fastNLP/tutorials/tutorial_6_datasetiter.html
data_bundle.set_target('target')
data_bundle.set_input('words') # DataSet也有这两个接口
# 如果某些field,您希望它被设置为target或者input,但是不希望fastNLP自动padding或需要使用特定的padding方式,请参考
# http://www.fastnlp.top/docs/fastNLP/fastNLP.core.dataset.html
print(data_bundle.get_dataset('train')[:2]) # 我们可以看一下当前dataset的内容
# +--------+-----------------------+-----------------------+----------------------+
# | target | raw_chars | raw_words | words |
# +--------+-----------------------+-----------------------+----------------------+
# | 0 | 选择珠江花园的原因... | ['选择', '珠江', ... | [2, 3, 4, 5, 6, 7... |
# | 0 | 15.4寸笔记本的键盘... | ['15.4', '寸', '笔... | [71, 72, 73, 74, ... |
# +--------+-----------------------+-----------------------+----------------------+
# 由于之后需要使用之前定义的BiLSTMMaxPoolCls模型,所以需要将words这个field修改为chars
data_bundle.rename_field('words', 'chars')
我们可以打印一下vocab看一下当前的词表内容
print(data_bundle.get_vocab('chars'))
# Vocabulary([选择, 珠江, 花园, 的, 原因]...)
(3) 选择预训练词向量¶
这里我们选择腾讯的预训练中文词向量,可以在 腾讯词向量 处下载并解压。这里我们不能直接使用BERT,因为BERT是基于中文字进行预训练的。
下面我们使用 fastNLP.embeddings
加载该词向量,fastNLP会抽取vocabulary中包含的词的向量,并随机初始化不包含在文件中的词语的词向量。
from fastNLP.embeddings import StaticEmbedding
word2vec_embed = StaticEmbedding(data_bundle.get_vocab('chars'), model_dir_or_name='/path/to/Tencent_AILab_ChineseEmbedding.txt')
再之后的模型定义与训练过程与上面是一致的,这里就不再赘述了。
序列标注¶
这一部分的内容主要展示如何使用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 提供的各种 Loader
和 Pipe
来进行数据处理。
详细请参考这篇教程 使用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: ElmoEmbedding
和 BertEmbedding
。可自动下载的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: CNNCharEmbedding
和
LSTMCharEmbedding
。一般在使用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的其它说明¶
获取各种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
设置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的权重为不更新
各种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支持将 CNNCharEmbedding
与 StaticEmbedding
拼成一个 StackEmbedding
。如果通过这种方式使用,需要
在预处理文本时,不要将词汇小写化(因为Character Embedding需要利用词语中的大小写信息)且不要将出现频次低于某个阈值的word设置为unk(因为
Character embedding需要利用字形信息);但 StaticEmbedding
使用的某些预训练词嵌入的词汇表中只有小写的词
语, 且某些低频词并未在预训练中出现需要被剔除。即(1) character embedding需要保留大小写,而预训练词向量不需要保留大小写。(2)
character embedding需要保留所有的字形, 而static embedding需要设置一个最低阈值以学到更好的表示。
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。
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中主要在各个 Loader
和 Pipe
中被使用。
下面我们先介绍一下 Loader
和 Pipe
。
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
的子类作为数据预处理的类, Loader
和 Pipe
一般具备一一对应的关系,该关系可以从其名称判断,
例如 CWSLoader
与 CWSPipe
是一一对应的。一般情况下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 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,使用 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()
方法在预处理过程中还将训练、测试、验证 集的 words 、seq_lenfield
设定为input,同时将 targetfield
设定 为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的
field
在DataSetIter
迭代取出的batch_x 中,而is_target为true 的field
在DataSetIter
迭代取出的 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快速搭建自定义模型 。
- 评价指标
训练模型需要提供一个评价指标。这里使用准确率做为评价指标。
这里我们用
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()函数,返回负对数似然损失
下面提供了一个在分类问题中常用的交叉熵损失。注意它的 初始化参数 。
这里我们用
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()
方法在预处理过程中还将训练、测试、验证集 的 words 、seq_lenfield
设定为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的
field
在DataSetIter
迭代取出的 batch_x 中, 而 is_target为true的field
在DataSetIter
迭代取出的 batch_y 中。 具体分析见下面DataSetIter的介绍过程。- 评价指标
训练模型需要提供一个评价指标。这里使用准确率做为评价指标。
这里我们用
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
就可以了。 如果AutoPadder
或EngChar2DPadder
无法满足需求, 也可以自己写一个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
的详细文档。
名称 |
介绍 |
---|---|
自定义metrics需继承的基类 |
|
简单的正确率metric |
|
同时计算 F-measure, precision, recall 值的 metric |
|
|
用于抽取式QA任务 的metric |
更多的 metrics
正在被添加到 fastNLP 当中,敬请期待。
定义自己的metrics¶
在定义自己的metrics类时需继承 fastNLP 的 MetricBase
,
并覆盖写入 evaluate
和 get_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_dict
和 target_dict
中进行检查.
pred_dict
是模型当中 forward()
函数或者 predict()
函数的返回值.
target_dict
是DataSet当中的ground truth, 判定ground truth的条件是field的 is_target
被设置为True.
MetricBase
会进行以下的类型检测:
self.evaluate当中是否有 varargs, 这是不支持的.
self.evaluate当中所需要的参数是否既不在
pred_dict
也不在target_dict
.self.evaluate当中所需要的参数是否既在
pred_dict
也在target_dict
.
除此以外,在参数被传入self.evaluate以前,这个函数会检测 pred_dict
和 target_dict
当中没有被用到的参数
如果kwargs是self.evaluate的参数,则不会检测
self.evaluate将计算一个批次(batch)的评价指标,并累计。 没有返回值 self.get_metric将统计当前的评价指标并返回评价结果, 返回值需要是一个dict, key是指标名称,value是指标的值
使用Modules和Models快速搭建自定义模型¶
modules
和 models
用于构建 fastNLP 所需的神经网络模型,它可以和 torch.nn 中的模型一起使用。
下面我们会分三节介绍编写构建模型的具体方法。
使用 models 中的模型¶
fastNLP 在 models
模块中内置了如 CNNText
、
SeqLabeling
等完整的模型,以供用户直接使用。
以文本分类的任务为例,我们从 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:
名称 |
介绍 |
---|---|
使用 CNN 进行文本分类的模型 |
|
简单的序列标注模型 |
|
更大网络结构的序列标注模型 |
|
ESIM 模型的实现 |
|
带 word-embedding的Star-Transformer模 型 |
|
用于序列标注的 Star-Transformer 模型 |
|
用于自然语言推断 (NLI) 的 Star-Transformer 模型 |
|
用于分类任务的 Star-Transformer 模型 |
|
Biaffine 依存句法分析网络的实现 |
|
|
使用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 进行了解。
名称 |
介绍 |
|
---|---|---|
char级别的卷积 encoder |
||
char级别基于LSTM的 encoder |
||
结合了Convolution和Max-Pooling于一体的模块 |
||
LSTM模块 |
轻量封装了PyTorch的LSTM |
|
Star-Transformer 的encoder部分 |
||
Transformer的encoder模块,不包含embedding层 |
||
Variational Dropout RNN 模块 |
||
Variational Dropout LSTM 模块 |
||
Variational Dropout GRU 模块 |
||
Max-pooling模块 |
||
带mask矩阵的max pooling。在做 max-pooling的时候不会考虑mask值为0的位置。 |
||
Average-pooling模块 |
||
带mask矩阵的average pooling。在做 average-pooling的时候不会考虑mask值为0的位置。 |
||
MultiHead Attention 模块 |
||
简单的多层感知器模块 |
||
条件随机场模块 |
||
给定一个特征矩阵以及转移分数矩阵,计算出最佳的路径以及对应的分数 (与 |
||
给定一个id到label的映射表,返回所有可以跳转的列表(与 |
||
简单包装过的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。
创建 Callback
要自定义 Callback,我们要实现一个类,继承
Callback
。这里我们定义MyCallBack
,继承 fastNLP.Callback 。指定 Callback 调用的阶段
Callback 中所有以 on_ 开头的类方法会在 Trainer 的训练中在特定阶段调用。 如 on_train_begin() 会在训练开始时被调用,on_epoch_end() 会在每个 epoch 结束时调用。 具体有哪些类方法,参见
Callback
文档。这里, MyCallBack 在求得loss时调用 on_backward_begin() 记录 当前 loss,在每一个 epoch 结束时调用 on_epoch_end() ,求当前 epoch 平均loss并输出。使用 Callback 的属性访问 Trainer 的内部信息
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_rank
和local_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_size
和rank
,具体可以参考
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%。这一问题是由进程失去同步导致的。这时只能手动kill
GPU上残留的进程,再检查代码。需要检查进程同步的位置,比如模型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
。
我们在浏览器中打开网页,可以看到如下的统计表格:

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

更多的教程还在编写中,敬请期待~
API 文档¶
除了用户手册之外,你还可以通过查阅 API 文档来找到你所需要的工具。
fastNLP¶
fastNLP 由 core
、 io
、embeddings
、 modules
、
models
等子模块组成,你可以查看每个模块的文档。
core
是fastNLP 的核心模块,包括 DataSet、 Trainer、 Tester 等组件。详见文档fastNLP.core
io
是实现输入输出的模块,包括了数据集的读取,模型的存取等功能。详见文档fastNLP.io
embeddings
提供用于构建复杂网络模型所需的各种embedding。详见文档fastNLP.embeddings
modules
包含了用于搭建神经网络模型的诸多组件,可以帮助用户快速搭建自己所需的网络。详见文档fastNLP.modules
models
包含了一些使用 fastNLP 实现的完整网络模型,包括CNNText
、SeqLabeling
等常见模型。详见文档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))})
-
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.DataSetIter
fastNLP.core.batch.DataSetIter
- DataSetIter 用于从 DataSet 中按一定的顺序, 依次按
batch_size
的大小将数据取出,通过使用DataSetIter,可以不需要考虑 输入的padding(由DataSet中每列的Padder决定了)以及不需要考虑将数据转为tensor。
组成 x 和 y:
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会被忽略。
-
property
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这么多,是否就丢掉。
- 返回
- DataSetIter 用于从 DataSet 中按一定的顺序, 依次按
-
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属性。
-
static
get_num_batches
(num_samples, batch_size, drop_last)[源代码]¶ 计算batch的数量。用于前端显示进度
- 参数
num_samples (int) --
batch_size (int) --
drop_last (bool) -- 如果最后一个batch没有batch_size这么多,是否就丢掉。
- 返回
-
property
dataset
¶ 获取正在参与iterate的dataset
- 返回
-
static
-
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.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会被忽略。
-
property
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
用于构建, 存储和使用 str 到 int 的一一映射:
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>'
-
update
(word_lst, no_create_entry=False)[源代码]¶ 依次增加序列中词在词典中的出现频率
- 参数
word_lst (list) -- a list of strings
no_create_entry (bool) -- 如果词语来自于非训练集建议设置为True。在使用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, no_create_entry=False)[源代码]¶ 增加一个新词在词典中的出现频率
- 参数
word (str) -- 新词
no_create_entry (bool) -- 如果词语来自于非训练集建议设置为True。在使用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) -- 如果词语来自于非训练集建议设置为True。在使用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) -- 如果词语来自于非训练集建议设置为True。在使用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的。
-
has_word
(w)[源代码]¶ 检查词是否被记录:
has_abc = vocab.has_word('abc') # equals to has_abc = 'abc' in vocab
- 参数
item -- the word
- 返回
True
orFalse
-
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')
-
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')
- 参数
field_name (str,List[str]) -- 可为
str
或List[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
-
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
-
property
unknown_idx
¶ unknown 对应的数字.
-
property
padding_idx
¶ padding 对应的数字
-
-
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
。
-
print_field_meta
()[源代码]¶ 输出当前field的meta信息, 形似下列的输出:
+-------------+-------+-------+ | field_names | x | y | +=============+=======+=======+ | is_input | True | False | | is_target | False | False | | ignore_type | False | | | pad_value | 0 | | +-------------+-------+-------+
str field_names: DataSet中field的名称 bool is_input: field是否为input bool is_target: field是否为target bool ignore_type: 是否忽略该field的type, 一般仅在该field至少为input或target时才有意义 int pad_value: 该field的pad的值,仅在该field为input或target时有意义 :return:
-
append
(instance)[源代码]¶ 将一个instance对象append到DataSet后面。
- 参数
instance (Instance) -- 若DataSet不为空,则instance应该拥有和DataSet完全一样的field。
-
add_fieldarray
(field_name, fieldarray)[源代码]¶ 将fieldarray添加到DataSet中.
- 参数
field_name (str) -- 新加入的field的名称
fieldarray (FieldArray) -- 需要加入DataSet的field的内容
- 返回
-
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的类型检查
-
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
-
has_field
(field_name)[源代码]¶ 判断DataSet中是否有名为field_name这个field
- 参数
field_name (str) -- field的名称
- Return bool
表示是否有名为field_name这个field
-
rename_field
(field_name, new_field_name)[源代码]¶ 将某个field重新命名.
- 参数
field_name (str) -- 原来的field名称。
new_field_name (str) -- 修改为new_name。
-
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该列是否所有数据都是同样的维度,同样的类型。将直接使用第一 行的数据进行类型和维度推断本列的数据的类型和维度。
-
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_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_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_pad_val
(field_name, pad_val)[源代码]¶ 为某个field设置对应的pad_val.
- 参数
field_name (str) -- 修改该field的pad_val
pad_val (int) -- 该field的padder会以pad_val作为padding index
-
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
is_input: bool, 如果为True则将名为 new_field_name 的field设置为input
is_target: bool, 如果为True则将名为 new_field_name 的field设置为target
ignore_type: bool, 如果为True则将名为 new_field_name 的field的ignore_type设置为true, 忽略其类型
use_tqdm: bool, 是否使用tqdm显示预处理进度
tqdm_desc: str, 当use_tqdm为True时,可以显示当前tqdm正在处理的名称
- 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_more
与apply_field
的区别参考apply_more()
中关于apply_more
与apply
区别的介绍。- 参数
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
is_input: bool, 如果为True则将被修改的field设置为input
is_target: bool, 如果为True则将被修改的field设置为target
ignore_type: bool, 如果为True则将被修改的field的ignore_type设置为true, 忽略其类型
use_tqdm: bool, 是否使用tqdm显示预处理进度
tqdm_desc: str, 当use_tqdm为True时,可以显示当前tqdm正在处理的名称
- Return Dict[str:Field]
返回一个字典
-
apply_more
(func, modify_fields=True, **kwargs)[源代码]¶ 将
DataSet
中每个Instance
传入到func中,并获取它的返回值。func可以返回一个或多个 field 上的结果。注解
apply_more
与apply
的区别:apply_more
可以返回多个 field 的结果,apply
只可以返回一个field 的结果;apply_more
的返回值是一个字典,每个 key-value 对中的 key 表示 field 的名字,value 表示计算结果;apply_more
默认修改DataSet
中的 field ,apply
默认不修改。
- 参数
func (callable) -- 参数是
DataSet
中的Instance
,返回值是一个字典,key 是field 的名字,value 是对应的结果modify_fields (bool) -- 是否用结果修改
DataSet
中的Field
, 默认为 Truekwargs (optional) --
支持输入is_input,is_target,ignore_type
is_input: bool, 如果为True则将被修改的的field设置为input
is_target: bool, 如果为True则将被修改的的field设置为target
ignore_type: bool, 如果为True则将被修改的的field的ignore_type设置为true, 忽略其类型
use_tqdm: bool, 是否使用tqdm显示预处理进度
tqdm_desc: str, 当use_tqdm为True时,可以显示当前tqdm正在处理的名称
- Return Dict[str: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
is_input: bool, 如果为True则将 new_field_name 的field设置为input
is_target: bool, 如果为True则将 new_field_name 的field设置为target
ignore_type: bool, 如果为True则将 new_field_name 的field的ignore_type设置为true, 忽略其类型
use_tqdm: bool, 是否使用tqdm显示预处理进度
tqdm_desc: str, 当use_tqdm为True时,可以显示当前tqdm正在处理的名称
- Return List[Any]
里面的元素为func的返回值,所以list长度为DataSet的长度
-
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
- 返回
-
drop
(func, inplace=True)[源代码]¶ func接受一个Instance,返回bool值。返回值为True时,该Instance会被移除或者不会包含在返回的DataSet中。
- 参数
func (callable) -- 接受一个Instance作为参数,返回bool值。为True时删除该instance
inplace (bool) -- 是否在当前DataSet中直接删除instance;如果为False,将返回一个新的DataSet。
- 返回
DataSet
-
split
(ratio, shuffle=True)[源代码]¶ 将DataSet按照ratio的比例拆分,返回两个DataSet
- 参数
ratio (float) -- 0<ratio<1, 返回的第一个DataSet拥有 (1-ratio) 这么多数据,第二个DataSet拥有`ratio`这么多数据
shuffle (bool) -- 在split前是否shuffle一下
- 返回
[
读取后的DataSet
,读取后的DataSet
]
-
static
load
(path)[源代码]¶ 从保存的DataSet pickle文件的路径中读取DataSet
- 参数
path (str) -- 从哪里读取DataSet
- 返回
读取后的
读取后的DataSet
。
-
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。
-
delete_collate_fn
(name=None)[源代码]¶ 删除某个collate_fn
- 参数
name (str,int) -- 如果为None,则删除最近加入的collate_fn
- 返回
-
concat
(dataset, inplace=True, field_mapping=None)[源代码]¶ - 将当前dataset与输入的dataset结合成一个更大的dataset,需要保证两个dataset都包含了相同的field。结合后的dataset的input,target
以及collate_fn以当前dataset为准。当dataset中包含的field多于当前的dataset,则多余的field会被忽略;若dataset中未包含所有 当前dataset含有field,则会报错。
- 参数
dataset (DataSet,) -- 需要和当前dataset concat的dataset
inplace (bool,) -- 是否直接将dataset组合到当前dataset中
field_mapping (dict,) -- 当dataset中的field名称和当前dataset不一致时,需要通过field_mapping把输入的dataset中的field 名称映射到当前field. field_mapping为dict类型,key为dataset中的field名称,value是需要映射成的名称
- 返回
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)
-
INPUT
= 'words'¶
-
CHAR_INPUT
= 'chars'¶
-
INPUT_LEN
= 'seq_len'¶
-
OUTPUT
= 'pred'¶
-
TARGET
= 'target'¶
-
LOSS
= 'loss'¶
-
RAW_WORD
= 'raw_words'¶
-
RAW_CHAR
= 'raw_chars'¶
-
__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, fp16=False, **kwargs)[源代码]¶ 别名
fastNLP.Trainer
fastNLP.core.trainer.Trainer
- Trainer在fastNLP中用于组织单任务的训练过程,可以避免用户在不同训练任务中重复撰写
epoch循环;
将数据分成不同的Batch;
对Batch进行pad;
每个epoch结束或一定step后进行验证集验证;
保存获得更好验证性能的模型等。
详细的介绍参见
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, fp16=False, **kwargs)[源代码]¶ - 参数
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中;
torch.device:将模型装载到torch.device上。
int: 将使用device_id为该值的gpu进行训练
list(int):如果多于1个device,将使用torch.nn.DataParallel包裹model, 并使用传入的device。
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。
fp16 (bool) -- 是否使用fp16进行训练。
kwargs --
支持配置可选参数 bool test_use_tqdm: 在dev上验证的时候是否开启tqdm Sampler test_sampler: 在evaluate的时候使用的sampler bool test_use_fp16: evalute的时候是否使用fp16测试,默认与fp16相同的取值。 bool set_grad_to_none: 在zero_grad的时候是否将gradient设置为None,而不是设置为zero GradScaler grad_scaler: 仅在fp16为True时有效,如果不使用torch.cuda.amp.GradScaler的初始化参数,可传入一个已经初始化后的
grad_scaler。
bool pin_memory: 是否将产生的tensor使用pin memory, 可能会加快数据速度。
-
train
(load_best_model=True, on_exception='auto', **kwargs)[源代码]¶ 使用该函数使Trainer开始训练。
- param bool load_best_model
该参数只有在初始化提供了dev_data的情况下有效,如果True, trainer将在返回之前重新加载dev表现 最好的模型参数。
- param str on_exception
在训练过程遭遇exception,并被 :py:class:Callback 的on_exception()处理后,是否继续抛出异常。 支持'ignore','raise', 'auto': 'ignore'将捕获异常,写在Trainer.train()后面的代码将继续运行; 'raise'将异常抛出; 'auto'将ignore以下两种Exception: CallbackException与KeyboardInterrupt, raise其它exception.
- 参数
kwargs --
int verbose: 为1时在发生异常时会打印异常发生时batch中的数据在dataset中的index
- 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)更新取得的最佳值
-
property
is_master
¶ 是否是主进程
-
class
fastNLP.
Tester
(data, model, metrics, batch_size=16, num_workers=0, device=None, verbose=1, use_tqdm=True, fp16=False, **kwargs)[源代码]¶ 别名
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, fp16=False, **kwargs)[源代码]¶ - 参数
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不对模型 的计算位置进行管理。支持以下的输入:
str: ['cpu', 'cuda', 'cuda:0', 'cuda:1', ...] 依次为'cpu'中, 可见的第一个GPU中,可见的第一个GPU中,可见的第二个GPU中;
torch.device:将模型装载到torch.device上。
int: 将使用device_id为该值的gpu进行训练
list(int):如果多于1个device,将使用torch.nn.DataParallel包裹model, 并使用传入的device。
None. 为None则不对模型进行任何处理,如果传入的model为torch.nn.DataParallel该值必须为None。
如果模型是通过predict()进行预测的话,那么将不能使用多卡(DataParallel)进行验证,只会使用第一张卡上的模型。
verbose (int) -- 如果为0不输出任何信息; 如果为1,打印出验证结果。
use_tqdm (bool) -- 是否使用tqdm来显示测试进度; 如果为False,则不会显示任何内容。
fp16 (bool) -- 是否使用float16进行验证
kwargs -- Sampler sampler: 支持传入sampler控制测试顺序 bool pin_memory: 是否将产生的tensor使用pin memory, 可能会加快数据速度。
-
-
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=False, use_tqdm=True, sampler=None, **kwargs)[源代码]¶ 别名
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=False, use_tqdm=True, sampler=None, **kwargs)[源代码]¶ - 参数
train_data -- 训练集,
DataSet
类型。DDP 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 (bool) -- 指定是否使用半精度训练。
use_tqdm (bool) -- 是否使用tqdm来显示训练进度; 如果为False,则将loss打印在终端中。
sampler (Sampler) -- 使用的sampler,如果不指定,默认使用的DistributedSampler。使用这个参数的情况一般为,明确修改了每个 rank的Dataset,使得每个rank上的dataset虽然sample数量一样多,但是sample其实不一样。
kwargs --
支持配置可选参数 bool test_use_tqdm: 在dev上验证的时候是否开启tqdm Sampler test_sampler: 在evaluate的时候使用的sampler int dev_batch_size: 在evaluate时,使用的evaluate的batch大小 bool test_use_fp16: test时使用fp16 bool set_grad_to_none: zero_grad时将grad设为None而不是0 GradScaler grad_scaler: 自定义的梯度 scaler bool pin_memory: 是否将产生的tensor使用pin memory, 可能会加快数据速度。一般在tensor较多或tensor维度较大时,有速度增益。 bool find_unused_parameters: 在将model转化为DistributedDataParallel类型的时候,需要填入该参数,除非model内确实有
forward没用上的参数,否则应该不需要用到该参数。
-
property
is_master
¶ 是否是主进程
-
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必须继承自这个类-
property
trainer
¶ 该属性可以通过self.trainer获取到,一般情况下不需要使用这个属性。
-
property
grad_scaler
¶ float16的gradient scaler
-
property
auto_cast
¶ float16用的auto cast环境
-
property
step
¶ 当前运行到的step, 范围为[1, self.n_steps+1)
-
property
n_steps
¶ Trainer一共会采多少个batch。当Trainer中update_every设置为非1的值时,该值不等于update的次数
-
property
batch_size
¶ train和evaluate时的batch_size为多大
-
property
epoch
¶ 当前运行的epoch数,范围是[1, self.n_epochs+1)
-
property
n_epochs
¶ 一共会运行多少个epoch
-
property
optimizer
¶ 初始化Trainer时传递的Optimizer
-
property
model
¶ 正在被Trainer训练的模型
-
property
pbar
¶ 如果在Callback中需要打印内容,请使用self.pbar.write(str)。否则可能出现命令行显示效果不太好的问题。在 on_train_begin(), on_train_end(), on_exception()中请不要使用该属性,通过print输出即可。
-
property
update_every
¶ Trainer中的模型多少次反向传播才进行一次梯度更新,在Trainer初始化时传入的。
-
property
batch_per_epoch
¶ 每个epoch一共有多少个batch,只有在on_epoch_begin之后才能调用该属性。
-
on_batch_begin
(batch_x, batch_y, indices)[源代码]¶ 每次采集到一个batch的数据则调用一次。这里对batch_x或batch_y删除添加内容是可以影响到Trainer中内容的。所以在这一步 可以进行一些负采样之类的操作。batch_x和batch_y中的tensor已经被放置到了模型所在的设备上。
- 参数
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_loss_begin
(batch_y, predict_y)[源代码]¶ 在计算loss前调用,即这里修改batch_y或predict_y的值是可以影响到loss计算的。
- 参数
batch_y (dict) -- 在DataSet中被设置为target的field的batch集合。
predict_y (dict) -- 模型的forward()返回的结果。
- 返回
-
on_backward_begin
(loss)[源代码]¶ 在loss得到之后,但在反向传播之前。可能可以进行loss是否为NaN的检查。
- 参数
loss (torch.Tensor) -- 计算得到的loss值
- 返回
-
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结果是否比之前的好。
- 返回
-
property
-
class
fastNLP.
GradientClipCallback
(parameters=None, clip_value=1, clip_type='norm')[源代码]¶ -
别名
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.
-
property
auto_cast
¶ float16用的auto cast环境
-
property
batch_per_epoch
¶ 每个epoch一共有多少个batch,只有在on_epoch_begin之后才能调用该属性。
-
property
batch_size
¶ train和evaluate时的batch_size为多大
-
property
epoch
¶ 当前运行的epoch数,范围是[1, self.n_epochs+1)
-
property
grad_scaler
¶ float16的gradient scaler
-
property
model
¶ 正在被Trainer训练的模型
-
property
n_epochs
¶ 一共会运行多少个epoch
-
property
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和batch_y中的tensor已经被放置到了模型所在的设备上。
- 参数
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结果是否比之前的好。
- 返回
-
property
optimizer
¶ 初始化Trainer时传递的Optimizer
-
property
pbar
¶ 如果在Callback中需要打印内容,请使用self.pbar.write(str)。否则可能出现命令行显示效果不太好的问题。在 on_train_begin(), on_train_end(), on_exception()中请不要使用该属性,通过print输出即可。
-
property
step
¶ 当前运行到的step, 范围为[1, self.n_steps+1)
-
property
trainer
¶ 该属性可以通过self.trainer获取到,一般情况下不需要使用这个属性。
-
property
update_every
¶ Trainer中的模型多少次反向传播才进行一次梯度更新,在Trainer初始化时传入的。
-
-
class
fastNLP.
EarlyStopCallback
(patience)[源代码]¶ -
别名
fastNLP.EarlyStopCallback
fastNLP.core.callback.EarlyStopCallback
多少个epoch没有变好就停止训练,相关类
EarlyStopError
-
property
auto_cast
¶ float16用的auto cast环境
-
property
batch_per_epoch
¶ 每个epoch一共有多少个batch,只有在on_epoch_begin之后才能调用该属性。
-
property
batch_size
¶ train和evaluate时的batch_size为多大
-
property
epoch
¶ 当前运行的epoch数,范围是[1, self.n_epochs+1)
-
property
grad_scaler
¶ float16的gradient scaler
-
property
model
¶ 正在被Trainer训练的模型
-
property
n_epochs
¶ 一共会运行多少个epoch
-
property
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和batch_y中的tensor已经被放置到了模型所在的设备上。
- 参数
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中设置了验证,则发生验证前会调用该函数
- 返回
-
property
optimizer
¶ 初始化Trainer时传递的Optimizer
-
property
pbar
¶ 如果在Callback中需要打印内容,请使用self.pbar.write(str)。否则可能出现命令行显示效果不太好的问题。在 on_train_begin(), on_train_end(), on_exception()中请不要使用该属性,通过print输出即可。
-
property
step
¶ 当前运行到的step, 范围为[1, self.n_steps+1)
-
property
trainer
¶ 该属性可以通过self.trainer获取到,一般情况下不需要使用这个属性。
-
property
update_every
¶ Trainer中的模型多少次反向传播才进行一次梯度更新,在Trainer初始化时传入的。
-
property
-
class
fastNLP.
FitlogCallback
(data=None, tester=None, log_loss_every=0, verbose=1, log_exception=False)[源代码]¶ -
别名
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=1, 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信息
-
property
auto_cast
¶ float16用的auto cast环境
-
property
batch_per_epoch
¶ 每个epoch一共有多少个batch,只有在on_epoch_begin之后才能调用该属性。
-
property
batch_size
¶ train和evaluate时的batch_size为多大
-
property
epoch
¶ 当前运行的epoch数,范围是[1, self.n_epochs+1)
-
property
grad_scaler
¶ float16的gradient scaler
-
property
model
¶ 正在被Trainer训练的模型
-
property
n_epochs
¶ 一共会运行多少个epoch
-
property
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和batch_y中的tensor已经被放置到了模型所在的设备上。
- 参数
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中设置了验证,则发生验证前会调用该函数
- 返回
-
property
optimizer
¶ 初始化Trainer时传递的Optimizer
-
property
pbar
¶ 如果在Callback中需要打印内容,请使用self.pbar.write(str)。否则可能出现命令行显示效果不太好的问题。在 on_train_begin(), on_train_end(), on_exception()中请不要使用该属性,通过print输出即可。
-
property
step
¶ 当前运行到的step, 范围为[1, self.n_steps+1)
-
property
trainer
¶ 该属性可以通过self.trainer获取到,一般情况下不需要使用这个属性。
-
property
update_every
¶ Trainer中的模型多少次反向传播才进行一次梯度更新,在Trainer初始化时传入的。
-
-
class
fastNLP.
EvaluateCallback
(data=None, tester=None)[源代码]¶ -
别名
fastNLP.EvaluateCallback
fastNLP.core.callback.EvaluateCallback
通过使用该Callback可以使得Trainer在evaluate dev之外还可以evaluate其它数据集,比如测试集。每一次验证dev之前都会先验证EvaluateCallback 中的数据。
-
property
auto_cast
¶ float16用的auto cast环境
-
property
batch_per_epoch
¶ 每个epoch一共有多少个batch,只有在on_epoch_begin之后才能调用该属性。
-
property
batch_size
¶ train和evaluate时的batch_size为多大
-
property
epoch
¶ 当前运行的epoch数,范围是[1, self.n_epochs+1)
-
property
grad_scaler
¶ float16的gradient scaler
-
property
model
¶ 正在被Trainer训练的模型
-
property
n_epochs
¶ 一共会运行多少个epoch
-
property
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和batch_y中的tensor已经被放置到了模型所在的设备上。
- 参数
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中设置了验证,则发生验证前会调用该函数
- 返回
-
property
optimizer
¶ 初始化Trainer时传递的Optimizer
-
property
pbar
¶ 如果在Callback中需要打印内容,请使用self.pbar.write(str)。否则可能出现命令行显示效果不太好的问题。在 on_train_begin(), on_train_end(), on_exception()中请不要使用该属性,通过print输出即可。
-
property
step
¶ 当前运行到的step, 范围为[1, self.n_steps+1)
-
property
trainer
¶ 该属性可以通过self.trainer获取到,一般情况下不需要使用这个属性。
-
property
update_every
¶ Trainer中的模型多少次反向传播才进行一次梯度更新,在Trainer初始化时传入的。
-
property
-
class
fastNLP.
LRScheduler
(lr_scheduler)[源代码]¶ -
别名
fastNLP.LRScheduler
fastNLP.core.callback.LRScheduler
对PyTorch LR Scheduler的包装以使得其可以被Trainer所使用
-
__init__
(lr_scheduler)[源代码]¶ - 参数
lr_scheduler (torch.optim.lr_scheduler._LRScheduler) -- PyTorch的lr_scheduler
-
property
auto_cast
¶ float16用的auto cast环境
-
property
batch_per_epoch
¶ 每个epoch一共有多少个batch,只有在on_epoch_begin之后才能调用该属性。
-
property
batch_size
¶ train和evaluate时的batch_size为多大
-
property
epoch
¶ 当前运行的epoch数,范围是[1, self.n_epochs+1)
-
property
grad_scaler
¶ float16的gradient scaler
-
property
model
¶ 正在被Trainer训练的模型
-
property
n_epochs
¶ 一共会运行多少个epoch
-
property
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和batch_y中的tensor已经被放置到了模型所在的设备上。
- 参数
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结果是否比之前的好。
- 返回
-
property
optimizer
¶ 初始化Trainer时传递的Optimizer
-
property
pbar
¶ 如果在Callback中需要打印内容,请使用self.pbar.write(str)。否则可能出现命令行显示效果不太好的问题。在 on_train_begin(), on_train_end(), on_exception()中请不要使用该属性,通过print输出即可。
-
property
step
¶ 当前运行到的step, 范围为[1, self.n_steps+1)
-
property
trainer
¶ 该属性可以通过self.trainer获取到,一般情况下不需要使用这个属性。
-
property
update_every
¶ Trainer中的模型多少次反向传播才进行一次梯度更新,在Trainer初始化时传入的。
-
-
class
fastNLP.
ControlC
(quit_and_do, action=<staticmethod object>)[源代码]¶ -
别名
fastNLP.ControlC
fastNLP.core.callback.ControlC
检测到 control+C 时的反馈
-
__init__
(quit_and_do, action=<staticmethod object>)[源代码]¶ - 参数
quit_and_do (bool) -- 若为True,则检测到control+C 进行后续操作(默认值为:直接退出程序);否则只退出Trainer。
-
property
auto_cast
¶ float16用的auto cast环境
-
property
batch_per_epoch
¶ 每个epoch一共有多少个batch,只有在on_epoch_begin之后才能调用该属性。
-
property
batch_size
¶ train和evaluate时的batch_size为多大
-
property
epoch
¶ 当前运行的epoch数,范围是[1, self.n_epochs+1)
-
property
grad_scaler
¶ float16的gradient scaler
-
property
model
¶ 正在被Trainer训练的模型
-
property
n_epochs
¶ 一共会运行多少个epoch
-
property
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和batch_y中的tensor已经被放置到了模型所在的设备上。
- 参数
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结果是否比之前的好。
- 返回
-
property
optimizer
¶ 初始化Trainer时传递的Optimizer
-
property
pbar
¶ 如果在Callback中需要打印内容,请使用self.pbar.write(str)。否则可能出现命令行显示效果不太好的问题。在 on_train_begin(), on_train_end(), on_exception()中请不要使用该属性,通过print输出即可。
-
property
step
¶ 当前运行到的step, 范围为[1, self.n_steps+1)
-
property
trainer
¶ 该属性可以通过self.trainer获取到,一般情况下不需要使用这个属性。
-
property
update_every
¶ Trainer中的模型多少次反向传播才进行一次梯度更新,在Trainer初始化时传入的。
-
-
class
fastNLP.
LRFinder
(start_lr=1e-06, end_lr=10)[源代码]¶ -
别名
fastNLP.LRFinder
fastNLP.core.callback.LRFinder
用第一个 epoch 找最佳的学习率,从第二个epoch开始应用它
-
property
auto_cast
¶ float16用的auto cast环境
-
property
batch_per_epoch
¶ 每个epoch一共有多少个batch,只有在on_epoch_begin之后才能调用该属性。
-
property
batch_size
¶ train和evaluate时的batch_size为多大
-
property
epoch
¶ 当前运行的epoch数,范围是[1, self.n_epochs+1)
-
property
grad_scaler
¶ float16的gradient scaler
-
property
model
¶ 正在被Trainer训练的模型
-
property
n_epochs
¶ 一共会运行多少个epoch
-
property
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和batch_y中的tensor已经被放置到了模型所在的设备上。
- 参数
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结果是否比之前的好。
- 返回
-
property
optimizer
¶ 初始化Trainer时传递的Optimizer
-
property
pbar
¶ 如果在Callback中需要打印内容,请使用self.pbar.write(str)。否则可能出现命令行显示效果不太好的问题。在 on_train_begin(), on_train_end(), on_exception()中请不要使用该属性,通过print输出即可。
-
property
step
¶ 当前运行到的step, 范围为[1, self.n_steps+1)
-
property
trainer
¶ 该属性可以通过self.trainer获取到,一般情况下不需要使用这个属性。
-
property
update_every
¶ Trainer中的模型多少次反向传播才进行一次梯度更新,在Trainer初始化时传入的。
-
property
-
class
fastNLP.
TensorboardCallback
(*options)[源代码]¶ -
别名
fastNLP.TensorboardCallback
fastNLP.core.callback.TensorboardCallback
接受以下一个或多个字符串作为参数: - "model" - "loss" - "metric"
警告
fastNLP 已停止对此功能的维护,请等待 fastNLP 兼容 PyTorch1.1 的下一个版本。 或者使用和 fastNLP 高度配合的 fitlog(参见 使用fitlog 辅助 fastNLP 进行科研 )。
-
property
auto_cast
¶ float16用的auto cast环境
-
property
batch_per_epoch
¶ 每个epoch一共有多少个batch,只有在on_epoch_begin之后才能调用该属性。
-
property
batch_size
¶ train和evaluate时的batch_size为多大
-
property
epoch
¶ 当前运行的epoch数,范围是[1, self.n_epochs+1)
-
property
grad_scaler
¶ float16的gradient scaler
-
property
model
¶ 正在被Trainer训练的模型
-
property
n_epochs
¶ 一共会运行多少个epoch
-
property
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中设置了验证,则发生验证前会调用该函数
- 返回
-
property
optimizer
¶ 初始化Trainer时传递的Optimizer
-
property
pbar
¶ 如果在Callback中需要打印内容,请使用self.pbar.write(str)。否则可能出现命令行显示效果不太好的问题。在 on_train_begin(), on_train_end(), on_exception()中请不要使用该属性,通过print输出即可。
-
property
step
¶ 当前运行到的step, 范围为[1, self.n_steps+1)
-
property
trainer
¶ 该属性可以通过self.trainer获取到,一般情况下不需要使用这个属性。
-
property
update_every
¶ Trainer中的模型多少次反向传播才进行一次梯度更新,在Trainer初始化时传入的。
-
property
-
class
fastNLP.
WarmupCallback
(warmup=0.1, schedule='constant')[源代码]¶ -
别名
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.
-
property
auto_cast
¶ float16用的auto cast环境
-
property
batch_per_epoch
¶ 每个epoch一共有多少个batch,只有在on_epoch_begin之后才能调用该属性。
-
property
batch_size
¶ train和evaluate时的batch_size为多大
-
property
epoch
¶ 当前运行的epoch数,范围是[1, self.n_epochs+1)
-
property
grad_scaler
¶ float16的gradient scaler
-
property
model
¶ 正在被Trainer训练的模型
-
property
n_epochs
¶ 一共会运行多少个epoch
-
property
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和batch_y中的tensor已经被放置到了模型所在的设备上。
- 参数
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结果是否比之前的好。
- 返回
-
property
optimizer
¶ 初始化Trainer时传递的Optimizer
-
property
pbar
¶ 如果在Callback中需要打印内容,请使用self.pbar.write(str)。否则可能出现命令行显示效果不太好的问题。在 on_train_begin(), on_train_end(), on_exception()中请不要使用该属性,通过print输出即可。
-
property
step
¶ 当前运行到的step, 范围为[1, self.n_steps+1)
-
property
trainer
¶ 该属性可以通过self.trainer获取到,一般情况下不需要使用这个属性。
-
property
update_every
¶ Trainer中的模型多少次反向传播才进行一次梯度更新,在Trainer初始化时传入的。
-
-
class
fastNLP.
SaveModelCallback
(save_dir, top=3, only_param=False, save_on_exception=False)[源代码]¶ -
别名
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}.
-
property
auto_cast
¶ float16用的auto cast环境
-
property
batch_per_epoch
¶ 每个epoch一共有多少个batch,只有在on_epoch_begin之后才能调用该属性。
-
property
batch_size
¶ train和evaluate时的batch_size为多大
-
property
epoch
¶ 当前运行的epoch数,范围是[1, self.n_epochs+1)
-
property
grad_scaler
¶ float16的gradient scaler
-
property
model
¶ 正在被Trainer训练的模型
-
property
n_epochs
¶ 一共会运行多少个epoch
-
property
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和batch_y中的tensor已经被放置到了模型所在的设备上。
- 参数
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中设置了验证,则发生验证前会调用该函数
- 返回
-
property
optimizer
¶ 初始化Trainer时传递的Optimizer
-
property
pbar
¶ 如果在Callback中需要打印内容,请使用self.pbar.write(str)。否则可能出现命令行显示效果不太好的问题。在 on_train_begin(), on_train_end(), on_exception()中请不要使用该属性,通过print输出即可。
-
property
step
¶ 当前运行到的step, 范围为[1, self.n_steps+1)
-
property
trainer
¶ 该属性可以通过self.trainer获取到,一般情况下不需要使用这个属性。
-
property
update_every
¶ Trainer中的模型多少次反向传播才进行一次梯度更新,在Trainer初始化时传入的。
-
-
exception
fastNLP.
CallbackException
(msg)[源代码]¶ 别名
fastNLP.CallbackException
fastNLP.core.callback.CallbackException
当需要通过callback跳出训练的时候可以通过抛出CallbackException并在on_exception中捕获这个值。
-
with_traceback
()¶ Exception.with_traceback(tb) -- set self.__traceback__ to tb and return self.
-
-
exception
fastNLP.
EarlyStopError
(msg)[源代码]¶ -
别名
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):
-
-
class
fastNLP.
AutoPadder
(pad_val=0)[源代码]¶ -
别名
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.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
-
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_dict
和target_dict
中进行检查.pred_dict
是模型当中forward()
函数或者predict()
函数的返回值.target_dict
是DataSet当中的ground truth, 判定ground truth的条件是field的is_target
被设置为True.MetricBase
会进行以下的类型检测:self.evaluate当中是否有varargs, 这是不支持的.
self.evaluate当中所需要的参数是否既不在
pred_dict
也不在target_dict
.self.evaluate当中所需要的参数是否既在
pred_dict
也在target_dict
.
除此以外,在参数被传入self.evaluate以前,这个函数会检测
pred_dict
和target_dict
当中没有被用到的参数 如果kwargs是self.evaluate的参数,则不会检测self.evaluate将计算一个批次(batch)的评价指标,并累计。 没有返回值 self.get_metric将统计当前的评价指标并返回评价结果, 返回值需要是一个dict, key是指标名称,value是指标的值
-
class
fastNLP.
AccuracyMetric
(pred=None, target=None, seq_len=None)[源代码]¶ -
别名
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.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) -- micro 或 macro . 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_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.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.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) -- micro 或 macro . 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.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
-
class
fastNLP.
SGD
(lr=0.001, momentum=0, model_params=None)[源代码]¶ -
别名
fastNLP.SGD
fastNLP.core.optimizer.SGD
SGD
-
class
fastNLP.
Adam
(lr=0.001, weight_decay=0, betas=0.9, 0.999, eps=1e-08, amsgrad=False, model_params=None)[源代码]¶ -
别名
fastNLP.Adam
fastNLP.core.optimizer.Adam
Adam
-
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)
-
step
(closure=None)[源代码]¶ Performs a single optimization step.
- 参数
closure -- (callable, optional) A closure that reevaluates the model and returns the loss.
-
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.- Args:
param_group (dict): Specifies what Tensors should be optimized along with group specific optimization options.
-
load_state_dict
(state_dict)¶ Loads the optimizer state.
- Args:
- 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 list containing all parameter groups where each
parameter group is a dict
-
zero_grad
(set_to_none: bool = False)¶ Sets the gradients of all optimized
torch.Tensor
s to zero.- Args:
- set_to_none (bool): instead of setting to zero, set the grads to None.
This will in general have lower memory footprint, and can modestly improve performance. However, it changes certain behaviors. For example: 1. When the user tries to access a gradient and perform manual ops on it, a None attribute or a Tensor full of 0s will behave differently. 2. If the user requests
zero_grad(set_to_none=True)
followed by a backward pass,.grad
s are guaranteed to be None for params that did not receive a gradient. 3.torch.optim
optimizers have a different behavior if the gradient is 0 or None (in one case it does the step with a gradient of 0 and in the other it skips the step altogether).
-
-
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.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.BucketSampler
fastNLP.core.sampler.BucketSampler
带Bucket的 Random Sampler. 可以随机地取出长度相似的元素
-
class
fastNLP.
RandomSampler
[源代码]¶ -
别名
fastNLP.RandomSampler
fastNLP.core.sampler.RandomSampler
随机化取元素的 Sampler
-
__init__
()¶ Initialize self. See help(type(self)) for accurate signature.
-
-
class
fastNLP.
SortedSampler
(seq_len_field_name='seq_len', descending=True)[源代码]¶ -
别名
fastNLP.SortedSampler
fastNLP.core.sampler.SortedSampler
按照sample的长度进行排序,主要在测试的时候使用,可以加速测试(因为减少了padding)
-
class
fastNLP.
ConstantTokenNumSampler
(seq_len, max_token=4096, max_sentence=- 1, need_be_multiple_of=1, num_bucket=- 1)[源代码]¶ 别名
fastNLP.ConstantTokenNumSampler
fastNLP.core.sampler.ConstantTokenNumSampler
尽量保证每个batch的输入token数量是接近的。
使用示例 >>> # 假设已经有了tr_data并有一个field叫做seq_len保存了每个instance的token数量 >>> from fastNLP import DataSetIter, Trainer >>> sampler = ConstantTokenNumSampler(tr_data.get_field('seq_len').content, max_token=4096) >>> tr_iter = DataSetIter(tr_data, >>> 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=sampler) >>> >>> # 直接将tr_iter传入Trainer中,此时batch_size参数的值会被忽略 >>> trainer = Trainer(tr_iter, model, optimizer=optimizer, loss=TranslationLoss(), >>> batch_size=1, sampler=None, drop_last=False, update_every=1)
-
__init__
(seq_len, max_token=4096, max_sentence=- 1, need_be_multiple_of=1, num_bucket=- 1)[源代码]¶ - 参数
seq_len (List[int]) -- list[int], 是每个sample的长度。一般可以通过dataset.get_field('seq_len').content传入
max_token (int) -- 每个batch的最大的token数量
max_sentence (int) -- 每个batch最多多少个instance, -1表示根据max_token决定
need_be_multiple_of (int) -- 生成的batch的instance的数量需要是几的倍数,在DataParallel场景下会用到
num_bucket (int) -- 将数据按长度拆分为num_bucket个bucket,batch中的sample尽量在bucket之中进行组合,这样可以减少padding。
-
-
class
fastNLP.
LossFunc
(func, key_map=None, **kwargs)[源代码]¶ -
别名
fastNLP.LossFunc
fastNLP.core.losses.LossFunc
提供给用户使用自定义损失函数的类
- param func
用户自行定义的损失函数,应当为一个函数。
- param dict key_map
参数映射表。键为Model/DataSet参数名,值为损失函数参数名。 fastNLP的trainer将在训练时从模型返回值或者训练数据DataSet的target=True的field中 找到相对应的参数名为value的参数,并传入func中作为参数名为key的参数
- param kwargs
除了参数映射表以外可以用key word args的方式设置参数映射关系
使用方法:
import torch.nn.functional as F loss_func = LossFunc(F.cross_entropy, input="pred", target="label") # 这表示构建了一个损失函数类,由func计算损失函数,其中将从模型返回值或者DataSet的target=True的field # 当中找到一个参数名为`pred`的参数传入func一个参数名为`input`的参数;找到一个参数名为`label`的参数 # 传入func作为一个名为`target`的参数
-
get_loss
(*args, **kwargs)¶ - 参数
args --
kwargs --
- 返回
torch.Tensor
-
class
fastNLP.
CrossEntropyLoss
(pred=None, target=None, seq_len=None, class_in_dim=- 1, ignore_idx=- 100, reduction='mean', **kwargs)[源代码]¶ -
别名
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 ignore_idx
padding的index,在计算loss时将忽略target中标号为padding_idx的内容, 可以通过该值代替 传入seq_len.
- param str reduction
支持 mean ,sum 和 none .
Example:
loss = CrossEntropyLoss(pred='pred', target='label', padding_idx=0)
-
class
fastNLP.
MSELoss
(pred=None, target=None, reduction='mean')[源代码]¶ -
别名
fastNLP.MSELoss
fastNLP.core.losses.MSELoss
MSE损失函数
- param pred
参数映射表中 pred 的映射关系,None表示映射关系为 pred -> pred
- param target
参数映射表中 target 的映射关系,None表示映射关系为 target >`target`
- param str reduction
支持'mean','sum'和'none'.
-
class
fastNLP.
L1Loss
(pred=None, target=None, reduction='mean')[源代码]¶ -
别名
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.BCELoss
fastNLP.core.losses.BCELoss
二分类交叉熵损失函数
- param pred
参数映射表中 pred 的映射关系,None表示映射关系为 pred -> pred
- param target
参数映射表中 target 的映射关系,None表示映射关系为 target -> target
- param str reduction
支持 mean ,sum 和 none .
-
class
fastNLP.
NLLLoss
(pred=None, target=None, seq_len=None, class_in_dim=- 1, ignore_idx=- 100, reduction='mean')[源代码]¶ -
别名
fastNLP.NLLLoss
fastNLP.core.losses.NLLLoss
负对数似然损失函数
-
__init__
(pred=None, target=None, seq_len=None, class_in_dim=- 1, ignore_idx=- 100, reduction='mean')[源代码]¶ - 参数
pred -- 参数映射表中 pred 的映射关系,None表示映射关系为 pred -> pred
target -- 参数映射表中 target 的映射关系,None表示映射关系为 target -> target
seq_len -- 句子的长度, 长度之外的token不会计算loss。仅在输出为3d时需要
class_in_dim (int) -- 在序列标注的场景中,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 ignore_idx: ignore的index,在计算loss时将忽略target中标号为ignore_idx的内容, 可以通过该值代替
传入seq_len.
- 参数
reduction (str) -- 支持 mean ,sum 和 none .
-
-
class
fastNLP.
LossInForward
(loss_key='loss')[源代码]¶ -
别名
fastNLP.LossInForward
fastNLP.core.losses.LossInForward
从forward()函数返回结果中获取loss
-
class
fastNLP.
LossBase
[源代码]¶ 别名
fastNLP.LossBase
fastNLP.core.losses.LossBase
所有loss的基类。如果需要结合到Trainer之中需要实现get_loss方法
-
class
fastNLP.
CMRC2018Loss
(target_start=None, target_end=None, context_len=None, pred_start=None, pred_end=None, reduction='mean')[源代码]¶ -
别名
fastNLP.CMRC2018Loss
fastNLP.core.losses.CMRC2018Loss
用于计算CMRC2018中文问答任务。
-
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
中查看即可。如果想了解各个子模块的具体作用,您可以在下面找到每个子模块的具体文档。
子模块¶
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属性。
-
static
get_num_batches
(num_samples, batch_size, drop_last)[源代码]¶ 计算batch的数量。用于前端显示进度
- 参数
num_samples (int) --
batch_size (int) --
drop_last (bool) -- 如果最后一个batch没有batch_size这么多,是否就丢掉。
- 返回
-
property
dataset
¶ 获取正在参与iterate的dataset
- 返回
-
static
-
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.DataSetIter
fastNLP.core.batch.DataSetIter
- DataSetIter 用于从 DataSet 中按一定的顺序, 依次按
batch_size
的大小将数据取出,通过使用DataSetIter,可以不需要考虑 输入的padding(由DataSet中每列的Padder决定了)以及不需要考虑将数据转为tensor。
组成 x 和 y:
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会被忽略。
-
property
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这么多,是否就丢掉。
- 返回
- DataSetIter 用于从 DataSet 中按一定的顺序, 依次按
-
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.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会被忽略。
-
property
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这么多,是否就丢掉。
- 返回
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必须继承自这个类-
property
trainer
¶ 该属性可以通过self.trainer获取到,一般情况下不需要使用这个属性。
-
property
grad_scaler
¶ float16的gradient scaler
-
property
auto_cast
¶ float16用的auto cast环境
-
property
step
¶ 当前运行到的step, 范围为[1, self.n_steps+1)
-
property
n_steps
¶ Trainer一共会采多少个batch。当Trainer中update_every设置为非1的值时,该值不等于update的次数
-
property
batch_size
¶ train和evaluate时的batch_size为多大
-
property
epoch
¶ 当前运行的epoch数,范围是[1, self.n_epochs+1)
-
property
n_epochs
¶ 一共会运行多少个epoch
-
property
optimizer
¶ 初始化Trainer时传递的Optimizer
-
property
model
¶ 正在被Trainer训练的模型
-
property
pbar
¶ 如果在Callback中需要打印内容,请使用self.pbar.write(str)。否则可能出现命令行显示效果不太好的问题。在 on_train_begin(), on_train_end(), on_exception()中请不要使用该属性,通过print输出即可。
-
property
update_every
¶ Trainer中的模型多少次反向传播才进行一次梯度更新,在Trainer初始化时传入的。
-
property
batch_per_epoch
¶ 每个epoch一共有多少个batch,只有在on_epoch_begin之后才能调用该属性。
-
on_batch_begin
(batch_x, batch_y, indices)[源代码]¶ 每次采集到一个batch的数据则调用一次。这里对batch_x或batch_y删除添加内容是可以影响到Trainer中内容的。所以在这一步 可以进行一些负采样之类的操作。batch_x和batch_y中的tensor已经被放置到了模型所在的设备上。
- 参数
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_loss_begin
(batch_y, predict_y)[源代码]¶ 在计算loss前调用,即这里修改batch_y或predict_y的值是可以影响到loss计算的。
- 参数
batch_y (dict) -- 在DataSet中被设置为target的field的batch集合。
predict_y (dict) -- 模型的forward()返回的结果。
- 返回
-
on_backward_begin
(loss)[源代码]¶ 在loss得到之后,但在反向传播之前。可能可以进行loss是否为NaN的检查。
- 参数
loss (torch.Tensor) -- 计算得到的loss值
- 返回
-
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结果是否比之前的好。
- 返回
-
property
-
class
fastNLP.core.callback.
GradientClipCallback
(parameters=None, clip_value=1, clip_type='norm')[源代码]¶ -
别名
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.
-
property
auto_cast
¶ float16用的auto cast环境
-
property
batch_per_epoch
¶ 每个epoch一共有多少个batch,只有在on_epoch_begin之后才能调用该属性。
-
property
batch_size
¶ train和evaluate时的batch_size为多大
-
property
epoch
¶ 当前运行的epoch数,范围是[1, self.n_epochs+1)
-
property
grad_scaler
¶ float16的gradient scaler
-
property
model
¶ 正在被Trainer训练的模型
-
property
n_epochs
¶ 一共会运行多少个epoch
-
property
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和batch_y中的tensor已经被放置到了模型所在的设备上。
- 参数
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结果是否比之前的好。
- 返回
-
property
optimizer
¶ 初始化Trainer时传递的Optimizer
-
property
pbar
¶ 如果在Callback中需要打印内容,请使用self.pbar.write(str)。否则可能出现命令行显示效果不太好的问题。在 on_train_begin(), on_train_end(), on_exception()中请不要使用该属性,通过print输出即可。
-
property
step
¶ 当前运行到的step, 范围为[1, self.n_steps+1)
-
property
trainer
¶ 该属性可以通过self.trainer获取到,一般情况下不需要使用这个属性。
-
property
update_every
¶ Trainer中的模型多少次反向传播才进行一次梯度更新,在Trainer初始化时传入的。
-
-
class
fastNLP.core.callback.
EarlyStopCallback
(patience)[源代码]¶ -
别名
fastNLP.EarlyStopCallback
fastNLP.core.callback.EarlyStopCallback
多少个epoch没有变好就停止训练,相关类
EarlyStopError
-
property
auto_cast
¶ float16用的auto cast环境
-
property
batch_per_epoch
¶ 每个epoch一共有多少个batch,只有在on_epoch_begin之后才能调用该属性。
-
property
batch_size
¶ train和evaluate时的batch_size为多大
-
property
epoch
¶ 当前运行的epoch数,范围是[1, self.n_epochs+1)
-
property
grad_scaler
¶ float16的gradient scaler
-
property
model
¶ 正在被Trainer训练的模型
-
property
n_epochs
¶ 一共会运行多少个epoch
-
property
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和batch_y中的tensor已经被放置到了模型所在的设备上。
- 参数
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中设置了验证,则发生验证前会调用该函数
- 返回
-
property
optimizer
¶ 初始化Trainer时传递的Optimizer
-
property
pbar
¶ 如果在Callback中需要打印内容,请使用self.pbar.write(str)。否则可能出现命令行显示效果不太好的问题。在 on_train_begin(), on_train_end(), on_exception()中请不要使用该属性,通过print输出即可。
-
property
step
¶ 当前运行到的step, 范围为[1, self.n_steps+1)
-
property
trainer
¶ 该属性可以通过self.trainer获取到,一般情况下不需要使用这个属性。
-
property
update_every
¶ Trainer中的模型多少次反向传播才进行一次梯度更新,在Trainer初始化时传入的。
-
property
-
class
fastNLP.core.callback.
FitlogCallback
(data=None, tester=None, log_loss_every=0, verbose=1, log_exception=False)[源代码]¶ -
别名
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=1, 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信息
-
property
auto_cast
¶ float16用的auto cast环境
-
property
batch_per_epoch
¶ 每个epoch一共有多少个batch,只有在on_epoch_begin之后才能调用该属性。
-
property
batch_size
¶ train和evaluate时的batch_size为多大
-
property
epoch
¶ 当前运行的epoch数,范围是[1, self.n_epochs+1)
-
property
grad_scaler
¶ float16的gradient scaler
-
property
model
¶ 正在被Trainer训练的模型
-
property
n_epochs
¶ 一共会运行多少个epoch
-
property
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和batch_y中的tensor已经被放置到了模型所在的设备上。
- 参数
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中设置了验证,则发生验证前会调用该函数
- 返回
-
property
optimizer
¶ 初始化Trainer时传递的Optimizer
-
property
pbar
¶ 如果在Callback中需要打印内容,请使用self.pbar.write(str)。否则可能出现命令行显示效果不太好的问题。在 on_train_begin(), on_train_end(), on_exception()中请不要使用该属性,通过print输出即可。
-
property
step
¶ 当前运行到的step, 范围为[1, self.n_steps+1)
-
property
trainer
¶ 该属性可以通过self.trainer获取到,一般情况下不需要使用这个属性。
-
property
update_every
¶ Trainer中的模型多少次反向传播才进行一次梯度更新,在Trainer初始化时传入的。
-
-
class
fastNLP.core.callback.
EvaluateCallback
(data=None, tester=None)[源代码]¶ -
别名
fastNLP.EvaluateCallback
fastNLP.core.callback.EvaluateCallback
通过使用该Callback可以使得Trainer在evaluate dev之外还可以evaluate其它数据集,比如测试集。每一次验证dev之前都会先验证EvaluateCallback 中的数据。
-
property
auto_cast
¶ float16用的auto cast环境
-
property
batch_per_epoch
¶ 每个epoch一共有多少个batch,只有在on_epoch_begin之后才能调用该属性。
-
property
batch_size
¶ train和evaluate时的batch_size为多大
-
property
epoch
¶ 当前运行的epoch数,范围是[1, self.n_epochs+1)
-
property
grad_scaler
¶ float16的gradient scaler
-
property
model
¶ 正在被Trainer训练的模型
-
property
n_epochs
¶ 一共会运行多少个epoch
-
property
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和batch_y中的tensor已经被放置到了模型所在的设备上。
- 参数
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中设置了验证,则发生验证前会调用该函数
- 返回
-
property
optimizer
¶ 初始化Trainer时传递的Optimizer
-
property
pbar
¶ 如果在Callback中需要打印内容,请使用self.pbar.write(str)。否则可能出现命令行显示效果不太好的问题。在 on_train_begin(), on_train_end(), on_exception()中请不要使用该属性,通过print输出即可。
-
property
step
¶ 当前运行到的step, 范围为[1, self.n_steps+1)
-
property
trainer
¶ 该属性可以通过self.trainer获取到,一般情况下不需要使用这个属性。
-
property
update_every
¶ Trainer中的模型多少次反向传播才进行一次梯度更新,在Trainer初始化时传入的。
-
property
-
class
fastNLP.core.callback.
LRScheduler
(lr_scheduler)[源代码]¶ -
别名
fastNLP.LRScheduler
fastNLP.core.callback.LRScheduler
对PyTorch LR Scheduler的包装以使得其可以被Trainer所使用
-
__init__
(lr_scheduler)[源代码]¶ - 参数
lr_scheduler (torch.optim.lr_scheduler._LRScheduler) -- PyTorch的lr_scheduler
-
property
auto_cast
¶ float16用的auto cast环境
-
property
batch_per_epoch
¶ 每个epoch一共有多少个batch,只有在on_epoch_begin之后才能调用该属性。
-
property
batch_size
¶ train和evaluate时的batch_size为多大
-
property
epoch
¶ 当前运行的epoch数,范围是[1, self.n_epochs+1)
-
property
grad_scaler
¶ float16的gradient scaler
-
property
model
¶ 正在被Trainer训练的模型
-
property
n_epochs
¶ 一共会运行多少个epoch
-
property
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和batch_y中的tensor已经被放置到了模型所在的设备上。
- 参数
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结果是否比之前的好。
- 返回
-
property
optimizer
¶ 初始化Trainer时传递的Optimizer
-
property
pbar
¶ 如果在Callback中需要打印内容,请使用self.pbar.write(str)。否则可能出现命令行显示效果不太好的问题。在 on_train_begin(), on_train_end(), on_exception()中请不要使用该属性,通过print输出即可。
-
property
step
¶ 当前运行到的step, 范围为[1, self.n_steps+1)
-
property
trainer
¶ 该属性可以通过self.trainer获取到,一般情况下不需要使用这个属性。
-
property
update_every
¶ Trainer中的模型多少次反向传播才进行一次梯度更新,在Trainer初始化时传入的。
-
-
class
fastNLP.core.callback.
ControlC
(quit_and_do, action=<staticmethod object>)[源代码]¶ -
别名
fastNLP.ControlC
fastNLP.core.callback.ControlC
检测到 control+C 时的反馈
-
__init__
(quit_and_do, action=<staticmethod object>)[源代码]¶ - 参数
quit_and_do (bool) -- 若为True,则检测到control+C 进行后续操作(默认值为:直接退出程序);否则只退出Trainer。
-
property
auto_cast
¶ float16用的auto cast环境
-
property
batch_per_epoch
¶ 每个epoch一共有多少个batch,只有在on_epoch_begin之后才能调用该属性。
-
property
batch_size
¶ train和evaluate时的batch_size为多大
-
property
epoch
¶ 当前运行的epoch数,范围是[1, self.n_epochs+1)
-
property
grad_scaler
¶ float16的gradient scaler
-
property
model
¶ 正在被Trainer训练的模型
-
property
n_epochs
¶ 一共会运行多少个epoch
-
property
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和batch_y中的tensor已经被放置到了模型所在的设备上。
- 参数
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结果是否比之前的好。
- 返回
-
property
optimizer
¶ 初始化Trainer时传递的Optimizer
-
property
pbar
¶ 如果在Callback中需要打印内容,请使用self.pbar.write(str)。否则可能出现命令行显示效果不太好的问题。在 on_train_begin(), on_train_end(), on_exception()中请不要使用该属性,通过print输出即可。
-
property
step
¶ 当前运行到的step, 范围为[1, self.n_steps+1)
-
property
trainer
¶ 该属性可以通过self.trainer获取到,一般情况下不需要使用这个属性。
-
property
update_every
¶ Trainer中的模型多少次反向传播才进行一次梯度更新,在Trainer初始化时传入的。
-
-
class
fastNLP.core.callback.
LRFinder
(start_lr=1e-06, end_lr=10)[源代码]¶ -
别名
fastNLP.LRFinder
fastNLP.core.callback.LRFinder
用第一个 epoch 找最佳的学习率,从第二个epoch开始应用它
-
property
auto_cast
¶ float16用的auto cast环境
-
property
batch_per_epoch
¶ 每个epoch一共有多少个batch,只有在on_epoch_begin之后才能调用该属性。
-
property
batch_size
¶ train和evaluate时的batch_size为多大
-
property
epoch
¶ 当前运行的epoch数,范围是[1, self.n_epochs+1)
-
property
grad_scaler
¶ float16的gradient scaler
-
property
model
¶ 正在被Trainer训练的模型
-
property
n_epochs
¶ 一共会运行多少个epoch
-
property
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和batch_y中的tensor已经被放置到了模型所在的设备上。
- 参数
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结果是否比之前的好。
- 返回
-
property
optimizer
¶ 初始化Trainer时传递的Optimizer
-
property
pbar
¶ 如果在Callback中需要打印内容,请使用self.pbar.write(str)。否则可能出现命令行显示效果不太好的问题。在 on_train_begin(), on_train_end(), on_exception()中请不要使用该属性,通过print输出即可。
-
property
step
¶ 当前运行到的step, 范围为[1, self.n_steps+1)
-
property
trainer
¶ 该属性可以通过self.trainer获取到,一般情况下不需要使用这个属性。
-
property
update_every
¶ Trainer中的模型多少次反向传播才进行一次梯度更新,在Trainer初始化时传入的。
-
property
-
class
fastNLP.core.callback.
TensorboardCallback
(*options)[源代码]¶ -
别名
fastNLP.TensorboardCallback
fastNLP.core.callback.TensorboardCallback
接受以下一个或多个字符串作为参数: - "model" - "loss" - "metric"
警告
fastNLP 已停止对此功能的维护,请等待 fastNLP 兼容 PyTorch1.1 的下一个版本。 或者使用和 fastNLP 高度配合的 fitlog(参见 使用fitlog 辅助 fastNLP 进行科研 )。
-
property
auto_cast
¶ float16用的auto cast环境
-
property
batch_per_epoch
¶ 每个epoch一共有多少个batch,只有在on_epoch_begin之后才能调用该属性。
-
property
batch_size
¶ train和evaluate时的batch_size为多大
-
property
epoch
¶ 当前运行的epoch数,范围是[1, self.n_epochs+1)
-
property
grad_scaler
¶ float16的gradient scaler
-
property
model
¶ 正在被Trainer训练的模型
-
property
n_epochs
¶ 一共会运行多少个epoch
-
property
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中设置了验证,则发生验证前会调用该函数
- 返回
-
property
optimizer
¶ 初始化Trainer时传递的Optimizer
-
property
pbar
¶ 如果在Callback中需要打印内容,请使用self.pbar.write(str)。否则可能出现命令行显示效果不太好的问题。在 on_train_begin(), on_train_end(), on_exception()中请不要使用该属性,通过print输出即可。
-
property
step
¶ 当前运行到的step, 范围为[1, self.n_steps+1)
-
property
trainer
¶ 该属性可以通过self.trainer获取到,一般情况下不需要使用这个属性。
-
property
update_every
¶ Trainer中的模型多少次反向传播才进行一次梯度更新,在Trainer初始化时传入的。
-
property
-
class
fastNLP.core.callback.
WarmupCallback
(warmup=0.1, schedule='constant')[源代码]¶ -
别名
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.
-
property
auto_cast
¶ float16用的auto cast环境
-
property
batch_per_epoch
¶ 每个epoch一共有多少个batch,只有在on_epoch_begin之后才能调用该属性。
-
property
batch_size
¶ train和evaluate时的batch_size为多大
-
property
epoch
¶ 当前运行的epoch数,范围是[1, self.n_epochs+1)
-
property
grad_scaler
¶ float16的gradient scaler
-
property
model
¶ 正在被Trainer训练的模型
-
property
n_epochs
¶ 一共会运行多少个epoch
-
property
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和batch_y中的tensor已经被放置到了模型所在的设备上。
- 参数
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结果是否比之前的好。
- 返回
-
property
optimizer
¶ 初始化Trainer时传递的Optimizer
-
property
pbar
¶ 如果在Callback中需要打印内容,请使用self.pbar.write(str)。否则可能出现命令行显示效果不太好的问题。在 on_train_begin(), on_train_end(), on_exception()中请不要使用该属性,通过print输出即可。
-
property
step
¶ 当前运行到的step, 范围为[1, self.n_steps+1)
-
property
trainer
¶ 该属性可以通过self.trainer获取到,一般情况下不需要使用这个属性。
-
property
update_every
¶ Trainer中的模型多少次反向传播才进行一次梯度更新,在Trainer初始化时传入的。
-
-
class
fastNLP.core.callback.
SaveModelCallback
(save_dir, top=3, only_param=False, save_on_exception=False)[源代码]¶ -
别名
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}.
-
property
auto_cast
¶ float16用的auto cast环境
-
property
batch_per_epoch
¶ 每个epoch一共有多少个batch,只有在on_epoch_begin之后才能调用该属性。
-
property
batch_size
¶ train和evaluate时的batch_size为多大
-
property
epoch
¶ 当前运行的epoch数,范围是[1, self.n_epochs+1)
-
property
grad_scaler
¶ float16的gradient scaler
-
property
model
¶ 正在被Trainer训练的模型
-
property
n_epochs
¶ 一共会运行多少个epoch
-
property
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和batch_y中的tensor已经被放置到了模型所在的设备上。
- 参数
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中设置了验证,则发生验证前会调用该函数
- 返回
-
property
optimizer
¶ 初始化Trainer时传递的Optimizer
-
property
pbar
¶ 如果在Callback中需要打印内容,请使用self.pbar.write(str)。否则可能出现命令行显示效果不太好的问题。在 on_train_begin(), on_train_end(), on_exception()中请不要使用该属性,通过print输出即可。
-
property
step
¶ 当前运行到的step, 范围为[1, self.n_steps+1)
-
property
trainer
¶ 该属性可以通过self.trainer获取到,一般情况下不需要使用这个属性。
-
property
update_every
¶ Trainer中的模型多少次反向传播才进行一次梯度更新,在Trainer初始化时传入的。
-
-
exception
fastNLP.core.callback.
CallbackException
(msg)[源代码]¶ 别名
fastNLP.CallbackException
fastNLP.core.callback.CallbackException
当需要通过callback跳出训练的时候可以通过抛出CallbackException并在on_exception中捕获这个值。
-
with_traceback
()¶ Exception.with_traceback(tb) -- set self.__traceback__ to tb and return self.
-
-
exception
fastNLP.core.callback.
EarlyStopError
(msg)[源代码]¶ -
别名
fastNLP.EarlyStopError
fastNLP.core.callback.EarlyStopError
用于EarlyStop时从Trainer训练循环中跳出。
-
with_traceback
()¶ Exception.with_traceback(tb) -- set self.__traceback__ to tb and return self.
-
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)
-
INPUT
= 'words'¶
-
CHAR_INPUT
= 'chars'¶
-
INPUT_LEN
= 'seq_len'¶
-
OUTPUT
= 'pred'¶
-
TARGET
= 'target'¶
-
LOSS
= 'loss'¶
-
RAW_WORD
= 'raw_words'¶
-
RAW_CHAR
= 'raw_chars'¶
-
__init__
()¶ Initialize self. See help(type(self)) for accurate signature.
-
DataSet
是fastNLP中用于承载数据的容器。可以将DataSet看做是一个表格,
每一行是一个sample (在fastNLP中被称为 instance
),
每一列是一个feature (在fastNLP中称为 field
)。
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
对象。
创建DataSet主要有以下的3种方式
from fastNLP import DataSet data = {'sentence':["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
from fastNLP import DataSet from fastNLP import Instance dataset = DataSet() instance = Instance(sentence="This is the first instance", words=['this', 'is', 'the', 'first', 'instance', '.'], seq_len=6) dataset.append(instance) # 可以继续append更多内容,但是append的instance应该和第一个instance拥有完全相同的field
from fastNLP import DataSet from fastNLP import Instance instances = [] instances.append(Instance(sentence="This is the first instance", ords=['this', 'is', 'the', 'first', 'instance', '.'], seq_len=6)) instances.append(Instance(sentence="Second instance .", words=['Second', 'instance', '.'], seq_len=3)) dataset = DataSet(instances)
常见的预处理有如下几种
from fastNLP import DataSet from fastNLP import Instance dataset = DataSet() filepath='some/text/file' # 假设文件中每行内容如下(sentence label): # This is a fantastic day positive # The bad weather negative # ..... with open(filepath, 'r') as f: for line in f: sent, label = line.strip().split('\t') dataset.append(Instance(sentence=sent, label=label))注解
直接读取特定数据集的数据请参考 使用Loader和Pipe加载并处理数据集
from fastNLP import DataSet data = {'sentence':["This is the first instance .", "Second instance .", "Third instance ."]} dataset = DataSet(data) # 将句子分成单词形式, 详见DataSet.apply()方法 dataset.apply(lambda ins: ins['sentence'].split(), new_field_name='words') # 或使用DataSet.apply_field() dataset.apply_field(lambda sent:sent.split(), field_name='sentence', new_field_name='words') # 除了匿名函数,也可以定义函数传递进去 def get_words(instance): sentence = instance['sentence'] words = sentence.split() return words dataset.apply(get_words, new_field_name='words')
from fastNLP import DataSet dataset = DataSet({'a': list(range(-5, 5))}) # 返回满足条件的instance,并放入DataSet中 dropped_dataset = dataset.drop(lambda ins:ins['a']<0, inplace=False) # 在dataset中删除满足条件的instance dataset.drop(lambda ins:ins['a']<0) # dataset的instance数量减少 # 删除第3个instance dataset.delete_instance(2) # 删除名为'a'的field dataset.delete_field('a')
for instance in dataset: # do something
# 检查是否存在名为'a'的field dataset.has_field('a') # 或 ('a' in dataset) # 将名为'a'的field改名为'b' dataset.rename_field('a', 'b') # DataSet的长度 len(dataset)
在目前深度学习的模型中,大都依赖于随机梯度下降法(SGD)进行模型的优化。随机梯度下降需要将数据切分成一个个的 batch, 一个batch进行一次前向计算(forward)与梯度后向传播(backward)。在自然语言处理的场景下,往往还需要对数据进行pad。这是 由于句子的长度一般是不同的,但是一次batch中的每个field都必须是一个tensor,所以需要将所有句子都补齐到相同的长度。
我们先看fastNLP中如何将数据分成一个一个的batch的例子, 这里我们使用随机生成的数据来模拟一个二分类文本分类任务, words和characters是输入,labels是文本类别
from fastNLP import DataSet from fastNLP import DataSetIter from fastNLP import SequentialSampler from fastNLP import EngChar2DPadder num_instances = 100 # 假设每句话最少2个词,最多5个词; 词表的大小是100个; 一共26个字母,每个单词最短1个字母,最长5个字母 lengths = [random.randint(2, 5) for _ in range(num_instances)] data = {'words': [[random.randint(1, 100) for _ in range(lengths[idx]) ] for idx in range(num_instances)], 'chars': [ [[random.randint(1, 27) for _ in range(random.randint(1, 5))] for _ in range(lengths[idx])] for idx in range(num_instances)], 'label': [random.randint(0, 1) for _ in range(num_instances)]} d = DataSet(data) d.set_padder('chars', EngChar2DPadder()) # 因为英文character的pad方式与word的pad方式不一样 d.set_target('label') d.set_input('words', 'chars') for batch_x, batch_y in DataSetIter(d, sampler=SequentialSampler(), batch_size=2): print("batch_x:", batch_x) print("batch_y:", batch_y) break # 输出为 # {'words': tensor([[49, 27, 20, 36, 63], # [53, 82, 23, 11, 0]]), 'chars': tensor([[[13, 3, 14, 25, 1], # [ 8, 20, 12, 0, 0], # [27, 8, 0, 0, 0], # [ 1, 15, 26, 0, 0], # [11, 24, 17, 0, 0]], # # [[ 6, 14, 11, 27, 22], # [18, 6, 4, 19, 0], # [19, 22, 9, 0, 0], # [10, 25, 0, 0, 0], # [ 0, 0, 0, 0, 0]]])} # {'label': tensor([0, 0])}其中
DataSetIter
是用于从DataSet中按照batch_size为大小取出batch的迭代器,SequentialSampler
用于指示DataSetIter
以怎样的 顺序从DataSet中取出instance以组成一个batch, 更详细的说明请参照DataSetIter
和SequentialSampler
文档。通过
DataSet.set_input('words', 'chars')
, fastNLP将认为 words 和 chars 这两个field都是input,并将它们都放入迭代器 生成的第一个dict中;DataSet.set_target('labels')
, fastNLP将认为 labels 这个field是target,并将其放入到迭代器的第 二个dict中。如上例中所打印结果。分为input和target的原因是由于它们在被Trainer
所使用时会有所差异, 详见Trainer
当把某个field设置为 target 或者 input 的时候(两者不是互斥的,可以同时设为两种),fastNLP不仅仅只是将其放 置到不同的dict中,而还会对被设置为 input 或 target 的 field 进行类型检查。类型检查的目的是为了看能否把该 field 转为 pytorch的
torch.LongTensor
或torch.FloatTensor
类型 (也可以在DataSetIter
中设置输出numpy类型,参考DataSetIter
)。如上例所示,fastNLP已将 words ,chars 和 label 转为了
Tensor
类型。 如果 field 在每个 instance 都拥有相同的维度(不能超过两维),且最内层的元素都为相同的 type(int, float, np.int*, np.float*), 则fastNLP默认将对该 field 进行pad。也支持全为str的field作为target和input,这种情况下,fastNLP默认不进行pad。 另外,当某个 field 已经被设置为了 target 或者 input 后,之后 append 的 instance 对应的 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。
在fastNLP里,pad是与一个field绑定的。即不同的field可以使用不同的pad方式,比如在英文任务中word需要的pad和 character的pad方式往往是不同的。fastNLP是通过一个叫做
Padder
的子类来完成的。 默认情况下,所有field使用AutoPadder
。可以通过使用以下方式设置Padder(如果将padder设置为None,则该field不会进行pad操作)。 大多数情况下直接使用AutoPadder
就可以了。 如果AutoPadder
或EngChar2DPadder
无法满足需求, 也可以自己写一个Padder
。from fastNLP import DataSet from fastNLP import EngChar2DPadder import random dataset = DataSet() max_chars, max_words, sent_num = 5, 10, 20 contents = [[ [random.randint(1, 27) for _ in range(random.randint(1, max_chars))] for _ in range(random.randint(1, max_words)) ] for _ in range(sent_num)] # 初始化时传入 dataset.add_field('chars', contents, padder=EngChar2DPadder()) # 直接设置 dataset.set_padder('chars', EngChar2DPadder()) # 也可以设置pad的value dataset.set_pad_val('chars', -1)
DataSet支持在进行batch时,默认只能看到当前的field的值,但在某些训练中可能存在以下的情况: (1)需要两个field拼接成为一个field; (2)需要在batch中进行负采样。这时候就需要能够同时利用多个field进行batch的操作,DataSet中的add_collate_fn()函数支持添加 自定义涉及多个field的collate_fn函数。例如下例中将两个field拼接成一个field的场景
from fastNLP import DataSet, DataSetIter import torch data = DataSet({ 'x1': [[0, 1], [2]], 'x2': [[3], [2, 4, 5]], 'y': [0, 1] }) data.set_target('y') # 所有的collate_fn函数都接受list[(ind1, instance1), (ind2, instance2), ...]作为输入,其中ind1/ind2是该instance在dataset中 # 的index,instance1/instance2是这次batch取出来的数据,包含了所有的field. def concat_collate_fn(ins_list): x1 = [ins['x1'] for ind,ins in ins_list] x2 = [ins['x2'] for ind,ins in ins_list] xs = [] for i in range(len(ins_list)): xs.append(torch.LongTensor(x1[i] + x2[i])) # 需要自行pad并转换为tensor,但不需要移动到gpu arr = torch.nn.utils.rnn.pad_sequence(xs, batch_first=True, padding_value=0) b_x = {'x': arr} b_y = {} # 返回值一定是两个dict,第一个dict的值会认为是input,第二个dict的值会认为是target. 若名称与已有input或target重复,则 # 采用返回值。 return b_x, b_y data.add_collate_fn(concat_collate_fn) for batch_x, batch_y in DataSetIter(data, sampler=SequentialSampler(), batch_size=2): print("batch_x:", batch_x) print("batch_y:", batch_y) # batch_x: {'x': tensor([[0, 1, 3, 0], # [2, 2, 4, 5]])} # batch_y: {'y': array([0, 1])} # 如果取batch过程含有一些参数,可以通过类来实现 class ConCollateFn: def __init__(self, max_len=3): self.max_len = max_len def __call__(self, ins_list): # 实现该类的__call__函数 x1 = [ins['x1'] for ind, ins in ins_list] x2 = [ins['x2'] for ind, ins in ins_list] xs = [] for i in range(len(ins_list)): xs.append(torch.LongTensor(x1[i] + x2[i])[:self.max_len]) arr = torch.nn.utils.rnn.pad_sequence(xs, batch_first=True, padding_value=0) b_x = {'x': arr} b_y = {} return b_x, b_y data.delete_collate_fn() # 删除之前的collate_fn data.add_collate_fn(ConCollateFn(max_len=3)) for batch_x, batch_y in DataSetIter(data, sampler=SequentialSampler(), batch_size=2): print("batch_x:", batch_x) print("batch_y:", batch_y) # batch_x: {'x': tensor([[0, 1, 3], # [2, 2, 4]])} # batch_y: {'y': array([0, 1])}
-
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
。
-
print_field_meta
()[源代码]¶ 输出当前field的meta信息, 形似下列的输出:
+-------------+-------+-------+ | field_names | x | y | +=============+=======+=======+ | is_input | True | False | | is_target | False | False | | ignore_type | False | | | pad_value | 0 | | +-------------+-------+-------+
str field_names: DataSet中field的名称 bool is_input: field是否为input bool is_target: field是否为target bool ignore_type: 是否忽略该field的type, 一般仅在该field至少为input或target时才有意义 int pad_value: 该field的pad的值,仅在该field为input或target时有意义 :return:
-
append
(instance)[源代码]¶ 将一个instance对象append到DataSet后面。
- 参数
instance (Instance) -- 若DataSet不为空,则instance应该拥有和DataSet完全一样的field。
-
add_fieldarray
(field_name, fieldarray)[源代码]¶ 将fieldarray添加到DataSet中.
- 参数
field_name (str) -- 新加入的field的名称
fieldarray (FieldArray) -- 需要加入DataSet的field的内容
- 返回
-
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的类型检查
-
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
-
has_field
(field_name)[源代码]¶ 判断DataSet中是否有名为field_name这个field
- 参数
field_name (str) -- field的名称
- Return bool
表示是否有名为field_name这个field
-
rename_field
(field_name, new_field_name)[源代码]¶ 将某个field重新命名.
- 参数
field_name (str) -- 原来的field名称。
new_field_name (str) -- 修改为new_name。
-
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该列是否所有数据都是同样的维度,同样的类型。将直接使用第一 行的数据进行类型和维度推断本列的数据的类型和维度。
-
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_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_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_pad_val
(field_name, pad_val)[源代码]¶ 为某个field设置对应的pad_val.
- 参数
field_name (str) -- 修改该field的pad_val
pad_val (int) -- 该field的padder会以pad_val作为padding index
-
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
is_input: bool, 如果为True则将名为 new_field_name 的field设置为input
is_target: bool, 如果为True则将名为 new_field_name 的field设置为target
ignore_type: bool, 如果为True则将名为 new_field_name 的field的ignore_type设置为true, 忽略其类型
use_tqdm: bool, 是否使用tqdm显示预处理进度
tqdm_desc: str, 当use_tqdm为True时,可以显示当前tqdm正在处理的名称
- 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_more
与apply_field
的区别参考apply_more()
中关于apply_more
与apply
区别的介绍。- 参数
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
is_input: bool, 如果为True则将被修改的field设置为input
is_target: bool, 如果为True则将被修改的field设置为target
ignore_type: bool, 如果为True则将被修改的field的ignore_type设置为true, 忽略其类型
use_tqdm: bool, 是否使用tqdm显示预处理进度
tqdm_desc: str, 当use_tqdm为True时,可以显示当前tqdm正在处理的名称
- Return Dict[str:Field]
返回一个字典
-
apply_more
(func, modify_fields=True, **kwargs)[源代码]¶ 将
DataSet
中每个Instance
传入到func中,并获取它的返回值。func可以返回一个或多个 field 上的结果。注解
apply_more
与apply
的区别:apply_more
可以返回多个 field 的结果,apply
只可以返回一个field 的结果;apply_more
的返回值是一个字典,每个 key-value 对中的 key 表示 field 的名字,value 表示计算结果;apply_more
默认修改DataSet
中的 field ,apply
默认不修改。
- 参数
func (callable) -- 参数是
DataSet
中的Instance
,返回值是一个字典,key 是field 的名字,value 是对应的结果modify_fields (bool) -- 是否用结果修改
DataSet
中的Field
, 默认为 Truekwargs (optional) --
支持输入is_input,is_target,ignore_type
is_input: bool, 如果为True则将被修改的的field设置为input
is_target: bool, 如果为True则将被修改的的field设置为target
ignore_type: bool, 如果为True则将被修改的的field的ignore_type设置为true, 忽略其类型
use_tqdm: bool, 是否使用tqdm显示预处理进度
tqdm_desc: str, 当use_tqdm为True时,可以显示当前tqdm正在处理的名称
- Return Dict[str: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
is_input: bool, 如果为True则将 new_field_name 的field设置为input
is_target: bool, 如果为True则将 new_field_name 的field设置为target
ignore_type: bool, 如果为True则将 new_field_name 的field的ignore_type设置为true, 忽略其类型
use_tqdm: bool, 是否使用tqdm显示预处理进度
tqdm_desc: str, 当use_tqdm为True时,可以显示当前tqdm正在处理的名称
- Return List[Any]
里面的元素为func的返回值,所以list长度为DataSet的长度
-
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
- 返回
-
drop
(func, inplace=True)[源代码]¶ func接受一个Instance,返回bool值。返回值为True时,该Instance会被移除或者不会包含在返回的DataSet中。
- 参数
func (callable) -- 接受一个Instance作为参数,返回bool值。为True时删除该instance
inplace (bool) -- 是否在当前DataSet中直接删除instance;如果为False,将返回一个新的DataSet。
- 返回
DataSet
-
split
(ratio, shuffle=True)[源代码]¶ 将DataSet按照ratio的比例拆分,返回两个DataSet
- 参数
ratio (float) -- 0<ratio<1, 返回的第一个DataSet拥有 (1-ratio) 这么多数据,第二个DataSet拥有`ratio`这么多数据
shuffle (bool) -- 在split前是否shuffle一下
- 返回
[
读取后的DataSet
,读取后的DataSet
]
-
static
load
(path)[源代码]¶ 从保存的DataSet pickle文件的路径中读取DataSet
- 参数
path (str) -- 从哪里读取DataSet
- 返回
读取后的
读取后的DataSet
。
-
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。
-
delete_collate_fn
(name=None)[源代码]¶ 删除某个collate_fn
- 参数
name (str,int) -- 如果为None,则删除最近加入的collate_fn
- 返回
-
concat
(dataset, inplace=True, field_mapping=None)[源代码]¶ - 将当前dataset与输入的dataset结合成一个更大的dataset,需要保证两个dataset都包含了相同的field。结合后的dataset的input,target
以及collate_fn以当前dataset为准。当dataset中包含的field多于当前的dataset,则多余的field会被忽略;若dataset中未包含所有 当前dataset含有field,则会报错。
- 参数
dataset (DataSet,) -- 需要和当前dataset concat的dataset
inplace (bool,) -- 是否直接将dataset组合到当前dataset中
field_mapping (dict,) -- 当dataset中的field名称和当前dataset不一致时,需要通过field_mapping把输入的dataset中的field 名称映射到当前field. field_mapping为dict类型,key为dataset中的field名称,value是需要映射成的名称
- 返回
DataSet
-
-
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):
-
-
class
fastNLP.core.field.
AutoPadder
(pad_val=0)[源代码]¶ -
别名
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.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
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))})
losses 模块定义了 fastNLP 中所需的各种损失函数,一般做为 Trainer
的参数使用。
-
class
fastNLP.core.losses.
LossBase
[源代码]¶ 别名
fastNLP.LossBase
fastNLP.core.losses.LossBase
所有loss的基类。如果需要结合到Trainer之中需要实现get_loss方法
-
class
fastNLP.core.losses.
LossFunc
(func, key_map=None, **kwargs)[源代码]¶ -
别名
fastNLP.LossFunc
fastNLP.core.losses.LossFunc
提供给用户使用自定义损失函数的类
- param func
用户自行定义的损失函数,应当为一个函数。
- param dict key_map
参数映射表。键为Model/DataSet参数名,值为损失函数参数名。 fastNLP的trainer将在训练时从模型返回值或者训练数据DataSet的target=True的field中 找到相对应的参数名为value的参数,并传入func中作为参数名为key的参数
- param kwargs
除了参数映射表以外可以用key word args的方式设置参数映射关系
使用方法:
import torch.nn.functional as F loss_func = LossFunc(F.cross_entropy, input="pred", target="label") # 这表示构建了一个损失函数类,由func计算损失函数,其中将从模型返回值或者DataSet的target=True的field # 当中找到一个参数名为`pred`的参数传入func一个参数名为`input`的参数;找到一个参数名为`label`的参数 # 传入func作为一个名为`target`的参数
-
get_loss
(*args, **kwargs)¶ - 参数
args --
kwargs --
- 返回
torch.Tensor
-
class
fastNLP.core.losses.
LossInForward
(loss_key='loss')[源代码]¶ -
别名
fastNLP.LossInForward
fastNLP.core.losses.LossInForward
从forward()函数返回结果中获取loss
-
class
fastNLP.core.losses.
CrossEntropyLoss
(pred=None, target=None, seq_len=None, class_in_dim=- 1, ignore_idx=- 100, reduction='mean', **kwargs)[源代码]¶ -
别名
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 ignore_idx
padding的index,在计算loss时将忽略target中标号为padding_idx的内容, 可以通过该值代替 传入seq_len.
- param str reduction
支持 mean ,sum 和 none .
Example:
loss = CrossEntropyLoss(pred='pred', target='label', padding_idx=0)
-
class
fastNLP.core.losses.
BCELoss
(pred=None, target=None, reduction='mean')[源代码]¶ -
别名
fastNLP.BCELoss
fastNLP.core.losses.BCELoss
二分类交叉熵损失函数
- param pred
参数映射表中 pred 的映射关系,None表示映射关系为 pred -> pred
- param target
参数映射表中 target 的映射关系,None表示映射关系为 target -> target
- param str reduction
支持 mean ,sum 和 none .
-
class
fastNLP.core.losses.
BCEWithLogits
(pred=None, target=None, class_in_dim=- 1, reduction='mean')[源代码]¶ 基类
fastNLP.core.LossBase
别名
fastNLP.BCEWithLogits
fastNLP.core.losses.BCEWithLogits
二分类交叉熵损失函数, 传入数据之前不需要做sigmoid操作
- param pred
参数映射表中 pred 的映射关系,None表示映射关系为 pred -> pred
- param target
参数映射表中 target 的映射关系,None表示映射关系为 target -> target
- param int class_in_dim
在序列标注的场景中,pred可能的shape为(batch_size, max_len, num_classes)
或(batch_size, num_classes, max_len), BCEWithLogits需要知道哪一维是class的维度以计算loss。如果为-1,就根据pred的第 二维是否等于target的第二维来判断是否需要交换pred的第二维和第三维,因为target的第二维是length的维度,如果这一维度上和pred相等, 那么pred可能第二维也是长度维(存在误判的可能,如果有误判的情况,请显示设置该值)。其它大于0的值则认为该维度是class的维度。 :param str reduction: 支持 mean ,sum 和 none .
-
class
fastNLP.core.losses.
L1Loss
(pred=None, target=None, reduction='mean')[源代码]¶ -
别名
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, seq_len=None, class_in_dim=- 1, ignore_idx=- 100, reduction='mean')[源代码]¶ -
别名
fastNLP.NLLLoss
fastNLP.core.losses.NLLLoss
负对数似然损失函数
-
__init__
(pred=None, target=None, seq_len=None, class_in_dim=- 1, ignore_idx=- 100, reduction='mean')[源代码]¶ - 参数
pred -- 参数映射表中 pred 的映射关系,None表示映射关系为 pred -> pred
target -- 参数映射表中 target 的映射关系,None表示映射关系为 target -> target
seq_len -- 句子的长度, 长度之外的token不会计算loss。仅在输出为3d时需要
class_in_dim (int) -- 在序列标注的场景中,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 ignore_idx: ignore的index,在计算loss时将忽略target中标号为ignore_idx的内容, 可以通过该值代替
传入seq_len.
- 参数
reduction (str) -- 支持 mean ,sum 和 none .
-
-
class
fastNLP.core.losses.
MSELoss
(pred=None, target=None, reduction='mean')[源代码]¶ -
别名
fastNLP.MSELoss
fastNLP.core.losses.MSELoss
MSE损失函数
- param pred
参数映射表中 pred 的映射关系,None表示映射关系为 pred -> pred
- param target
参数映射表中 target 的映射关系,None表示映射关系为 target >`target`
- param str reduction
支持'mean','sum'和'none'.
-
class
fastNLP.core.losses.
CMRC2018Loss
(target_start=None, target_end=None, context_len=None, pred_start=None, pred_end=None, reduction='mean')[源代码]¶ -
别名
fastNLP.CMRC2018Loss
fastNLP.core.losses.CMRC2018Loss
用于计算CMRC2018中文问答任务。
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_dict
和target_dict
中进行检查.pred_dict
是模型当中forward()
函数或者predict()
函数的返回值.target_dict
是DataSet当中的ground truth, 判定ground truth的条件是field的is_target
被设置为True.MetricBase
会进行以下的类型检测:self.evaluate当中是否有varargs, 这是不支持的.
self.evaluate当中所需要的参数是否既不在
pred_dict
也不在target_dict
.self.evaluate当中所需要的参数是否既在
pred_dict
也在target_dict
.
除此以外,在参数被传入self.evaluate以前,这个函数会检测
pred_dict
和target_dict
当中没有被用到的参数 如果kwargs是self.evaluate的参数,则不会检测self.evaluate将计算一个批次(batch)的评价指标,并累计。 没有返回值 self.get_metric将统计当前的评价指标并返回评价结果, 返回值需要是一个dict, key是指标名称,value是指标的值
-
class
fastNLP.core.metrics.
AccuracyMetric
(pred=None, target=None, seq_len=None)[源代码]¶ -
别名
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.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) -- micro 或 macro . 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_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.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.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) -- micro 或 macro . 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.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
-
optimizer 模块定义了 fastNLP 中所需的各种优化器,一般做为 Trainer
的参数使用。
-
class
fastNLP.core.optimizer.
Optimizer
(model_params, **kwargs)[源代码]¶ 别名
fastNLP.Optimizer
fastNLP.core.optimizer.Optimizer
Optimizer
-
class
fastNLP.core.optimizer.
SGD
(lr=0.001, momentum=0, model_params=None)[源代码]¶ -
别名
fastNLP.SGD
fastNLP.core.optimizer.SGD
SGD
-
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.Adam
fastNLP.core.optimizer.Adam
Adam
-
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)
-
step
(closure=None)[源代码]¶ Performs a single optimization step.
- 参数
closure -- (callable, optional) A closure that reevaluates the model and returns the loss.
-
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.- Args:
param_group (dict): Specifies what Tensors should be optimized along with group specific optimization options.
-
load_state_dict
(state_dict)¶ Loads the optimizer state.
- Args:
- 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 list containing all parameter groups where each
parameter group is a dict
-
zero_grad
(set_to_none: bool = False)¶ Sets the gradients of all optimized
torch.Tensor
s to zero.- Args:
- set_to_none (bool): instead of setting to zero, set the grads to None.
This will in general have lower memory footprint, and can modestly improve performance. However, it changes certain behaviors. For example: 1. When the user tries to access a gradient and perform manual ops on it, a None attribute or a Tensor full of 0s will behave differently. 2. If the user requests
zero_grad(set_to_none=True)
followed by a backward pass,.grad
s are guaranteed to be None for params that did not receive a gradient. 3.torch.optim
optimizers have a different behavior if the gradient is 0 or None (in one case it does the step with a gradient of 0 and in the other it skips the step altogether).
-
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.BucketSampler
fastNLP.core.sampler.BucketSampler
带Bucket的 Random Sampler. 可以随机地取出长度相似的元素
-
class
fastNLP.core.sampler.
SequentialSampler
[源代码]¶ -
别名
fastNLP.SequentialSampler
fastNLP.core.sampler.SequentialSampler
顺序取出元素的 Sampler
-
__init__
()¶ Initialize self. See help(type(self)) for accurate signature.
-
-
class
fastNLP.core.sampler.
RandomSampler
[源代码]¶ -
别名
fastNLP.RandomSampler
fastNLP.core.sampler.RandomSampler
随机化取元素的 Sampler
-
__init__
()¶ Initialize self. See help(type(self)) for accurate signature.
-
-
class
fastNLP.core.sampler.
SortedSampler
(seq_len_field_name='seq_len', descending=True)[源代码]¶ -
别名
fastNLP.SortedSampler
fastNLP.core.sampler.SortedSampler
按照sample的长度进行排序,主要在测试的时候使用,可以加速测试(因为减少了padding)
-
class
fastNLP.core.sampler.
ConstantTokenNumSampler
(seq_len, max_token=4096, max_sentence=- 1, need_be_multiple_of=1, num_bucket=- 1)[源代码]¶ 别名
fastNLP.ConstantTokenNumSampler
fastNLP.core.sampler.ConstantTokenNumSampler
尽量保证每个batch的输入token数量是接近的。
使用示例 >>> # 假设已经有了tr_data并有一个field叫做seq_len保存了每个instance的token数量 >>> from fastNLP import DataSetIter, Trainer >>> sampler = ConstantTokenNumSampler(tr_data.get_field('seq_len').content, max_token=4096) >>> tr_iter = DataSetIter(tr_data, >>> 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=sampler) >>> >>> # 直接将tr_iter传入Trainer中,此时batch_size参数的值会被忽略 >>> trainer = Trainer(tr_iter, model, optimizer=optimizer, loss=TranslationLoss(), >>> batch_size=1, sampler=None, drop_last=False, update_every=1)
-
__init__
(seq_len, max_token=4096, max_sentence=- 1, need_be_multiple_of=1, num_bucket=- 1)[源代码]¶ - 参数
seq_len (List[int]) -- list[int], 是每个sample的长度。一般可以通过dataset.get_field('seq_len').content传入
max_token (int) -- 每个batch的最大的token数量
max_sentence (int) -- 每个batch最多多少个instance, -1表示根据max_token决定
need_be_multiple_of (int) -- 生成的batch的instance的数量需要是几的倍数,在DataParallel场景下会用到
num_bucket (int) -- 将数据按长度拆分为num_bucket个bucket,batch中的sample尽量在bucket之中进行组合,这样可以减少padding。
-
tester模块实现了 fastNLP 所需的Tester类,能在提供数据、模型以及metric的情况下进行性能测试。
import numpy as np
import torch
from torch import nn
from fastNLP import Tester
from fastNLP import DataSet
from fastNLP import AccuracyMetric
class Model(nn.Module):
def __init__(self):
super().__init__()
self.fc = nn.Linear(1, 1)
def forward(self, a):
return {'pred': self.fc(a.unsqueeze(1)).squeeze(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')
tester = Tester(dataset, model, metrics=AccuracyMetric())
eval_results = tester.test()
这里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, fp16=False, **kwargs)[源代码]¶ 别名
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, fp16=False, **kwargs)[源代码]¶ - 参数
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不对模型 的计算位置进行管理。支持以下的输入:
str: ['cpu', 'cuda', 'cuda:0', 'cuda:1', ...] 依次为'cpu'中, 可见的第一个GPU中,可见的第一个GPU中,可见的第二个GPU中;
torch.device:将模型装载到torch.device上。
int: 将使用device_id为该值的gpu进行训练
list(int):如果多于1个device,将使用torch.nn.DataParallel包裹model, 并使用传入的device。
None. 为None则不对模型进行任何处理,如果传入的model为torch.nn.DataParallel该值必须为None。
如果模型是通过predict()进行预测的话,那么将不能使用多卡(DataParallel)进行验证,只会使用第一张卡上的模型。
verbose (int) -- 如果为0不输出任何信息; 如果为1,打印出验证结果。
use_tqdm (bool) -- 是否使用tqdm来显示测试进度; 如果为False,则不会显示任何内容。
fp16 (bool) -- 是否使用float16进行验证
kwargs -- Sampler sampler: 支持传入sampler控制测试顺序 bool pin_memory: 是否将产生的tensor使用pin memory, 可能会加快数据速度。
-
Trainer在fastNLP中用于组织单任务的训练过程,可以避免用户在不同训练任务中重复撰以下步骤的代码
epoch循环;
将数据分成不同的Batch;
对Batch进行pad;
每个epoch结束或一定step后进行验证集验证;
保存获得更好验证性能的模型。
下面的例子是使用神经网络来进行预测一个序列中是否有偶数个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 模型的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。
fastNLP中的为了不限制forward函数的返回内容数量(比如一些复杂任务需要返回多个内容,如Dependency Parsing,
Loss
与 Metric
都使用了通过名称来匹配相应内容的策略。如上面的例子中
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
。
Metric
使用了与上述Loss一样的策略,即使用名称进行匹配。
AccuracyMetric(target='label')的情况与CrossEntropyLoss 是同理的。
在进行验证时,可能用到的计算与forward()中不太一致,没有办法直接从forward()的结果中得到预测值,这时模型可以提供一个predict()方法, 如果提供的模型具有predict方法,则在模型验证时将调用predict()方法获取预测结果, 传入到predict()的参数也是从DataSet中被设置为input的field中选择出来的; 与forward()一样,返回值需要为一个dict。
由于在fastNLP中采取了映射的机制,所以难免可能存在对应出错的情况。Trainer提供一种映射检查机制,可以通过check_code_level来进行控制 比如下面的例子中,由于各种原因产生的报错
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计算的时候找不到需要的值
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)判断出来的); 报错的原因是因为 pred 和 label (我们在初始化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时如果出现错误会发生的报错,
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,即进行检查。
虽然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, fp16=False, **kwargs)[源代码]¶ 别名
fastNLP.Trainer
fastNLP.core.trainer.Trainer
- Trainer在fastNLP中用于组织单任务的训练过程,可以避免用户在不同训练任务中重复撰写
epoch循环;
将数据分成不同的Batch;
对Batch进行pad;
每个epoch结束或一定step后进行验证集验证;
保存获得更好验证性能的模型等。
详细的介绍参见
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, fp16=False, **kwargs)[源代码]¶ - 参数
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中;
torch.device:将模型装载到torch.device上。
int: 将使用device_id为该值的gpu进行训练
list(int):如果多于1个device,将使用torch.nn.DataParallel包裹model, 并使用传入的device。
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。
fp16 (bool) -- 是否使用fp16进行训练。
kwargs --
支持配置可选参数 bool test_use_tqdm: 在dev上验证的时候是否开启tqdm Sampler test_sampler: 在evaluate的时候使用的sampler bool test_use_fp16: evalute的时候是否使用fp16测试,默认与fp16相同的取值。 bool set_grad_to_none: 在zero_grad的时候是否将gradient设置为None,而不是设置为zero GradScaler grad_scaler: 仅在fp16为True时有效,如果不使用torch.cuda.amp.GradScaler的初始化参数,可传入一个已经初始化后的
grad_scaler。
bool pin_memory: 是否将产生的tensor使用pin memory, 可能会加快数据速度。
-
train
(load_best_model=True, on_exception='auto', **kwargs)[源代码]¶ 使用该函数使Trainer开始训练。
- param bool load_best_model
该参数只有在初始化提供了dev_data的情况下有效,如果True, trainer将在返回之前重新加载dev表现 最好的模型参数。
- param str on_exception
在训练过程遭遇exception,并被 :py:class:Callback 的on_exception()处理后,是否继续抛出异常。 支持'ignore','raise', 'auto': 'ignore'将捕获异常,写在Trainer.train()后面的代码将继续运行; 'raise'将异常抛出; 'auto'将ignore以下两种Exception: CallbackException与KeyboardInterrupt, raise其它exception.
- 参数
kwargs --
int verbose: 为1时在发生异常时会打印异常发生时batch中的数据在dataset中的index
- 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)更新取得的最佳值
-
property
is_master
¶ 是否是主进程
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 = torch.arange(2, 16) >>> mask = seq_len_to_mask(seq_len) >>> print(mask.size()) torch.Size([14, 15]) >>> seq_len = np.arange(2, 16) >>> mask = seq_len_to_mask(seq_len) >>> print(mask.shape) (14, 15) >>> seq_len = torch.arange(2, 16) >>> mask = seq_len_to_mask(seq_len, max_len=100) >>>print(mask.size()) torch.Size([14, 100])
- 参数
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,)
-
class
fastNLP.core.vocabulary.
Vocabulary
(max_size=None, min_freq=None, padding='<pad>', unknown='<unk>')[源代码]¶ 别名
fastNLP.Vocabulary
fastNLP.core.vocabulary.Vocabulary
用于构建, 存储和使用 str 到 int 的一一映射:
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>'
-
update
(word_lst, no_create_entry=False)[源代码]¶ 依次增加序列中词在词典中的出现频率
- 参数
word_lst (list) -- a list of strings
no_create_entry (bool) -- 如果词语来自于非训练集建议设置为True。在使用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, no_create_entry=False)[源代码]¶ 增加一个新词在词典中的出现频率
- 参数
word (str) -- 新词
no_create_entry (bool) -- 如果词语来自于非训练集建议设置为True。在使用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) -- 如果词语来自于非训练集建议设置为True。在使用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) -- 如果词语来自于非训练集建议设置为True。在使用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的。
-
has_word
(w)[源代码]¶ 检查词是否被记录:
has_abc = vocab.has_word('abc') # equals to has_abc = 'abc' in vocab
- 参数
item -- the word
- 返回
True
orFalse
-
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')
-
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')
- 参数
field_name (str,List[str]) -- 可为
str
或List[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
-
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
-
property
unknown_idx
¶ unknown 对应的数字.
-
property
padding_idx
¶ padding 对应的数字
-
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_dim 或 self.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]
-
property
requires_grad
¶ Embedding的参数是否允许优化。True: 所有参数运行优化; False: 所有参数不允许优化; None: 部分允许优化、部分不允许 :return:
-
training
: bool¶
-
-
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
- 返回
-
property
requires_grad
¶ Embedding的参数是否允许优化。True: 所有参数运行优化; False: 所有参数不允许优化; None: 部分允许优化、部分不允许 :return:
-
training
: bool¶
-
property
num_embeddings
¶ 这个值可能会大于实际的embedding矩阵的大小。 :return:
-
-
class
fastNLP.embeddings.
StaticEmbedding
(vocab: fastNLP.core.vocabulary.Vocabulary, model_dir_or_name: Optional[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: Optional[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) -- 词表. StaticEmbedding只会加载包含在词表中的词的词向量,在预训练向量中没找到的使用随机初始化
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: 默认为False, 是否仅对在预训练中找到的词语使用normalize; bool only_use_pretrain_word: 默认为False, 仅使用出现在pretrain词表中的词,如果该词没有在预训练的词表中出现则为unk。如果embedding不需要更新建议设置为True。
-
forward
(words)[源代码]¶ 传入words的index
- 参数
words -- torch.LongTensor, [batch_size, max_len]
- 返回
torch.FloatTensor, [batch_size, max_len, embed_size]
-
save
(folder)[源代码]¶ 将embedding存储到folder下,之后可以通过使用load方法读取
- 参数
folder (str) -- 会在该folder下生成三个文件, vocab.txt, static_embed_hyper.txt, static_embed_hyper.json. 其中vocab.txt可以用Vocabulary通过load读取; embedding.txt按照word2vec的方式存储,以空格的方式隔开元素, 第一行只有两个元素,剩下的行首先是word然后是各个维度的值; static_embed_hyper.json是StaticEmbedding的超参数
- 返回
-
classmethod
load
(folder)[源代码]¶ - 参数
folder (str) -- 该folder下应该有以下三个文件vocab.txt, static_embed.txt, static_hyper.json
- 返回
-
training
: bool¶
-
-
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。
-
set_mix_weights_requires_grad
(flag=True)[源代码]¶ 当初始化ElmoEmbedding时layers被设置为mix时,可以通过调用该方法设置mix weights是否可训练。如果layers不是mix,调用 该方法没有用。
- 参数
flag (bool) -- 混合不同层表示的结果是否可以训练。
- 返回
-
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))
-
training
: 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 -- int min_freq: 小于该次数的词会被unk代替, 默认为1
-
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))
-
drop_word
(words)[源代码]¶ 按照设定随机将words设置为unknown_index。
- 参数
words (torch.LongTensor) -- batch_size x max_len
- 返回
-
save
(folder)[源代码]¶ - 将embedding保存到folder这个目录下,将会保存三个文件vocab.txt, bert_embed_hyper.txt, bert_embed/, 其中bert_embed下包含
config.json,pytorch_model.bin,vocab.txt三个文件(该folder下的数据也可以直接被BERTModel读取)
- 参数
folder (str) --
- 返回
-
classmethod
load
(folder)[源代码]¶ 给定一个folder, 需要包含以下三个内容vocab.txt, bert_embed_hyper.txt, bert_embed/
- 参数
folder (str) --
- 返回
-
training
: bool¶
-
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, **kwargs)[源代码]¶ 别名
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, **kwargs)[源代码]¶ - 参数
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。
-
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]。
- 返回
-
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))
-
drop_word
(words)[源代码]¶ 按照设定随机将words设置为unknown_index。
- 参数
words (torch.LongTensor) -- batch_size x max_len
- 返回
-
save
(folder)[源代码]¶ - 会在folder下创建两个文件bert_encoder_hyper.json与bert_encoder/, bert_encoder下包含三个文件config.json,
pytorch_model.bin,vocab.txt三个文件(该folder下的数据也可以直接被BERTModel读取)
- 参数
folder (str) --
- 返回
-
classmethod
load
(folder)[源代码]¶ 会在folder下创建两个文件bert_encoder_hyper.json与bert_encoder/, bert_encoder下包含三个文件
- 参数
folder --
- 返回
-
training
: bool¶
-
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:
-
property
embed_size
¶ 该Embedding输出的vector的最后一维的维度。 :return:
-
forward
(words)[源代码]¶ 得到多个embedding的结果,并把结果按照顺序concat起来。
- 参数
words -- batch_size x max_len
- 返回
返回的shape和当前这个stack embedding中embedding的组成有关
-
training
: bool¶
-
-
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增加特殊标示符号;
-
training
: bool¶
-
-
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]
-
training
: bool¶
-
-
fastNLP.embeddings.
get_embeddings
(init_embed, padding_idx=None)[源代码]¶ 别名
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初始化。
padding_idx -- 当传入tuple时,padding_idx有效
- Return nn.Embedding
embeddings
子模块¶
-
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 -- int min_freq: 小于该次数的词会被unk代替, 默认为1
-
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))
-
drop_word
(words)[源代码]¶ 按照设定随机将words设置为unknown_index。
- 参数
words (torch.LongTensor) -- batch_size x max_len
- 返回
-
save
(folder)[源代码]¶ - 将embedding保存到folder这个目录下,将会保存三个文件vocab.txt, bert_embed_hyper.txt, bert_embed/, 其中bert_embed下包含
config.json,pytorch_model.bin,vocab.txt三个文件(该folder下的数据也可以直接被BERTModel读取)
- 参数
folder (str) --
- 返回
-
classmethod
load
(folder)[源代码]¶ 给定一个folder, 需要包含以下三个内容vocab.txt, bert_embed_hyper.txt, bert_embed/
- 参数
folder (str) --
- 返回
-
training
: bool¶
-
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, **kwargs)[源代码]¶ 别名
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, **kwargs)[源代码]¶ - 参数
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。
-
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]。
- 返回
-
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))
-
drop_word
(words)[源代码]¶ 按照设定随机将words设置为unknown_index。
- 参数
words (torch.LongTensor) -- batch_size x max_len
- 返回
-
save
(folder)[源代码]¶ - 会在folder下创建两个文件bert_encoder_hyper.json与bert_encoder/, bert_encoder下包含三个文件config.json,
pytorch_model.bin,vocab.txt三个文件(该folder下的数据也可以直接被BERTModel读取)
- 参数
folder (str) --
- 返回
-
classmethod
load
(folder)[源代码]¶ 会在folder下创建两个文件bert_encoder_hyper.json与bert_encoder/, bert_encoder下包含三个文件
- 参数
folder --
- 返回
-
training
: bool¶
该文件中主要包含的是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]
-
training
: bool¶
-
-
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增加特殊标示符号;
-
training
: bool¶
-
-
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动态模型的情况下,删除权重会大量减少内存占用。
- 返回
-
training
: bool¶
-
-
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。
-
set_mix_weights_requires_grad
(flag=True)[源代码]¶ 当初始化ElmoEmbedding时layers被设置为mix时,可以通过调用该方法设置mix weights是否可训练。如果layers不是mix,调用 该方法没有用。
- 参数
flag (bool) -- 混合不同层表示的结果是否可以训练。
- 返回
-
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))
-
training
: bool¶
-
该模块中的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]
-
property
requires_grad
¶ Embedding的参数是否允许优化。True: 所有参数运行优化; False: 所有参数不允许优化; None: 部分允许优化、部分不允许 :return:
-
training
: bool¶
-
-
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
- 返回
-
property
requires_grad
¶ Embedding的参数是否允许优化。True: 所有参数运行优化; False: 所有参数不允许优化; None: 部分允许优化、部分不允许 :return:
-
training
: bool¶
-
property
num_embeddings
¶ 这个值可能会大于实际的embedding矩阵的大小。 :return:
-
-
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:
-
property
embed_size
¶ 该Embedding输出的vector的最后一维的维度。 :return:
-
forward
(words)[源代码]¶ 得到多个embedding的结果,并把结果按照顺序concat起来。
- 参数
words -- batch_size x max_len
- 返回
返回的shape和当前这个stack embedding中embedding的组成有关
-
training
: bool¶
-
-
class
fastNLP.embeddings.static_embedding.
StaticEmbedding
(vocab: fastNLP.core.vocabulary.Vocabulary, model_dir_or_name: Optional[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: Optional[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) -- 词表. StaticEmbedding只会加载包含在词表中的词的词向量,在预训练向量中没找到的使用随机初始化
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: 默认为False, 是否仅对在预训练中找到的词语使用normalize; bool only_use_pretrain_word: 默认为False, 仅使用出现在pretrain词表中的词,如果该词没有在预训练的词表中出现则为unk。如果embedding不需要更新建议设置为True。
-
forward
(words)[源代码]¶ 传入words的index
- 参数
words -- torch.LongTensor, [batch_size, max_len]
- 返回
torch.FloatTensor, [batch_size, max_len, embed_size]
-
save
(folder)[源代码]¶ 将embedding存储到folder下,之后可以通过使用load方法读取
- 参数
folder (str) -- 会在该folder下生成三个文件, vocab.txt, static_embed_hyper.txt, static_embed_hyper.json. 其中vocab.txt可以用Vocabulary通过load读取; embedding.txt按照word2vec的方式存储,以空格的方式隔开元素, 第一行只有两个元素,剩下的行首先是word然后是各个维度的值; static_embed_hyper.json是StaticEmbedding的超参数
- 返回
-
classmethod
load
(folder)[源代码]¶ - 参数
folder (str) -- 该folder下应该有以下三个文件vocab.txt, static_embed.txt, static_hyper.json
- 返回
-
training
: bool¶
-
-
fastNLP.embeddings.utils.
get_embeddings
(init_embed, padding_idx=None)[源代码]¶ 别名
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初始化。
padding_idx -- 当传入tuple时,padding_idx有效
- Return nn.Embedding
embeddings
fastNLP.io¶
用于IO的模块, 具体包括:
用于读入 embedding 的
EmbedLoader
类,用于读入不同格式数据的
Loader
类用于处理读入数据的
Pipe
类用于保存和载入模型的类, 参考
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
类型的dictdatasets -- 从名称(字符串)到
DataSet
类型的dict。建议不要将相同的DataSet对象重复传入,可能会在 使用Pipe处理数据的时候遇到问题,若多个数据集确需一致,请手动deepcopy后传入。
-
set_vocab
(vocab, field_name)[源代码]¶ 向DataBunlde中增加vocab
- 参数
vocab (Vocabulary) -- 词表
field_name (str) -- 这个vocab对应的field名称
- 返回
self
-
set_dataset
(dataset, name: str)[源代码]¶ - 参数
dataset (DataSet) -- 传递给DataBundle的DataSet
name (str) -- dataset的名称
- 返回
self
-
get_dataset
(name: str) → fastNLP.core.dataset.DataSet[源代码]¶ 获取名为name的dataset
- 参数
name (str) -- dataset的名称,一般为'train', 'dev', 'test'
- 返回
DataSet
-
get_vocab
(field_name: str) → fastNLP.core.vocabulary.Vocabulary[源代码]¶ 获取field名为field_name对应的vocab
- 参数
field_name (str) -- 名称
- 返回
Vocabulary
-
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_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_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_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
-
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
-
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
-
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
-
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
- 返回
-
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
is_input: bool, 如果为True则将名为 new_field_name 的field设置为input
is_target: bool, 如果为True则将名为 new_field_name 的field设置为target
ignore_type: bool, 如果为True则将名为 new_field_name 的field的ignore_type设置为true, 忽略其类型
use_tqdm: bool, 是否显示tqdm进度条
tqdm_desc: str, 当use_tqdm为True时,可以显示当前tqdm正在处理的名称
-
apply_field_more
(func, field_name, modify_fields=True, ignore_miss_dataset=True, **kwargs)[源代码]¶ 对
DataBundle
中所有的 dataset 使用apply_field_more()
方法注解
apply_field_more
与apply_field
的区别参考fastNLP.DataSet.apply_more()
中关于apply_more
与apply
区别的介绍。- 参数
func (callable) -- 参数是
DataSet
中的Instance
,返回值是一个字典,key 是field 的名字,value 是对应的结果field_name (str) -- 传入func的是哪个field。
modify_fields (bool) -- 是否用结果修改 DataSet 中的 Field, 默认为 True
ignore_miss_dataset (bool) -- 当某个field名称在某个dataset不存在时,如果为True,则直接忽略该DataSet; 如果为False,则报错
kwargs (optional) --
支持输入is_input, is_target, ignore_type
is_input: bool, 如果为True则将被修改的field设置为input
is_target: bool, 如果为True则将被修改的field设置为target
ignore_type: bool, 如果为True则将被修改的field的ignore_type设置为true, 忽略其类型
use_tqdm: bool, 是否显示tqdm进度条
tqdm_desc: str, 当use_tqdm为True时,可以显示当前tqdm正在处理的名称
- Return Dict[str:Dict[str:Field]]
返回一个字典套字典,第一层的 key 是 dataset 的名字,第二层的 key 是 field 的名字
-
apply
(func, new_field_name: str, **kwargs)[源代码]¶ 对
DataBundle
中所有的 dataset 使用apply()
方法对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
is_input: bool, 如果为True则将名为 new_field_name 的field设置为input
is_target: bool, 如果为True则将名为 new_field_name 的field设置为target
ignore_type: bool, 如果为True则将名为 new_field_name 的field的ignore_type设置为true, 忽略其类型
use_tqdm: bool, 是否显示tqdm进度条
tqdm_desc: str, 当use_tqdm为True时,可以显示当前tqdm正在处理的名称
-
apply_more
(func, modify_fields=True, **kwargs)[源代码]¶ 对
DataBundle
中所有的 dataset 使用apply_more()
方法注解
apply_more
与apply
的区别参考fastNLP.DataSet.apply_more()
中关于apply_more
与apply
区别的介绍。- 参数
func (callable) -- 参数是
DataSet
中的Instance
,返回值是一个字典,key 是field 的名字,value 是对应的结果modify_fields (bool) -- 是否用结果修改
DataSet
中的Field
, 默认为 Truekwargs (optional) --
支持输入is_input,is_target,ignore_type
is_input: bool, 如果为True则将被修改的的field设置为input
is_target: bool, 如果为True则将被修改的的field设置为target
ignore_type: bool, 如果为True则将被修改的的field的ignore_type设置为true, 忽略其类型
use_tqdm: bool, 是否显示tqdm进度条
tqdm_desc: str, 当use_tqdm为True时,可以显示当前tqdm正在处理的名称
- Return Dict[str:Dict[str:Field]]
返回一个字典套字典,第一层的 key 是 dataset 的名字,第二层的 key 是 field 的名字
-
-
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的顺序是一一对应的。
-
static
-
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中并返回
-
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.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.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.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。
-
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.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.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.THUCNewsLoader
fastNLP.io.loader.THUCNewsLoader
数据集简介:document-level分类任务,新闻10分类 原始数据内容为:每行一个sample,第一个 "\t" 之前为target,第一个 "\t" 之后为raw_words
Example:
体育 调查-您如何评价热火客场胜绿军总分3-1夺赛点?...
读取后的Dataset将具有以下数据结构:
raw_words
target
调查-您如何评价热火客场胜绿军总分3-1夺赛点?...
体育
...
...
-
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.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, sep=None, indexes=None, dropna=True)[源代码]¶ -
别名
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, sep=None, indexes=None, dropna=True)[源代码]¶ - 参数
headers (list) -- 每一列数据的名称,需为List or Tuple of str。
header
与indexes
一一对应sep (list) -- 指定分隔符,默认为制表符
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.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.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.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.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.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.JsonLoader
fastNLP.io.loader.JsonLoader
别名:
fastNLP.io.JsonLoader
fastNLP.io.loader.JsonLoader
读取json格式数据.数据必须按行存储,每行是一个包含各类属性的json对象
- param dict fields
需要读入的json属性名称, 和读入后在DataSet中存储的field_name
fields
的 key 必须是json对象的属性名.fields
的 value 为读入后在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.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.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
...
...
...
-
load
(paths: str = None)[源代码]¶ - 参数
paths (str) -- 传入数据所在目录,会在该目录下寻找dev_matched.tsv, dev_mismatched.tsv, test_matched.tsv, test_mismatched.tsv, train.tsv文件夹
- 返回
DataBundle
-
download
()[源代码]¶ 如果你使用了这个数据,请引用
https://www.nyu.edu/projects/bowman/multinli/paper.pdf :return:
-
-
class
fastNLP.io.
QuoraLoader
[源代码]¶ -
别名
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.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.
...
...
...
-
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
-
download
()[源代码]¶ 如果您的文章使用了这份数据,请引用
http://nlp.stanford.edu/pubs/snli_paper.pdf
- 返回
str
-
-
class
fastNLP.io.
QNLILoader
[源代码]¶ -
别名
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.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.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.05053 在 https://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.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.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.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函数可接受的类型。
-
process
(data_bundle: fastNLP.io.data_bundle.DataBundle) → fastNLP.io.data_bundle.DataBundle[源代码]¶ 对输入的DataBundle进行处理,然后返回该DataBundle。
- 参数
data_bundle (DataBundle) -- 需要处理的DataBundle对象
- 返回
DataBundle
-
process_from_file
(paths: str) → fastNLP.io.data_bundle.DataBundle[源代码]¶ 传入文件路径,生成处理好的DataBundle对象。paths支持的路径形式可以参考 :
fastNLP.io.Loader.load()
- 参数
paths (str) --
- 返回
DataBundle
-
__init__
()¶ Initialize self. See help(type(self)) for accurate signature.
-
-
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 --
- 返回
-
-
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 --
- 返回
-
-
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使用空格作为切分。
-
-
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 --
- 返回
-
-
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 --
- 返回
-
-
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.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.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
-
-
class
fastNLP.io.
Conll2003Pipe
(chunk_encoding_type='bioes', ner_encoding_type='bioes', lower: bool = False)[源代码]¶ -
别名
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
-
-
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 | +-------------+-----------+--------+-------+---------+
-
process_from_file
(paths) → fastNLP.io.data_bundle.DataBundle[源代码]¶ - 参数
paths -- 支持路径类型参见
fastNLP.io.loader.ConllLoader
的load函数。- 返回
DataBundle
-
__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.
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 | +-------------+-----------+--------+-------+---------+
-
process_from_file
(paths) → fastNLP.io.data_bundle.DataBundle[源代码]¶ - 参数
paths -- 支持路径类型参见
fastNLP.io.loader.ConllLoader
的load函数。- 返回
DataBundle
-
__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.
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.
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.
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.
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.
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.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.
MatchingBertPipe
(lower=False, tokenizer: str = 'raw')[源代码]¶ -
别名
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: str) → fastNLP.io.data_bundle.DataBundle¶ 传入文件路径,生成处理好的DataBundle对象。paths支持的路径形式可以参考 :
fastNLP.io.Loader.load()
- 参数
paths (str) --
- 返回
DataBundle
-
-
class
fastNLP.io.
MatchingPipe
(lower=False, tokenizer: str = 'raw')[源代码]¶ -
别名
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: str) → fastNLP.io.data_bundle.DataBundle¶ 传入文件路径,生成处理好的DataBundle对象。paths支持的路径形式可以参考 :
fastNLP.io.Loader.load()
- 参数
paths (str) --
- 返回
DataBundle
-
-
class
fastNLP.io.
CMRC2018BertPipe
(max_len=510)[源代码]¶ -
别名
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
用于读取模型
-
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)
子模块¶
-
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
类型的dictdatasets -- 从名称(字符串)到
DataSet
类型的dict。建议不要将相同的DataSet对象重复传入,可能会在 使用Pipe处理数据的时候遇到问题,若多个数据集确需一致,请手动deepcopy后传入。
-
set_vocab
(vocab, field_name)[源代码]¶ 向DataBunlde中增加vocab
- 参数
vocab (Vocabulary) -- 词表
field_name (str) -- 这个vocab对应的field名称
- 返回
self
-
set_dataset
(dataset, name: str)[源代码]¶ - 参数
dataset (DataSet) -- 传递给DataBundle的DataSet
name (str) -- dataset的名称
- 返回
self
-
get_dataset
(name: str) → fastNLP.core.dataset.DataSet[源代码]¶ 获取名为name的dataset
- 参数
name (str) -- dataset的名称,一般为'train', 'dev', 'test'
- 返回
DataSet
-
get_vocab
(field_name: str) → fastNLP.core.vocabulary.Vocabulary[源代码]¶ 获取field名为field_name对应的vocab
- 参数
field_name (str) -- 名称
- 返回
Vocabulary
-
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_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_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_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
-
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
-
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
-
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
-
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
- 返回
-
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
is_input: bool, 如果为True则将名为 new_field_name 的field设置为input
is_target: bool, 如果为True则将名为 new_field_name 的field设置为target
ignore_type: bool, 如果为True则将名为 new_field_name 的field的ignore_type设置为true, 忽略其类型
use_tqdm: bool, 是否显示tqdm进度条
tqdm_desc: str, 当use_tqdm为True时,可以显示当前tqdm正在处理的名称
-
apply_field_more
(func, field_name, modify_fields=True, ignore_miss_dataset=True, **kwargs)[源代码]¶ 对
DataBundle
中所有的 dataset 使用apply_field_more()
方法注解
apply_field_more
与apply_field
的区别参考fastNLP.DataSet.apply_more()
中关于apply_more
与apply
区别的介绍。- 参数
func (callable) -- 参数是
DataSet
中的Instance
,返回值是一个字典,key 是field 的名字,value 是对应的结果field_name (str) -- 传入func的是哪个field。
modify_fields (bool) -- 是否用结果修改 DataSet 中的 Field, 默认为 True
ignore_miss_dataset (bool) -- 当某个field名称在某个dataset不存在时,如果为True,则直接忽略该DataSet; 如果为False,则报错
kwargs (optional) --
支持输入is_input, is_target, ignore_type
is_input: bool, 如果为True则将被修改的field设置为input
is_target: bool, 如果为True则将被修改的field设置为target
ignore_type: bool, 如果为True则将被修改的field的ignore_type设置为true, 忽略其类型
use_tqdm: bool, 是否显示tqdm进度条
tqdm_desc: str, 当use_tqdm为True时,可以显示当前tqdm正在处理的名称
- Return Dict[str:Dict[str:Field]]
返回一个字典套字典,第一层的 key 是 dataset 的名字,第二层的 key 是 field 的名字
-
apply
(func, new_field_name: str, **kwargs)[源代码]¶ 对
DataBundle
中所有的 dataset 使用apply()
方法对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
is_input: bool, 如果为True则将名为 new_field_name 的field设置为input
is_target: bool, 如果为True则将名为 new_field_name 的field设置为target
ignore_type: bool, 如果为True则将名为 new_field_name 的field的ignore_type设置为true, 忽略其类型
use_tqdm: bool, 是否显示tqdm进度条
tqdm_desc: str, 当use_tqdm为True时,可以显示当前tqdm正在处理的名称
-
apply_more
(func, modify_fields=True, **kwargs)[源代码]¶ 对
DataBundle
中所有的 dataset 使用apply_more()
方法注解
apply_more
与apply
的区别参考fastNLP.DataSet.apply_more()
中关于apply_more
与apply
区别的介绍。- 参数
func (callable) -- 参数是
DataSet
中的Instance
,返回值是一个字典,key 是field 的名字,value 是对应的结果modify_fields (bool) -- 是否用结果修改
DataSet
中的Field
, 默认为 Truekwargs (optional) --
支持输入is_input,is_target,ignore_type
is_input: bool, 如果为True则将被修改的的field设置为input
is_target: bool, 如果为True则将被修改的的field设置为target
ignore_type: bool, 如果为True则将被修改的的field的ignore_type设置为true, 忽略其类型
use_tqdm: bool, 是否显示tqdm进度条
tqdm_desc: str, 当use_tqdm为True时,可以显示当前tqdm正在处理的名称
- Return Dict[str:Dict[str:Field]]
返回一个字典套字典,第一层的 key 是 dataset 的名字,第二层的 key 是 field 的名字
-
-
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的顺序是一一对应的。
-
static
-
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}下寻找这个文件,
如果cache_dir=None, 则cache_dir=~/.fastNLP/; 否则cache_dir=cache_dir
如果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 目录
- 返回
路径
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中并返回
-
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.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.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.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。
-
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.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.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.THUCNewsLoader
fastNLP.io.loader.THUCNewsLoader
数据集简介:document-level分类任务,新闻10分类 原始数据内容为:每行一个sample,第一个 "\t" 之前为target,第一个 "\t" 之后为raw_words
Example:
体育 调查-您如何评价热火客场胜绿军总分3-1夺赛点?...
读取后的Dataset将具有以下数据结构:
raw_words
target
调查-您如何评价热火客场胜绿军总分3-1夺赛点?...
体育
...
...
-
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.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, sep=None, indexes=None, dropna=True)[源代码]¶ -
别名
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, sep=None, indexes=None, dropna=True)[源代码]¶ - 参数
headers (list) -- 每一列数据的名称,需为List or Tuple of str。
header
与indexes
一一对应sep (list) -- 指定分隔符,默认为制表符
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.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.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.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.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.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.JsonLoader
fastNLP.io.loader.JsonLoader
别名:
fastNLP.io.JsonLoader
fastNLP.io.loader.JsonLoader
读取json格式数据.数据必须按行存储,每行是一个包含各类属性的json对象
- param dict fields
需要读入的json属性名称, 和读入后在DataSet中存储的field_name
fields
的 key 必须是json对象的属性名.fields
的 value 为读入后在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.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.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
...
...
...
-
load
(paths: str = None)[源代码]¶ - 参数
paths (str) -- 传入数据所在目录,会在该目录下寻找dev_matched.tsv, dev_mismatched.tsv, test_matched.tsv, test_mismatched.tsv, train.tsv文件夹
- 返回
DataBundle
-
download
()[源代码]¶ 如果你使用了这个数据,请引用
https://www.nyu.edu/projects/bowman/multinli/paper.pdf :return:
-
-
class
fastNLP.io.loader.
QuoraLoader
[源代码]¶ -
别名
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.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.
...
...
...
-
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
-
download
()[源代码]¶ 如果您的文章使用了这份数据,请引用
http://nlp.stanford.edu/pubs/snli_paper.pdf
- 返回
str
-
-
class
fastNLP.io.loader.
QNLILoader
[源代码]¶ -
别名
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.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.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.05053 在 https://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.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.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.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.model_io.
ModelLoader
[源代码]¶ 别名
fastNLP.io.ModelLoader
fastNLP.io.model_io.ModelLoader
用于读取模型
-
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)
Pipe用于处理通过 Loader 读取的数据,所有的 Pipe 都包含 process
和 process_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函数可接受的类型。
-
process
(data_bundle: fastNLP.io.data_bundle.DataBundle) → fastNLP.io.data_bundle.DataBundle[源代码]¶ 对输入的DataBundle进行处理,然后返回该DataBundle。
- 参数
data_bundle (DataBundle) -- 需要处理的DataBundle对象
- 返回
DataBundle
-
process_from_file
(paths: str) → fastNLP.io.data_bundle.DataBundle[源代码]¶ 传入文件路径,生成处理好的DataBundle对象。paths支持的路径形式可以参考 :
fastNLP.io.Loader.load()
- 参数
paths (str) --
- 返回
DataBundle
-
__init__
()¶ Initialize self. See help(type(self)) for accurate signature.
-
-
class
fastNLP.io.pipe.
CWSPipe
(dataset_name=None, encoding_type='bmes', replace_num_alpha=True, bigrams=False, trigrams=False)[源代码]¶ -
别名
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 --
- 返回
-
-
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 --
- 返回
-
-
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使用空格作为切分。
-
-
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 --
- 返回
-
-
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 --
- 返回
-
-
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.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 | +-------------+-----------+--------+-------+---------+
-
process_from_file
(paths) → fastNLP.io.data_bundle.DataBundle[源代码]¶ - 参数
paths -- 支持路径类型参见
fastNLP.io.loader.ConllLoader
的load函数。- 返回
DataBundle
-
__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.
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.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
-
-
class
fastNLP.io.pipe.
MatchingBertPipe
(lower=False, tokenizer: str = 'raw')[源代码]¶ -
别名
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: str) → fastNLP.io.data_bundle.DataBundle¶ 传入文件路径,生成处理好的DataBundle对象。paths支持的路径形式可以参考 :
fastNLP.io.Loader.load()
- 参数
paths (str) --
- 返回
DataBundle
-
-
class
fastNLP.io.pipe.
MatchingPipe
(lower=False, tokenizer: str = 'raw')[源代码]¶ -
别名
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: str) → fastNLP.io.data_bundle.DataBundle¶ 传入文件路径,生成处理好的DataBundle对象。paths支持的路径形式可以参考 :
fastNLP.io.Loader.load()
- 参数
paths (str) --
- 返回
DataBundle
-
-
class
fastNLP.io.pipe.
CoReferencePipe
(config)[源代码]¶ -
别名
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.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.
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
模块中内置了如 CNNText
、
SeqLabeling
等完整的模型,以供用户直接使用。
-
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, ]
-
training
: bool¶
-
-
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]
-
training
: bool¶
-
-
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
-
training
: bool¶
-
-
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 --
- 返回
-
training
: bool¶
-
-
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 节点, 详见论文
-
training
: bool¶
-
-
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] 输出序列中每个元素的分类
-
training
: bool¶
-
-
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] 输出分类的概率
-
training
: bool¶
-
-
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] 输出序列的分类
-
training
: bool¶
-
-
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.BiaffineParser
fastNLP.models.biaffine_parser.BiaffineParser
Biaffine Dependency Parser 实现. 论文参考 Deep Biaffine Attention for Neural Dependency Parsing (Dozat and Manning, 2016) .
-
__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
-
training
: bool¶
-
-
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)预测结果
-
training
: bool¶
-
static
-
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)[源代码]¶ 输入为 [[w1, w2, w3, ...], [...]], BERTEmbedding会在开头和结尾额外加入[CLS]与[SEP] :param torch.LongTensor words: [batch_size, seq_len] :return: {
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]
-
training
: bool¶
-
-
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的格式为 [sent1] + [SEP] + [sent2](BertEmbedding会在开头加入[CLS]和在结尾加入[SEP]),输出为batch_size x num_labels
- 参数
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]
-
training
: bool¶
-
-
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]
-
training
: bool¶
-
-
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]
-
training
: bool¶
-
-
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为question + [SEP] + [paragraph],BERTEmbedding在之后会额外加入开头的[CLS]和结尾的[SEP]. note:
如果BERTEmbedding中include_cls_sep=True,则输出的start和end index相对输入words会增加一位;如果为BERTEmbedding中 include_cls_sep=False, 则输出start和end index的位置与输入words的顺序完全一致
- 参数
words (torch.LongTensor) -- [batch_size, seq_len]
- 返回
一个包含num_labels个logit的dict,每一个logit的形状都是[batch_size, seq_len + 2]
-
training
: bool¶
-
子模块¶
fastNLP提供了BERT应用到五个下游任务的模型代码,可以直接调用。这五个任务分别为
文本分类任务:
BertForSequenceClassification
Matching任务:
BertForSentenceMatching
多选任务:
BertForMultipleChoice
序列标注任务:
BertForTokenClassification
抽取式QA任务:
BertForQuestionAnswering
每一个模型必须要传入一个名字为 embed 的 fastNLP.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)[源代码]¶ 输入为 [[w1, w2, w3, ...], [...]], BERTEmbedding会在开头和结尾额外加入[CLS]与[SEP] :param torch.LongTensor words: [batch_size, seq_len] :return: {
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]
-
training
: bool¶
-
-
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的格式为 [sent1] + [SEP] + [sent2](BertEmbedding会在开头加入[CLS]和在结尾加入[SEP]),输出为batch_size x num_labels
- 参数
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]
-
training
: bool¶
-
-
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]
-
training
: bool¶
-
-
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]
-
training
: bool¶
-
-
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为question + [SEP] + [paragraph],BERTEmbedding在之后会额外加入开头的[CLS]和结尾的[SEP]. note:
如果BERTEmbedding中include_cls_sep=True,则输出的start和end index相对输入words会增加一位;如果为BERTEmbedding中 include_cls_sep=False, 则输出start和end index的位置与输入words的顺序完全一致
- 参数
words (torch.LongTensor) -- [batch_size, seq_len]
- 返回
一个包含num_labels个logit的dict,每一个logit的形状都是[batch_size, seq_len + 2]
-
training
: bool¶
-
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.BiaffineParser
fastNLP.models.biaffine_parser.BiaffineParser
Biaffine Dependency Parser 实现. 论文参考 Deep Biaffine Attention for Neural Dependency Parsing (Dozat and Manning, 2016) .
-
__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
-
training
: bool¶
-
-
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)预测结果
-
training
: bool¶
-
static
-
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, ]
-
training
: bool¶
-
本模块实现了几种序列标注模型
-
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]
-
training
: bool¶
-
-
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
-
training
: bool¶
-
-
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的对应关系。如果传入该值,将自动避免非法的解码序列。
-
training
: bool¶
-
-
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 --
- 返回
-
training
: bool¶
-
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 节点, 详见论文
-
training
: bool¶
-
-
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] 输出分类的概率
-
training
: bool¶
-
-
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] 输出序列的分类
-
training
: bool¶
-
-
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] 输出序列中每个元素的分类
-
training
: bool¶
-
fastNLP.modules¶

大部分用于的 NLP 任务神经网络都可以看做由 embedding
、 encoder
、
decoder
三种模块组成。 本模块中实现了 fastNLP 提供的诸多模块组件,
可以帮助用户快速搭建自己所需的网络。几种模块的功能和常见组件如下:
类型 |
功能 |
常见组件 |
---|---|---|
embedding |
参见 |
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]
-
training
: bool¶
-
-
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编码的结果
-
training
: bool¶
-
-
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
-
training
: bool¶
-
-
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] 最后时刻隐状态.
-
training
: bool¶
-
-
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 节点, 详见论文
-
training
: bool¶
-
-
class
fastNLP.modules.
TransformerEncoder
(num_layers, d_model=512, n_head=8, dim_ff=2048, dropout=0.1)[源代码]¶ 别名
fastNLP.modules.TransformerEncoder
fastNLP.modules.encoder.TransformerEncoder
transformer的encoder模块,不包含embedding层
-
__init__
(num_layers, d_model=512, n_head=8, dim_ff=2048, dropout=0.1)[源代码]¶ - 参数
num_layers (int) -- 多少层Transformer
d_model (int) -- input和output的大小
n_head (int) -- 多少个head
dim_ff (int) -- FFN中间hidden大小
dropout (float) -- 多大概率drop attention和ffn中间的表示
-
forward
(x, seq_mask=None)[源代码]¶ - 参数
x -- [batch, seq_len, model_size] 输入序列
seq_mask -- [batch, seq_len] 输入序列的padding mask, 若为
None
, 生成全1向量. 为1的地方需要attend Default:None
- 返回
[batch, seq_len, model_size] 输出序列
-
training
: bool¶
-
-
class
fastNLP.modules.
VarRNN
(*args, **kwargs)[源代码]¶ 基类
fastNLP.modules.VarRNNBase
别名
fastNLP.modules.VarRNN
fastNLP.modules.encoder.VarRNN
Variational Dropout RNN. 相关论文参考:A Theoretically Grounded Application of Dropout in Recurrent Neural Networks (Yarin Gal and Zoubin Ghahramani, 2016)
-
__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
-
training
: bool¶
-
-
class
fastNLP.modules.
VarLSTM
(*args, **kwargs)[源代码]¶ 基类
fastNLP.modules.VarRNNBase
别名
fastNLP.modules.VarLSTM
fastNLP.modules.encoder.VarLSTM
Variational Dropout LSTM. 相关论文参考:A Theoretically Grounded Application of Dropout in Recurrent Neural Networks (Yarin Gal and Zoubin Ghahramani, 2016)
-
__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
-
training
: bool¶
-
-
class
fastNLP.modules.
VarGRU
(*args, **kwargs)[源代码]¶ 基类
fastNLP.modules.VarRNNBase
别名
fastNLP.modules.VarGRU
fastNLP.modules.encoder.VarGRU
Variational Dropout GRU. 相关论文参考:A Theoretically Grounded Application of Dropout in Recurrent Neural Networks (Yarin Gal and Zoubin Ghahramani, 2016)
-
__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
-
training
: bool¶
-
-
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 --
-
training
: bool¶
-
-
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的维度
- 返回
-
training
: bool¶
-
-
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后的结果
-
training
: bool¶
-
-
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]
-
training
: bool¶
-
-
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的维度
- 返回
-
training
: bool¶
-
-
class
fastNLP.modules.
MultiHeadAttention
(d_model: int = 512, n_head: int = 8, dropout: float = 0.0, layer_idx: int = None)[源代码]¶ Attention is all you need中提到的多头注意力
-
forward
(query, key, value, key_mask=None, attn_mask=None, state=None)[源代码]¶ - 参数
query -- batch x seq x dim
key -- batch x seq x dim
value -- batch x seq x dim
key_mask -- batch x seq 用于指示哪些key不要attend到;注意到mask为1的地方是要attend到的
attn_mask -- seq x seq, 用于mask掉attention map。 主要是用在训练时decoder端的self attention,下三角为1
state -- 过去的信息,在inference的时候会用到,比如encoder output、decoder的prev kv。这样可以减少计算。
- 返回
-
training
: bool¶
-
-
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
-
training
: bool¶
-
-
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,), 对应每个最优路径的分数。
-
training
: bool¶
-
-
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; 如果要i->j之间不允许越迁,就把transitions中(i,j)设置为很小的 负数,例如-10000000.0
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: float = 0.5, inplace: bool = False)[源代码]¶ 传入参数的shape为
(batch_size, num_timesteps, embedding_dim)
使用同一个shape为(batch_size, embedding_dim)
的mask在每个timestamp上做dropout。-
p
: float¶
-
inplace
: bool¶
-
子模块¶
-
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
-
training
: bool¶
-
-
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,), 对应每个最优路径的分数。
-
training
: bool¶
-
-
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; 如果要i->j之间不允许越迁,就把transitions中(i,j)设置为很小的 负数,例如-10000000.0
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)。
-
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]
-
training
: bool¶
-
-
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编码的结果
-
training
: bool¶
-
-
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
-
training
: bool¶
-
-
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] 最后时刻隐状态.
-
training
: bool¶
-
-
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 节点, 详见论文
-
training
: bool¶
-
-
class
fastNLP.modules.encoder.
TransformerEncoder
(num_layers, d_model=512, n_head=8, dim_ff=2048, dropout=0.1)[源代码]¶ 别名
fastNLP.modules.TransformerEncoder
fastNLP.modules.encoder.TransformerEncoder
transformer的encoder模块,不包含embedding层
-
__init__
(num_layers, d_model=512, n_head=8, dim_ff=2048, dropout=0.1)[源代码]¶ - 参数
num_layers (int) -- 多少层Transformer
d_model (int) -- input和output的大小
n_head (int) -- 多少个head
dim_ff (int) -- FFN中间hidden大小
dropout (float) -- 多大概率drop attention和ffn中间的表示
-
forward
(x, seq_mask=None)[源代码]¶ - 参数
x -- [batch, seq_len, model_size] 输入序列
seq_mask -- [batch, seq_len] 输入序列的padding mask, 若为
None
, 生成全1向量. 为1的地方需要attend Default:None
- 返回
[batch, seq_len, model_size] 输出序列
-
training
: bool¶
-
-
class
fastNLP.modules.encoder.
VarRNN
(*args, **kwargs)[源代码]¶ 基类
fastNLP.modules.VarRNNBase
别名
fastNLP.modules.VarRNN
fastNLP.modules.encoder.VarRNN
Variational Dropout RNN. 相关论文参考:A Theoretically Grounded Application of Dropout in Recurrent Neural Networks (Yarin Gal and Zoubin Ghahramani, 2016)
-
__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
-
training
: bool¶
-
-
class
fastNLP.modules.encoder.
VarLSTM
(*args, **kwargs)[源代码]¶ 基类
fastNLP.modules.VarRNNBase
别名
fastNLP.modules.VarLSTM
fastNLP.modules.encoder.VarLSTM
Variational Dropout LSTM. 相关论文参考:A Theoretically Grounded Application of Dropout in Recurrent Neural Networks (Yarin Gal and Zoubin Ghahramani, 2016)
-
__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
-
training
: bool¶
-
-
class
fastNLP.modules.encoder.
VarGRU
(*args, **kwargs)[源代码]¶ 基类
fastNLP.modules.VarRNNBase
别名
fastNLP.modules.VarGRU
fastNLP.modules.encoder.VarGRU
Variational Dropout GRU. 相关论文参考:A Theoretically Grounded Application of Dropout in Recurrent Neural Networks (Yarin Gal and Zoubin Ghahramani, 2016)
-
__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
-
training
: bool¶
-
-
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 --
-
training
: bool¶
-
-
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的维度
- 返回
-
training
: bool¶
-
-
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后的结果
-
training
: bool¶
-
-
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]
-
training
: bool¶
-
-
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的维度
- 返回
-
training
: bool¶
-
-
class
fastNLP.modules.encoder.
MultiHeadAttention
(d_model: int = 512, n_head: int = 8, dropout: float = 0.0, layer_idx: int = None)[源代码]¶ Attention is all you need中提到的多头注意力
-
forward
(query, key, value, key_mask=None, attn_mask=None, state=None)[源代码]¶ - 参数
query -- batch x seq x dim
key -- batch x seq x dim
value -- batch x seq x dim
key_mask -- batch x seq 用于指示哪些key不要attend到;注意到mask为1的地方是要attend到的
attn_mask -- seq x seq, 用于mask掉attention map。 主要是用在训练时decoder端的self attention,下三角为1
state -- 过去的信息,在inference的时候会用到,比如encoder output、decoder的prev kv。这样可以减少计算。
- 返回
-
training
: bool¶
-
-
class
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]
-
training
: bool¶
-
-
class
fastNLP.modules.encoder.
SelfAttention
(input_size, attention_unit=300, attention_hops=10, drop=0.5, initial_method=None)[源代码]¶ 这是一个基于论文 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惩罚项,是一个标量
-
training
: bool¶
-
-
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
包含总参数量,可训练参数量,不可训练参数量