用不同的矩阵乘以每个通道?

时间:2018-04-25 21:27:55

标签: tensorflow

在张量流中,是否有办法将每个通道乘以不同的矩阵?

想象一下你有一个2D维数的阵列(N,D1)。 您可以将其乘以大小为(D1,D2)的数组B,以获得输出大小(N,D2)。

现在假设您有一个3D维数组(N,D1,3)。 假设您有B1,B2,B3全尺寸(D1,D2)。组合输出A * B1,A * B2,A * B3,您可以形成一个大小(N,D2,3)的数组。 但有没有办法通过一次乘法来获得(N,D2,3)的输出大小? 我调查了转置和matmul,但它似乎不适用于此目的。

谢谢!

2 个答案:

答案 0 :(得分:1)

https://stackoverflow.com/a/42234117/9397533可以在这里应用。

为了使下面的代码更容易理解,我重命名为D1 = OD2 = 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)

答案 1 :(得分:0)

您可以在此处使用tf.matmul。只是你必须转换尺寸。

考虑一下,N = 2, D1 = 4, D2 = 5。首先创建两个形状为N x D1 x 3D1 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)

希望这有帮助。