如何从张量流中的两个二维张量得到交叉合约矩阵?

时间:2018-05-10 06:21:30

标签: python matrix tensorflow multidimensional-array vectorization

import tensorflow as tf 
with tf.Session() as sess:
    with tf.variable_scope('masssdsms'):
        a = tf.get_variable('a', [1000,24,128], dtype=tf.float32, initializer=tf.random_normal_initializer(stddev=0.1) )
        b = tf.get_variable('b', [1000,15,128], dtype=tf.float32, initializer=tf.random_normal_initializer(stddev=0.1) )

我希望从ca获得一个名为b的新张量。 1000是批量大小,c的形状应为(1000,20, 10, 1)。对于abaibi的每个实例,它们都是二维张量。 新实例ciaibi的结果,它有20 * 10 = 200个元素,每个元素分别是ai和bi的点积,分别为128维。因此总共有200个点产品结果。 ci更像是一个二维图像。

enter image description here

如何初始化此操作?

修改: 当我使用代码时,点积的操作应该替换为一些其他函数,如guassian距离或余弦距离等,这是图中的联系表示法。 所以我需要一个通用的方法来做到这一点。

这是我的设计,但我不确定这是否是一种有效的方法:

with tf.Session() as sess:
    with tf.variable_scope('masssdsms'):
        a = tf.get_variable('a', [1000,24,128], dtype=tf.float32, initializer=tf.random_normal_initializer(stddev=0.1) )
        b = tf.get_variable('b', [1000,15,128], dtype=tf.float32, initializer=tf.random_normal_initializer(stddev=0.1) )
        i = 999 # for i in range(1000):
        ai = tf.slice(a,[i,0,0],[1,-1,-1]) # (1,24,128)
        bi = tf.slice(b,[i,0,0],[1,-1,-1]) # (1,15,128)
        ci = contact_func(ai,bi) # (1,24,15)

2 个答案:

答案 0 :(得分:0)

使用matmul维度-1的转置执行矩阵a的{​​{1}}应该会得到所需的结果:

b

编辑: 对于c = tf.matmul(a, tf.transpose(b, [0, 2, 1])) # [1000, 20, 10] # to get (1000, 20, 10, 1) you do tf.expand_dims(c, 3) 操作,您可能需要使用contact_func运算符手动进行广播。以下是tile的代码:

gaussian distance

答案 1 :(得分:0)

您可以通过巧妙的广播应用来实现这一目标。试试这个:

a = tf.ones([1000, 20, 128])
b = tf.ones([1000, 10, 128])

a = tf.expand_dims(a, axis=1)               # [1000, 1, 20, 128]
b = tf.expand_dims(b, axis=2)               # [1000, 10, 1, 128]

products = a * b                            # [1000, 10, 20, 128]
reduced = tf.reduce_sum(products, axis=-1)  # [1000, 10, 20]

products包含ab中所有项目的所有成对乘法。 reduced聚合最后一个轴的总和。