Предполагая, что вы рассматриваете только конечный вывод 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)