如何在定制模型上使用Allen NLP解释器 [英] How to use Allen NLP interpret on custom models
本文介绍了如何在定制模型上使用Allen NLP解释器的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
我希望使用Allen NLP Interprete进行集成可视化和显著映射。在自定义转换器模型上,您能告诉我如何做到这一点吗?
推荐答案
可以通过在您的自定义模型周围使用AllenNLP包装器来实现。解释器模块需要Predictor对象,因此您可以编写自己的对象,或使用现有的对象。
以下是一个分类模型的示例:
from allennlp.data.vocabulary import Vocabulary
from allennlp.predictors.text_classifier import TextClassifierPredictor
from allennlp.data.dataset_readers import TextClassificationJsonReader
import torch
class ModelWrapper(Model):
def __init__(self, vocab, your_model):
super().__init__(vocab)
self.your_model = your_model
self.logits_to_probs = torch.nn.Softmax()
self.loss = torch.nn.CrossEntropyLoss()
def forward(self, tokens, label=None):
if label is not None:
outputs = self.your_model(tokens, label=label)
else:
outputs = self.your_model(tokens)
probs = self.logits_to_probs(outputs["logits"])
if label is not None:
loss = self.loss(outputs["logits"], label)
outputs["loss"] = loss
outputs["probs"] = probs
return outputs
您的自定义转换器模型可能没有可识别的TextFieldEmbedder
。这是模型的初始嵌入层,根据该层为显著解释器计算渐变。可以通过覆盖预测器中的以下方法来指定这些方法。
class PredictorWrapper(TextClassifierPredictor):
def get_interpretable_layer(self):
return self._model.model.bert.embeddings.word_embeddings # This is the initial layer for huggingface's `bert-base-uncased`; change according to your custom model.
def get_interpretable_text_field_embedder(self):
return self._model.model.bert.embeddings.word_embeddings
predictor = PredictorWrapper(model=ModelWrapper(vocab, your_model),
dataset_reader=TextClassificationJsonReader())
现在您有了一个AllenNLP预测器,它可以与解释模块一起使用,如下所示:
from allennlp.interpret.saliency_interpreters import SimpleGradient
interpreter = SimpleGradient(predictor)
interpreter.saliency_interpret_from_json({"sentence": "This is a good movie."})
这将为您提供关于每个输入令牌的渐变。
这篇关于如何在定制模型上使用Allen NLP解释器的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文