wgts = {'0.encoder.weight': torch.randn(5,3)}
new_wgts = match_embeds(wgts.copy(), ['a', 'b', 'c'], ['a', 'c', 'd', 'b'])
old,new = wgts['0.encoder.weight'],new_wgts['0.encoder.weight']
test_eq(new[0], old[0])
test_eq(new[1], old[2])
test_eq(new[2], old.mean(0))
test_eq(new[3], old[1])文本学习器
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
test_eq(decode_spec_tokens(['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'])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 DataLoaders 的 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。
path = untar_data(URLs.IMDB_SAMPLE)
df = pd.read_csv(path/'texts.csv')
dls = TextDataLoaders.from_df(df, path=path, text_col='text', is_lm=True, valid_col='is_valid')
learn = language_model_learner(dls, AWD_LSTM)然后您可以使用 .predict 方法生成新文本。
learn.predict('This movie is about', n_words=20)'This movie is about plans by Tom Cruise to win a loyalty sharing award at the Battle of Christmas'
默认情况下,在每个预测词之后,整个句子会再次馈送到模型中,这个小技巧显示出生成文本质量的改进。如果只想馈送最后一个词,请指定参数 only_last_word。
learn.predict('This movie is about', n_words=20, only_last_word=True)'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 DataLoaders 的 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。
path = untar_data(URLs.IMDB_SAMPLE)
df = pd.read_csv(path/'texts.csv')
dls = TextDataLoaders.from_df(df, path=path, text_col='text', label_col='label', valid_col='is_valid')
learn = text_classifier_learner(dls, AWD_LSTM)