在张量流中,是否有办法将每个通道乘以不同的矩阵?
想象一下你有一个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,但它似乎不适用于此目的。
谢谢!
答案 0 :(得分:1)
https://stackoverflow.com/a/42234117/9397533可以在这里应用。
为了使下面的代码更容易理解,我重命名为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)
答案 1 :(得分:0)
您可以在此处使用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)
希望这有帮助。