Со ссылкой на статью «Нейронная сеть BiLSTM с накоплением на основе механизма Coattention для ответа на вопрос» (https://www.hindawi.com/journals/cin/2019/9543490/) я пытаюсь написать собственный слой keras для реализации приведенного ниже набора уравнений .
Мои векторные контекстные формы для вопроса и ответа приведены ниже.
Форма вектора контекста вопроса (CQ): (512, 256)
Вектор формы контекста ответа (CA): (512, 256)
Ожидаемый результат: Оценка косинуса с учетом двух вышеупомянутых векторов контекста в качестве входных данных.
Это мой код для того же.
class score(tf.keras.layers.Layer):
def __init__(self, units):
super(score, self).__init__()
# Initializing the weights
self.Wam = tf.keras.layers.Dense(units) # Attention matrix of CA at time t.
self.Wqm = tf.keras.layers.Dense(units) # Attention matrix of OQ
self.Wms = tf.keras.layers.Dense(units) # Attention weight vector
def call (self, CQ, CA):
OQ = tf.keras.layers.GlobalMaxPool1D()(CQ)
print(OQ.shape)
CA = tf.expand_dims(CA,1)
#Maq = tf.nn.tanh(tf.matmul(self.Wam, CA) + tf.matmul(self.Wqm, OQ))
Maq = tf.nn.tanh(self.Wam(CA) + self.Wqm(OQ))
Saq = tf.exp(tf.linalg.matmul(Wms, Maq, transpose_a = True, transpose_b = False))
OA = CA * Saq
OA = tf.reduce_sum(OA, axis = 1)
# Calcutate Cosine similarity of vectors OQ and OA
dot_product = tf.tensordot(OQ, OA, axes=0)
# Normalize input
norm_OQ = tf.nn.l2_normalize(OQ)
norm_OA = tf.nn.l2_normalize(OA)
scoreCosine = dot_product / (norm_OQ * norm_OA)
#Normalize the cosine similarity to the [0, 1] interval
scoreCosine = 0.5 * (scoreCosine) + 0.5
return scoreCosine
score_layer = score(10)
scoreCosine = score_layer(CQ, CA)
Я сталкиваюсь с проблемами с матричными формами на каждом шаге , Я попытался разбить шаги и выполнить каждый в отдельности.
Проблемы, с которыми я сталкиваюсь:
1) Входные матрицы имеют форму 2D, но ожидается слой GlobalMaxPool1D (1-е уравнение) 3D-ввод и получение 2D-вывода.
2) Я инициализировал матрицы внимания (Wam, Wqm) и вектор веса внимания (Wms) в виде плотного слоя с 10 единицами (эталонный слой внимания Bahdanau здесь -> https://www.tensorflow.org/tutorials/text/nmt_with_attention). Это правильно? Это не работает для уравнения 3 (транспонирование Wms), так как это не тензор, а плотный слой.
Пожалуйста, сообщите, если это был правильный подход или где я делаю неправильно. Любая помощь с благодарностью.