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) )
我希望从c
和a
获得一个名为b
的新张量。
1000是批量大小,c
的形状应为(1000,20, 10, 1)
。对于a
和b
:ai
和bi
的每个实例,它们都是二维张量。
新实例ci
是ai
和bi
的结果,它有20 * 10 = 200
个元素,每个元素分别是ai和bi的点积,分别为128维。因此总共有200个点产品结果。 ci更像是一个二维图像。
如何初始化此操作?
修改: 当我使用代码时,点积的操作应该替换为一些其他函数,如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)
答案 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
包含a
和b
中所有项目的所有成对乘法。 reduced
聚合最后一个轴的总和。