Search code examples
deep-learningpytorchmachine-translationattention-modelopennmt

Getting alignment/attention during translation in OpenNMT-py


Does anyone know how to get the alignments weights when translating in Opennmt-py? Usually the only output are the resulting sentences and I have tried to find a debugging flag or similar for the attention weights. So far, I have been unsuccessful.


Solution

  • You can get the attention matrices. Note that it is not the same as alignment which is a term from statistical (not neural) machine translation.

    There is a thread on github discussing it. Here is a snippet from the discussion. When you get the translations from the mode, the attentions are in the attn field.

    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