tensorflow:像matmul这样的ops,包含两个数组之间的每个元素组合

时间:2018-06-06 07:27:52

标签: python tensorflow

tensorflow中的一个问题。 有两个张量

a=tf.placeholder(tf.float32, [None, 1])
b=tf.placeholder(tf.float32, [None, 1])

我可以用

tf.matmul(a,b,False,True)

得到像这样的张量

#[[a1b1 a1b2 a1b3 a1b4 …] 
#[a2b1 a2b2 a2b3 a2b4 …] 
#[a3b1 a3b2 a3b3 a3b4 …] 
#…]

但现在,如果我想得到像这样的张量

#[[a1-b1 a1-b2 a1-b3 a1-b4 …] 
#[a2-b1 a2-b2 a2-b3 a2-b4 …] 
#[a3-b1 a3-b2 a3-b3 a3-b4 …] 
#…]

或者

#[[tf.pow(a1,b1) tf.pow(a1,b2) tf.pow(a1,b3) tf.pow(a1,b4) …] 
#[tf.pow(a2,b1) tf.pow(a2,b2) tf.pow(a2,b3) tf.pow(a2,b4) …] 
#[tf.pow(a3,b1) tf.pow(a3,b2) tf.pow(a3,b3) tf.pow(a3,b4) …] 
#…]

我该怎么做?

1 个答案:

答案 0 :(得分:1)

您可以使用tensorflow broadcasting功能:

  

#[[a1-b1 a1-b2 a1-b3 a1-b4 ...]
    #[a2-b1 a2-b2 a2-b3 a2-b4 ...]
    #[a3-b1 a3-b2 a3-b3 a3-b4 ...]
    #...]

# Subtract a and b transpose
c = a - tf.transpose(b)

<强>输出:

#[[ 0. -1. -2. -3.]
#[ 1.  0. -1. -2.]
#[ 2.  1.  0. -1.]
#[ 3.  2.  1.  0.]]

# for input: a:[[1],[2],[3],[4]],b:[[1],[2],[3],[4]]
  

#[[tf.pow(a1,b1)tf.pow(a1,b2)tf.pow(a1,b3)tf.pow(a1,b4)...]
      #[tf.pow(a2,b1)tf.pow(a2,b2)tf.pow(a2,b3)tf.pow(a2,b4)...]
      #[tf.pow(a3,b1)tf.pow(a3,b2)tf.pow(a3,b3)tf.pow(a3,b4)...]
      #...]

#form (i,j) index matrices and then apply tf.pow
i = tf.tile(a, [1, tf.shape(b)[0]])
j = tf.transpose(tf.tile(b, [1, tf.shape(a)[0]]))
power = tf.pow(i,j)

<强>输出:

# index i              index j
#[[1., 1., 1., 1.],    [[1., 2., 3., 4.]
#[2., 2., 2., 2.],      [1., 2., 3., 4.]
#[3., 3., 3., 3.],      [1., 2., 3., 4.]
#[4., 4., 4., 4.]       [1., 2., 3., 4.]]

#Output
#[[  1.   1.   1.   1.]
#[  2.   4.   8.  16.]
#[  3.   9.  27.  81.]
#[  4.  16.  64. 256.]]