Внедрение LSTM с двойным кодировщиком в Keras с бэкэндом Tensorflow - PullRequest
0 голосов
/ 24 апреля 2020

Dual Encoder LSTM

Я хочу реализовать эту модель в TensorFlow Keras API. Я не совсем понимаю, как реализовать функцию сигмоида (CMR) в Keras. Как объединить выходные данные обоих LSTM и вычислить вышеуказанную функцию?

RNN здесь означает, что LSTM

C и R - предложения, закодированные в фиксированное измерение двумя LSTM. Затем они передаются через сигмовидную функцию (CMR). Можно предположить, что R и C являются 256-мерными матрицами, а M - 256 * 256. Матрица М усваивается во время обучения.

1 Ответ

0 голосов
/ 24 апреля 2020

Предполагая, что вы рассматриваете только конечный вывод LSTM, а не всю последовательность, форма вывода каждой модели LSTM будет (batch_size, 256).

Теперь у нас есть следующие векторы и их формы:

C: (размер пакета, 256)

R: (размер пакета, 256)

М: (256, 256).

Самый простой случай для batch_size = 1. Тогда

C: (1, 256)

R: (1, 256)

Итак, математически, C T MR будет практически CMR T и даст вам вектор формы (1, 1), который может быть представлен любым числом измерений.

В коде это просто:

def compute_cmr(c, m, r):
    r = tf.transpose(r, [1, 0])
    output = tf.matmul(c, m)
    output = tf.matmul(output, r)
    return output

Однако, если ваш batch_size больше 1, все может стать сложнее. Мой подход (использующий активное выполнение) состоит в том, чтобы распаковать по оси пакета, обработать индивидуально, а затем повторно сложить. Возможно, это не самый эффективный способ, но он работает безупречно, а временные затраты обычно незначительны.

Вот как вы можете это сделать:

def compute_cmr(c, m, r):
    outputs = []
    c_list = tf.unstack(c, axis=0)
    r_list = tf.unstack(r, axis=0)
    for batch_number in range(len(c_list)):
        r = tf.expand_dims(r_list[batch_number], axis=1)
        c = tf.expand_dims(c_list[batch_number], axis=0)
        output = tf.matmul(c, m)
        output = tf.matmul(output, r)
        outputs.append(output)
    return tf.stack(outputs, axis=0)
...