如何计算张量A在沿着张量流中由张量B指定的权重的轴上的加权平均值?

时间:2019-03-28 13:46:06

标签: python tensorflow recurrent-neural-network weighted-average

我正在尝试对RNN输出应用加权平均方案。
RNN输出由具有尺寸A的张量(a,b,c)表示。
我可以简单地使用tf.reduce_mean(A,axis=1)来获得具有维度C的张量(a,c)

但是,我想对A进行张量axis = 1的“加权平均”。
权重在维度为B的矩阵(d,b)中指定。

对于d = 1,我可以执行tf.tensordot(A,B,[1,1])以获取维度(a,c)的结果。
现在,对于d=a,我无法计算加权平均值。

有人可以提出解决方案吗?

2 个答案:

答案 0 :(得分:1)

我不太明白为什么B应该有(d,b)的尺寸。如果B包含权重以仅在一个维度上对A进行加权平均,则B只需是向量(b,),而不是矩阵。

如果B是向量,则可以执行以下操作:

C = tf.tensordot(A,B,[1,0])得到形状为C的向量(a,c,该向量包含Aaxis=1的加权平均值,使用{{1 }}。

更新

您可以执行以下操作:

B

正在进行A = A*B[:,:,None] A的元素逐个相乘,其中B存储给B中每个元素赋予的权重。 然后:

A

将进行加权平均,因为C = tf.reduce_mean(A,axis=1) 中的每个元素都已乘以其权重。

答案 1 :(得分:1)

由于B已被规范化,答案是

tf.reduce_sum(A * B[:, :, None], axis=1)

使用None进行索引会添加一个新维度,这是从numpy继承的行为。B[:,:, None]添加了最后一个维度,因此结果的形状为(a, b, 1)。您可以使用tf.expand_dims来实现相同的目的,其名称可能对您更有意义。

A的形状为(a, b, c),而B[:, :, None]的形状为(a, b, 1)。当它们相乘时,扩展的B也会被视为具有形状(a, b, c),最后一个维度是具有相同值的c个副本。这称为broadcasting

由于广播的工作原理,如果B的形状为(1, b),则同样的答案也适用。