Комплексное матричное умножение с тензорным бэкэндом Кераса - PullRequest
0 голосов
/ 01 июня 2018

Пусть матрица F1 имеет форму (a * h * w * m), матрица F2 имеет форму (a * h * w * n), а матрица G имеет форму (a * m * n).

Я хочуреализовать следующую формулу, которая вычисляет каждый фактор G из факторов F1 и F2, используя тенорпоток бэкэнда Keras.Однако меня смущают различные бэкэнд-функции, особенно K.dot() и K.batch_dot().

$$ G_ {k, i, j} = \ sum ^ h_ {s = 1} \ sum ^ w_ {t= 1} \ dfrac {F ^ 1_ {k, s, t, i} * F ^ 2_ {k, s, t, j}} {h * w} $$ т.е.:

enter image description here

(Изображение получено копированием приведенного выше уравнения в $$ и вставкой его в этот сайт )

Есть ли способ реализовать вышеупомянутоеформула?Заранее спасибо.

1 Ответ

0 голосов
/ 01 июня 2018

Использование Tensorflow tf.einsum() (который можно обернуть слоем Lambda для Keras):

import tensorflow as tf
import numpy as np

a, h, w, m, n = 1, 2, 3, 4, 5

F1 = tf.random_uniform(shape=(a, h, w, m))
F2 = tf.random_uniform(shape=(a, h, w, n))

G = tf.einsum('ahwm,ahwn->amn', F1, F2) / (h * w)

with tf.Session() as sess:
    f1, f2, g = sess.run([F1, F2, G])

    # Manually computing G to check our operation, reproducing naively your equation:
    g_check = np.zeros(shape=(a, m, n))
    for k in range(a):
        for i in range(m):
            for j in range(n):
                for s in range(h):
                    for t in range(w):
                        g_check[k, i, j] += f1[k,s,t,i] * f2[k,s,t,j] / (h * w)

    # Checking for equality:
    print(np.allclose(g, g_check))
    # > True
...