fastNLP — это лёгкий инструмент для обработки естественного языка (NLP), цель которого — уменьшить объём кода, связанного с обработкой данных, обучением и многопроцессорной работой в проектах пользователей.
Особенности fastNLP:
Внимание! Чтобы обеспечить совместимость с различными архитектурами глубокого обучения, в версии fastNLP 1.0.0 и выше была переработана архитектура, поэтому она не полностью совместима с предыдущими версиями fastNLP. Для использования более ранних версий fastNLP потребуется внести некоторые изменения в код.
Документация доступна на китайском языке по адресу: http://www.fastnlp.top/docs/fastNLP/master/index.html.
fastNLP можно установить с помощью следующей команды:
pip install fastNLP>=1.0.0alpha
Если вам нужна более ранняя версия fastNLP, укажите номер версии, например:
pip install fastNLP==0.7.1
Кроме того, установите соответствующий фреймворк глубокого обучения в зависимости от используемого вами фреймворка.
Вот пример использования PyTorch для классификации текста. Требуется установить torch >= 1.6.0.
from fastNLP.io import ChnSentiCorpLoader
from functools import partial
from fastNLP import cache_results
from fastNLP.transformers.torch import BertTokenizer
# 使用cache_results装饰器装饰函数,将prepare_data的返回结果缓存到caches/cache.pkl,再次运行时,如果
# 该文件还存在,将自动读取缓存文件,而不再次运行预处理代码。
@cache_results('caches/cache.pkl')
def prepare_data():
# 会自动下载数据,并且可以通过文档看到返回的 dataset 应该是包含"raw_words"和"target"两个field的
data_bundle = ChnSentiCorpLoader().load()
# 使用tokenizer对数据进行tokenize
tokenizer = BertTokenizer.from_pretrained('hfl/chinese-bert-wwm')
tokenize = partial(tokenizer, max_length=256) # 限制数据的最大长度
data_bundle.apply_field_more(tokenize, field_name='raw_chars', num_proc=4) # 会新增"input_ids", "attention_mask"等field进入dataset中
data_bundle.apply_field(int, field_name='target', new_field_name='labels') # 将int函数应用到每个target上,并且放入新的labels field中
return data_bundle
data_bundle = prepare_data()
print(data_bundle.get_dataset('train')[:4])
# 初始化model, optimizer
from fastNLP.transformers.torch import BertForSequenceClassification
from torch import optim
model = BertForSequenceClassification.from_pretrained('hfl/chinese-bert-wwm')
optimizer = optim.AdamW(model.parameters(), lr=2e-5)
# 准备dataloader
from fastNLP import prepare_dataloader
dls = prepare_dataloader(data_bundle, batch_size=32)
# 准备训练
from fastNLP import Trainer, Accuracy, LoadBestModelCallback, TorchWarmupCallback, Event
callbacks = [
TorchWarmupCallback(warmup=0.1, schedule='linear'), # 训练过程中调整学习率。
LoadBestModelCallback() # 将在训练结束之后,加载性能最优的model
]
# 在训练特定时机加入一些操作, 不同时机能够获取到的参数不一样,可以通过Trainer.on函数的文档查看每个时机的参数
@Trainer.on(Event.on_before_backward())
def print_loss(trainer, outputs):
if trainer.global_forward_batches % 10 == 0: # 每10个batch打印一次loss。
print(outputs.loss.item())
trainer = Trainer(model=model, train_dataloader=dls['train'], optimizers=optimizer,
device=0, evaluate_dataloaders=dls['dev'], metrics={'acc': Accuracy()},
callbacks=callbacks, monitor='acc#acc',n_epochs=5,
# Accuracy的update()函数需要pred,target两个参数,它们实际对应的就是以下的field。
evaluate_input_mapping={'labels': 'target'}, # 在评测时,将dataloader中会输入到模型的labels重新命名为target
evaluate_output_mapping={'logits': 'pred'} # 在评测时,将model输出中的logits重新命名为pred
)
trainer.run()
# 在测试集合上进行评测
from fastNLP import Evaluator
evaluator = Evaluator(model=model, dataloaders=dls['test'], metrics={'acc': Accuracy()},
# Accuracy的update()函数需要pred,target两个参数,它们实际对应的就是以下的field。
output_mapping={'logits': 'pred'},
input_mapping={'labels': 'target'})
evaluator.run()
Дополнительные сведения доступны по следующим ссылкам. Подробное использование учебника
Базовое использование Trainer и Evaluator (http://www.fastnlp.top/docs/fastNLP/master/tutorials/basic/fastnlp_tutorial_0.html).
Базовое использование DataSet и Vocabulary (http://www.fastnlp.top/docs/fastNLP/master/tutorials/basic/fastnlp_tutorial_1.html).
Базовое использование DataBundle и Tokenizer (http://www.fastnlp.top/docs/fastNLP/master/tutorials/basic/fastnlp_tutorial_2.html).
Внутренняя структура TorchDataloader и базовое использование (http://www.fastnlp.top/docs/fastNLP/master/tutorials/basic/fastnlp_tutorial_3.html).
Предопределённые модели в fastNLP (http://www.fastnlp.top/docs/fastNLP/master/tutorials/basic/fastnlp_tutorial_4.html).
Глубокое введение в Trainer и Evaluator (http://www.fastnlp.top/docs/fastNLP/master/tutorials/basic/fastnlp_tutorial_4.html).
Сочетание fastNLP с paddle или jittor (http://www.fastnlp.top/docs/fastNLP/master/tutorials/basic/fastnlp_tutorial_5.html).
Завершение классификации SST-2 с помощью Bert + fine-tuning (http://www.fastnlp.top/docs/fastNLP/master/tutorials/basic/fastnlp_tutorial_e1.html).
Завершение классификации SST-2 с помощью Bert + prompt (http://www.fastnlp.top/docs/fastNLP/master/tutorials/basic/fastnlp_tutorial_e2.html).
Paddle
Ниже приведён пример использования Paddle для классификации текста. Необходимо установить Paddle версии 2.2.0 или выше и Paddlenlp версии 2.3.3 или выше.
from fastNLP.io import ChnSentiCorpLoader
from functools import partial
# Автоматически загрузит данные, также можно увидеть из документации, что возвращаемый dataset должен содержать поля «raw_words» и «target».
data_bundle = ChnSentiCorpLoader().load()
# Использование tokenizer для токенизации данных.
from paddlenlp.transformers import BertTokenizer
tokenizer = BertTokenizer.from_pretrained('hfl/chinese-bert-wwm')
tokenize = partial(tokenizer, max_length=256) # Ограничение максимальной длины.
data_bundle.apply_field_more(tokenize, field_name='raw_chars', num_proc=4) # Добавит новые поля «input_ids», «attention_mask» и т. д. в dataset.
data_bundle.apply_field(int, field_name='target', new_field_name='labels') # Применит функцию int к каждому target и поместит результат в новое поле labels.
print(data_bundle.get_dataset('train')[:4])
# Инициализация модели.
from paddlenlp.transformers import BertForSequenceClassification, LinearDecayWithWarmup
from paddle import optimizer, nn
class SeqClsModel(nn.Layer):
def __init__(self, model_checkpoint, num_labels):
super(SeqClsModel, self).__init__()
self.num_labels = num_labels
self.bert = BertForSequenceClassification.from_pretrained(model_checkpoint)
def forward(self, input_ids, token_type_ids=None, position_ids=None, attention_mask=None):
logits = self.bert(input_ids, token_type_ids, position_ids, attention_mask)
return logits
def train_step(self, input_ids, labels, token_type_ids=None, position_ids=None, attention_mask=None):
logits = self(input_ids, token_type_ids, position_ids, attention_mask)
loss_fct = nn.CrossEntropyLoss()
loss = loss_fct(logits.reshape((-1, self.num_labels)), labels.reshape((-1, )))
return {
"logits": logits,
"loss": loss,
}
def evaluate_step(self, input_ids, token_type_ids=None, position_ids=None, attention_mask=None):
logits = self(input_ids, token_type_ids, position_ids, attention_mask)
return {
"logits": logits,
}
model = SeqClsModel('hfl/chinese-bert-wwm', num_labels=2)
# Подготовка dataloader.
from fastNLP import prepare_dataloader
dls = prepare_dataloader(data_bundle, batch_size=16)
# Настройка скорости обучения во время тренировки.
scheduler = LinearDecayWithWarmup(2e-5, total_steps=20 * len(dls['train']), warmup=0.1)
optimizer = optimizer.AdamW(parameters=model.parameters(), learning_rate=scheduler)
# Подготовка к тренировке.
from fastNLP import Trainer, Accuracy, LoadBestModelCallback, Event
callbacks = [
LoadBestModelCallback() # Загрузит модель с наилучшей производительностью после завершения тренировки.
]
@Trainer.on(Event.on_before_backward())
def print_loss(trainer, outputs):
if trainer.global_forward_batches % 10 == 0: # Выводит loss каждые 10 пакетов.
print(outputs["loss"].item())
trainer = Trainer(model=model, train_dataloader=dls['train'], optimizers=optimizer,
device=0, evaluate_dataloaders=dls['dev'], metrics={'acc':
*В тексте запроса присутствуют фрагменты кода на языке Python, которые не были переведены.* **Текст запроса:**
Accuracy()},
callbacks=callbacks, monitor='acc#acc',
# Accuracy的update()函数需要pred,target两个参数,它们实�cкого对应的就是以下的field。
evaluate_output_mapping={'logits': 'pred'},
evaluate_input_mapping={'labels': 'target'}
)
trainer.run()
# 在测试集合上进行评测
from fastNLP import Evaluator
evaluator = Evaluator(model=model, dataloaders=dls['test'], metrics={'acc': Accuracy()},
# Accuracy的update()函数需要pred,target两个参数,它们实�cского对应的就是以下的field。
output_mapping={'logits': 'pred'},
input_mapping={'labels': 'target'})
evaluator.run()
**Перевод текста запроса на русский язык:**
Аккураси ()},
колбэки = колбэки, монитор = «акк # акк»,
# Функция Аккураси update () требует pred и target в качестве параметров, которые фактически соответствуют следующим полям.
эвалуэйт_оутпут_мэппинг = {'логитс': 'пред'},
эвалюэйт инпут мэппинг = {'лэйблс': 'таргет'}
)
тренер.ран ().
# Провести оценку на тестовом наборе данных
из fastNLP импортировать оценщик
оценщик = оценщик (модель = модель, даталоадеры = ди эл эл эс ['тест'], метрикс = {'акк': Аккураси ()},
# Функция Аккураси update () требует пред и таргет в качестве параметров, которым фактически соответствуют следующие поля.
оутпут мэппинг = {'логитс': 'пред'},
инпут мэппинг = {'лэблс': 'таржет'}
).
оценщик.ран ().
Вы можете оставить комментарий после Вход в систему
Неприемлемый контент может быть отображен здесь и не будет показан на странице. Вы можете проверить и изменить его с помощью соответствующей функции редактирования.
Если вы подтверждаете, что содержание не содержит непристойной лексики/перенаправления на рекламу/насилия/вульгарной порнографии/нарушений/пиратства/ложного/незначительного или незаконного контента, связанного с национальными законами и предписаниями, вы можете нажать «Отправить» для подачи апелляции, и мы обработаем ее как можно скорее.
Комментарии ( 0 )