Визуализация внимания не сложна, но вам нужны некоторые хитрости.При построении модели вам нужно дать имя слою внимания.
(...)
attention = keras.layers.Activation('softmax', name='attention_vec')(attention)
(...)
При загрузке сохраненной модели вам нужно получить вывод слоя внимания по предикту.
model = load_model("./saved_model.h5")
model.summary()
model = Model(inputs=model.input,
outputs=[model.output, model.get_layer('attention_vec').output])
Теперь выможно получить выходные данные модели, а также вектор внимания.
ouputs = model.predict(encoded_input_text)
model_outputs = outputs[0]
attention_outputs = outputs[1]
Существует множество способов визуализации вектора внимания.По сути, вывод внимания является выводом softmax, и они находятся в диапазоне от 0 до 1. Вы можете изменить эти значения на коды rgb.Если вы работаете с ноутбуком Jupyter, этот следующий фрагмент кода поможет вам понять концепцию и визуализировать:
class CharVal(object):
def __init__(self, char, val):
self.char = char
self.val = val
def __str__(self):
return self.char
def rgb_to_hex(rgb):
return '#%02x%02x%02x' % rgb
def color_charvals(s):
r = 255-int(s.val*255)
color = rgb_to_hex((255, r, r))
return 'background-color: %s' % color
# if you are using batches the outputs will be in batches
# get exact attentions of chars
an_attention_output = attention_outputs[0][-len(encoded_input_text):]
# before the prediction i supposed you tokenized text
# you need to match each char and attention
char_vals = [CharVal(c, v) for c, v in zip(tokenized_text, attention_output)]
import pandas as pd
char_df = pd.DataFrame(char_vals).transpose()
# apply coloring values
char_df = char_df.style.applymap(color_charvals)
char_df
Чтобы подвести итог, вам нужно получить выходные данные модели, сопоставить выходные данные с входными данными и преобразовать их в rgb или hex ивизуализировать.Я надеюсь, что это было ясно.