有人在Opennmt-py中翻译时知道如何获得比对权重吗?通常,唯一的输出是结果语句,我尝试为注意力权重找到调试标志或类似标志。到目前为止,我一直没有成功。
答案 0 :(得分:1)
我不确定这是否是一项新功能,因为几个月前我在寻找对齐方式时没有遇到此问题,但是onmt似乎已经添加了一个标记-report_align
来输出单词对齐方式以及翻译。
https://opennmt.net/OpenNMT-py/FAQ.html#raw-alignments-from-averaging-transformer-attention-heads
opennnmt.net的摘录-
当前,我们支持在翻译基于Transformer的模型时产生单词对齐。调用translate.py时使用-report_align将以法老王格式输出推断的对齐方式。这些对齐方式是根据倒数第二个解码器层的关注头平均值的argmax计算得出的。
答案 1 :(得分:0)
您可以获取注意矩阵。请注意,它与 alignment (对齐)不同,后者是来自统计(而非神经)机器翻译的术语。
有a thread on github正在讨论。这是讨论的摘录。当您从该模式获得翻译时,注意力将集中在attn
字段中。
import onmt
import onmt.io
import onmt.translate
import onmt.ModelConstructor
from collections import namedtuple
# Load the model.
Opt = namedtuple('Opt', ['model', 'data_type', 'reuse_copy_attn', "gpu"])
opt = Opt("PATH_TO_SAVED_MODEL", "text", False, 0)
fields, model, model_opt = onmt.ModelConstructor.load_test_model(
opt, {"reuse_copy_attn" : False})
# Test data
data = onmt.io.build_dataset(
fields, "text", "PATH_TO_DATA", None, use_filter_pred=False)
data_iter = onmt.io.OrderedIterator(
dataset=data, device=0,
batch_size=1, train=False, sort=False,
sort_within_batch=True, shuffle=False)
# Translator
translator = onmt.translate.Translator(
model, fields, beam_size=5, n_best=1,
global_scorer=None, cuda=True)
builder = onmt.translate.TranslationBuilder(
data, translator.fields, 1, False, None)
batch = next(data_iter)
batch_data = translator.translate_batch(batch, data)
translations = builder.from_batch(batch_data)
translations[0].attn # <--- here are the attentions