Умножить каждый канал на разные матрицы? - PullRequest
0 голосов
/ 26 апреля 2018

Есть ли способ в тензорном потоке умножить каждый канал на другую матрицу?

Представьте, что у вас есть двумерный массив A измерений (N, D1).Вы можете умножить его на массив B размера (D1, D2), чтобы получить выходной размер (N, D2).

Теперь представьте, что у вас есть трехмерный массив измерений (N, D1, 3).Предположим, у вас есть B1, B2, B3 всех размеров (D1, D2).Комбинируя выходы A * B1, A * B2, A * B3, вы можете сформировать массив размеров (N, D2, 3).Но есть ли способ получить выходной размер (N, D2, 3), просто сделав умножение один раз?Я посмотрел на transpose и matmul, но, похоже, он не работает для этой цели.

Спасибо!

Ответы [ 2 ]

0 голосов
/ 26 апреля 2018

Вы можете использовать tf.matmul здесь.Просто вам придется перенести размеры.

Рассмотрим, N = 2, D1 = 4, D2 = 5.Сначала создайте две матрицы, имеющие формы N x D1 x 3 и D1 x D2 x 3.

a = tf.constant(np.arange(1, 25, dtype=np.int32), shape=[2,4,3])
b = tf.constant(np.arange(1, 61, dtype=np.int32), shape=[4,5,3])

. Переставьте матрицы так, чтобы первое измерение было одинаковым.

a = tf.transpose(a, (2, 0, 1))  # a.shape = (3, 2, 4)
b = tf.transpose(b, (2, 0, 1))  # b.shape = (3, 4, 5)

Выполните умножение как обычно.

r = tf.matmul(a,b)  # r.shape = (3, 2, 5)
r = tf.transpose(r, (1, 2, 0))  # r.shape = (2, 5, 3)

Надеюсь, это поможет.

0 голосов
/ 26 апреля 2018

tf.einsum() можно применить здесь.

Чтобы облегчить понимание кода ниже, я переименовал D1 = O и D2 = P.

import tensorflow as tf

A = tf.random_normal([N, O, 3])
B = tf.random_normal([O, P, 3])  # B = tf.stack([B1, B2, B3], axis=2)
res = tf.einsum("noi,opi->npi", A, B)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...