我有一个矩阵A,它被定义为张量流中的张量,n行和p列 . 此外,我说k矩阵B1,...,Bk有p行和q列 . 我的目标是获得n行和q列的结果矩阵C,其中C的每一行是A中相应行的矩阵乘积,其中一个B矩阵 . 选择哪个B由维度为n的给定索引向量I确定,其可以取1到k的值 . 在我的例子中,B是权重变量,而I是作为输入给出的另一个张量变量 .
numpy中的代码示例如下所示:
A = array([[1, 0, 1],
[0, 0, 1],
[1, 1, 0],
[0, 1, 0]])
B1 = array([[1, 1],
[2, 1],
[3, 6]])
B2 = array([[1, 5],
[3, 2],
[0, 2]])
B = [B1, B2]
I = [1, 0, 0, 1]
n = A.shape[0]
p = A.shape[1]
q = B1.shape[1]
C = np.zeros(shape = (n,q))
for i in xrange(n):
C[i,:] = np.dot(A[i,:],B[I[i]])
如何在张量流中进行转换?
在我的具体情况下,变量定义为:
A = tf.placeholder("float", [None, p])
B1 = tf.Variable(tf.random_normal(p,q))
B2 = tf.Variable(tf.random_normal(p,q))
I = tf.placeholder("float",[None])
2 回答
这有点棘手,可能有更好的解决方案 . 以你的第一个例子,我的方法计算C如下:
其中
diag([0,1,1,0])
是对角线矩阵,其对角线具有向量[0,1,1,0]
. 这可以通过TensorFlow中的tf.diag()来实现 .为方便起见,我假设k <= n(否则一些B矩阵将保持未使用状态) . 以下脚本从向量I获取那些对角线值,并如上所述计算C:
作为改进,可以使用向量化实现而不是使用for循环来计算C.
只做2次矩阵乘法
在张量流中
如果您需要重新组织C张量,您也可以使用收集