= {'0.encoder.weight': torch.randn(5,3)}
wgts = match_embeds(wgts.copy(), ['a', 'b', 'c'], ['a', 'c', 'd', 'b'])
new_wgts = wgts['0.encoder.weight'],new_wgts['0.encoder.weight']
old,new 0], old[0])
test_eq(new[1], old[2])
test_eq(new[2], old.mean(0))
test_eq(new[3], old[1]) test_eq(new[
文本学习器
Learner
所需的所有函数本模块最重要的函数是 language_model_learner
和 text_classifier_learner
。它们将帮助您使用预训练模型定义一个 Learner
。请参阅 文本教程 了解使用示例。
加载预训练模型
在文本领域,加载预训练模型时,我们需要将预训练所用词汇表的 embedding 适应到当前语料库的词汇表。
match_embeds
match_embeds (old_wgts:dict, old_vocab:list, new_vocab:list)
将 old_wgts
中的 embedding 转换为从 old_vocab
适应到 new_vocab
。
类型 | 详情 | |
---|---|---|
old_wgts | dict | Embedding 权重 |
old_vocab | list | 预训练语料库的词汇表 |
new_vocab | list | 当前语料库词汇表 |
返回值 | dict |
对于 new_vocab
中在 old_vocab
中没有对应匹配的单词,我们使用所有预训练 embedding 的平均值。
load_ignore_keys
load_ignore_keys (model, wgts:dict)
将 wgts
加载到 model
中,忽略键名,仅按顺序获取参数
类型 | 详情 | |
---|---|---|
model | 模型架构 | |
wgts | dict | 模型权重 |
返回值 | tuple |
clean_raw_keys
clean_raw_keys (wgts:dict)
load_model_text
load_model_text (file:str, model, opt:fastai.optimizer.Optimizer, with_opt:bool=None, device:int|str|torch.device=None, strict:bool=True)
从 file
加载 model
及 opt
(如果可用且 with_opt
为 True)
类型 | 默认值 | 详情 | |
---|---|---|---|
file | str | 保存的文本模型文件名 | |
model | 模型架构 | ||
opt | 优化器 | 用于拟合模型的 Optimizer |
|
with_opt | bool | None | 启用以加载 Optimizer 状态 |
device | int | str | torch.device | None | 设置设备,如果未指定则使用 'cpu' |
strict | bool | True | 是否严格强制 file 的 state dict 键与模型 Module.state_dict 匹配 |
TextLearner
TextLearner (dls:DataLoaders, model, alpha:float=2.0, beta:float=1.0, moms:tuple=(0.8, 0.7, 0.8), loss_func:Callable|None=None, opt_func:Optimizer|OptimWrapper=<function Adam>, lr:float|slice=0.001, splitter:Callable=<function trainable_params>, cbs:Callback|MutableSequence|None=None, metrics:Callable|MutableSequence|None=None, path:str|Path|None=None, model_dir:str|Path='models', wd:float|int|None=None, wd_bn_bias:bool=False, train_bn:bool=True, default_cbs:bool=True)
NLP 中 Learner
的基本类。
类型 | 默认值 | 详情 | |
---|---|---|---|
dls | DataLoaders | 文本 DataLoaders |
|
model | 一个标准的 PyTorch 模型 | ||
alpha | float | 2.0 | RNNRegularizer 的参数 |
beta | float | 1.0 | RNNRegularizer 的参数 |
moms | tuple | (0.8, 0.7, 0.8) | Cosine Annealing Scheduler 的动量 |
loss_func | 可选 | None | 损失函数。默认为 dls 的损失函数 |
opt_func | fastai.optimizer.Optimizer | fastai.optimizer.OptimWrapper | Adam | 训练的优化函数 |
lr | float | slice | 0.001 | 默认学习率 |
splitter | 可调用对象 (Callable) | trainable_params | 将模型分割成参数组。默认为一个参数组 |
cbs | fastai.callback.core.Callback | collections.abc.MutableSequence | None | None | 要添加到 Learner 的 Callback |
metrics | Union | None | 在验证集上计算的 Metric |
path | str | pathlib.Path | None | None | 保存、加载和导出模型的父目录。默认为 dls 的 path |
model_dir | str | pathlib.Path | models | 保存和加载模型的子目录 |
wd | float | int | None | None | 默认权重衰减 |
wd_bn_bias | bool | False | 将权重衰减应用于归一化和偏置参数 |
train_bn | bool | True | 训练冻结的归一化层 |
default_cbs | bool | True | 包含默认 Callback |
将一个带 alpha
和 beta
的 ModelResetter
和 RNNRegularizer
添加到回调函数中,其余与 Learner
init 相同。
此 Learner
为基类添加了功能
TextLearner.load_pretrained
TextLearner.load_pretrained (wgts_fname:str, vocab_fname:str, model=None)
加载预训练模型并使其适应数据词汇表。
类型 | 默认值 | 详情 | |
---|---|---|---|
wgts_fname | str | 保存权重的文件名 | |
vocab_fname | str | pickle 格式保存的词汇表文件名 | |
model | NoneType | None | 加载参数的模型,默认为 Learner.model |
wgts_fname
应该指向预训练模型的权重,vocab_fname
指向用于预训练的词汇表。
TextLearner.save_encoder
TextLearner.save_encoder (file:str)
将编码器保存到模型目录中的 file
文件
类型 | 详情 | |
---|---|---|
file | str | Encoder 的文件名 |
模型目录是 Learner.path/Learner.model_dir
。
TextLearner.load_encoder
TextLearner.load_encoder (file:str, device:int|str|torch.device=None)
从模型目录加载编码器 file
,可选择确保其位于 device
上
类型 | 默认值 | 详情 | |
---|---|---|---|
file | str | 保存的编码器文件名 | |
device | int | str | torch.device | None | 用于加载的设备,默认为 dls 的设备 |
语言模型预测
对于语言建模,predict 方法与其他应用有很大不同,因此需要一个单独的子类。
decode_spec_tokens
decode_spec_tokens (tokens)
解码 tokens
中的特殊 token
'xxmaj', 'text']), ['Text'])
test_eq(decode_spec_tokens(['xxup', 'text']), ['TEXT'])
test_eq(decode_spec_tokens(['xxrep', '3', 'a']), ['aaa'])
test_eq(decode_spec_tokens(['xxwrep', '3', 'word']), ['word', 'word', 'word']) test_eq(decode_spec_tokens([
LMLearner
LMLearner (dls:DataLoaders, model, alpha:float=2.0, beta:float=1.0, moms:tuple=(0.8, 0.7, 0.8), loss_func:Callable|None=None, opt_func:Optimizer|OptimWrapper=<function Adam>, lr:float|slice=0.001, splitter:Callable=<function trainable_params>, cbs:Callback|MutableSequence|None=None, metrics:Callable|MutableSequence|None=None, path:str|Path|None=None, model_dir:str|Path='models', wd:float|int|None=None, wd_bn_bias:bool=False, train_bn:bool=True, default_cbs:bool=True)
处理语言模型时向 TextLearner
添加功能
类型 | 默认值 | 详情 | |
---|---|---|---|
dls | DataLoaders | 文本 DataLoaders |
|
model | 一个标准的 PyTorch 模型 | ||
alpha | float | 2.0 | RNNRegularizer 的参数 |
beta | float | 1.0 | RNNRegularizer 的参数 |
moms | tuple | (0.8, 0.7, 0.8) | Cosine Annealing Scheduler 的动量 |
loss_func | 可选 | None | 损失函数。默认为 dls 的损失函数 |
opt_func | fastai.optimizer.Optimizer | fastai.optimizer.OptimWrapper | Adam | 训练的优化函数 |
lr | float | slice | 0.001 | 默认学习率 |
splitter | 可调用对象 (Callable) | trainable_params | 将模型分割成参数组。默认为一个参数组 |
cbs | fastai.callback.core.Callback | collections.abc.MutableSequence | None | None | 要添加到 Learner 的 Callback |
metrics | Union | None | 在验证集上计算的 Metric |
path | str | pathlib.Path | None | None | 保存、加载和导出模型的父目录。默认为 dls 的 path |
model_dir | str | pathlib.Path | models | 保存和加载模型的子目录 |
wd | float | int | None | None | 默认权重衰减 |
wd_bn_bias | bool | False | 将权重衰减应用于归一化和偏置参数 |
train_bn | bool | True | 训练冻结的归一化层 |
default_cbs | bool | True | 包含默认 Callback |
LMLearner.predict
LMLearner.predict (text, n_words=1, no_unk=True, temperature=1.0, min_p=None, no_bar=False, decoder=<function decode_spec_tokens>, only_last_word=False)
返回 text
和其后的 n_words
个词
单词根据每个索引的概率从预测结果中随机选取。no_unk
意味着我们永远不会选择 UNK
token,temperature
应用于预测结果,如果传递了 min_p
,则不考虑概率低于该值的索引。如果您不想显示进度条,将 no_bar
设置为 True
,您还可以传递自定义的 decoder
来处理预测的 token。
Learner
便利函数
language_model_learner
language_model_learner (dls, arch, config=None, drop_mult=1.0, backwards=False, pretrained=True, pretrained_fnames=None, loss_func:Callable|None=None, opt_func:Optimizer|OptimWrapper=<function Adam>, lr:float|slice=0.001, splitter:Callable=<function trainable_params>, cbs:Callback|MutableSequence|None=None, metrics:Callable|MutableSequence|None=None, path:str|Path|None=None, model_dir:str|Path='models', wd:float|int|None=None, wd_bn_bias:bool=False, train_bn:bool=True, moms:tuple=(0.95, 0.85, 0.95), default_cbs:bool=True)
从 dls
和 arch
创建一个带有语言模型的 Learner
。
类型 | 默认值 | 详情 | |
---|---|---|---|
dls | DataLoaders | 包含 fastai 或 PyTorch DataLoader s 的 DataLoaders |
|
arch | |||
config | NoneType | None | |
drop_mult | float | 1.0 | |
backwards | bool | False | |
pretrained | bool | True | |
pretrained_fnames | NoneType | None | |
loss_func | 可选 | None | 损失函数。默认为 dls 的损失函数 |
opt_func | fastai.optimizer.Optimizer | fastai.optimizer.OptimWrapper | Adam | 训练的优化函数 |
lr | float | slice | 0.001 | 默认学习率 |
splitter | 可调用对象 (Callable) | trainable_params | 将模型分割成参数组。默认为一个参数组 |
cbs | fastai.callback.core.Callback | collections.abc.MutableSequence | None | None | 要添加到 Learner 的 Callback |
metrics | Union | None | 在验证集上计算的 Metric |
path | str | pathlib.Path | None | None | 保存、加载和导出模型的父目录。默认为 dls 的 path |
model_dir | str | pathlib.Path | models | 保存和加载模型的子目录 |
wd | float | int | None | None | 默认权重衰减 |
wd_bn_bias | bool | False | 将权重衰减应用于归一化和偏置参数 |
train_bn | bool | True | 训练冻结的归一化层 |
moms | tuple | (0.95, 0.85, 0.95) | 调度器的默认动量 |
default_cbs | bool | True | 包含默认 Callback |
您可以使用 config
自定义使用的架构(为此可以更改 awd_lstm_lm_config
中的值),pretrained
将使用 fastai 为此 arch
提供的预训练模型(如果可用),或者您可以传递包含您自己的预训练模型和相应词汇表的特定 pretrained_fnames
。所有其他参数都传递给 Learner
。
= untar_data(URLs.IMDB_SAMPLE)
path = pd.read_csv(path/'texts.csv')
df = TextDataLoaders.from_df(df, path=path, text_col='text', is_lm=True, valid_col='is_valid')
dls = language_model_learner(dls, AWD_LSTM) learn
然后您可以使用 .predict
方法生成新文本。
'This movie is about', n_words=20) learn.predict(
'This movie is about plans by Tom Cruise to win a loyalty sharing award at the Battle of Christmas'
默认情况下,在每个预测词之后,整个句子会再次馈送到模型中,这个小技巧显示出生成文本质量的改进。如果只想馈送最后一个词,请指定参数 only_last_word
。
'This movie is about', n_words=20, only_last_word=True) learn.predict(
'This movie is about the J. Intelligent , ha - agency . Griffith , and Games on the early after'
text_classifier_learner
text_classifier_learner (dls, arch, seq_len=72, config=None, backwards=False, pretrained=True, drop_mult=0.5, n_out=None, lin_ftrs=None, ps=None, max_len=1440, y_range=None, loss_func:Callable|None=None, opt_func:Optimizer|OptimWrapper=<function Adam>, lr:float|slice=0.001, splitter:Callable=<function trainable_params>, cbs:Callback|MutableSequence|None=None, metrics:Callable|MutableSequence|None=None, path:str|Path|None=None, model_dir:str|Path='models', wd:float|int|None=None, wd_bn_bias:bool=False, train_bn:bool=True, moms:tuple=(0.95, 0.85, 0.95), default_cbs:bool=True)
从 dls
和 arch
创建一个带有文本分类器的 Learner
。
类型 | 默认值 | 详情 | |
---|---|---|---|
dls | DataLoaders | 包含 fastai 或 PyTorch DataLoader s 的 DataLoaders |
|
arch | |||
seq_len | int | 72 | |
config | NoneType | None | |
backwards | bool | False | |
pretrained | bool | True | |
drop_mult | float | 0.5 | |
n_out | NoneType | None | |
lin_ftrs | NoneType | None | |
ps | NoneType | None | |
max_len | int | 1440 | |
y_range | NoneType | None | |
loss_func | 可选 | None | 损失函数。默认为 dls 的损失函数 |
opt_func | fastai.optimizer.Optimizer | fastai.optimizer.OptimWrapper | Adam | 训练的优化函数 |
lr | float | slice | 0.001 | 默认学习率 |
splitter | 可调用对象 (Callable) | trainable_params | 将模型分割成参数组。默认为一个参数组 |
cbs | fastai.callback.core.Callback | collections.abc.MutableSequence | None | None | 要添加到 Learner 的 Callback |
metrics | Union | None | 在验证集上计算的 Metric |
path | str | pathlib.Path | None | None | 保存、加载和导出模型的父目录。默认为 dls 的 path |
model_dir | str | pathlib.Path | models | 保存和加载模型的子目录 |
wd | float | int | None | None | 默认权重衰减 |
wd_bn_bias | bool | False | 将权重衰减应用于归一化和偏置参数 |
train_bn | bool | True | 训练冻结的归一化层 |
moms | tuple | (0.95, 0.85, 0.95) | 调度器的默认动量 |
default_cbs | bool | True | 包含默认 Callback |
您可以使用 config
自定义使用的架构(为此可以更改 awd_lstm_clas_config
中的值),pretrained
将使用 fastai 为此 arch
提供的预训练模型(如果可用)。drop_mult
是应用于控制所有 dropout 的全局乘数。n_out
通常从 dls
推断,但您也可以传递它。
该模型使用 SentenceEncoder
,这意味着文本每次以 seq_len
个 token 的长度传递,并且仅在最后 max_len
个步骤上计算梯度。lin_ftrs
和 ps
被传递给 get_text_classifier
。
所有其他参数都传递给 Learner
。
= untar_data(URLs.IMDB_SAMPLE)
path = pd.read_csv(path/'texts.csv')
df = TextDataLoaders.from_df(df, path=path, text_col='text', label_col='label', valid_col='is_valid')
dls = text_classifier_learner(dls, AWD_LSTM) learn