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

How to compute weighted average of tensor A along an axis with weights specified by tensor B in tensorflow?

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

但是,我想沿着 axis = 1 对张量 A 进行 "weighted average"。
权重在具有维度 (d,b) 的矩阵 B 中指定。

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

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

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

如果B是一个向量,你可以这样做:

C = tf.tensordot(A,B,[1,0]) 以获得形状 (a,c) 的矢量 C,其中包含使用 axis=1 中指定的权重 A 的加权平均值=12=].

更新:

您可以这样做:

A = A*B[:,:,None] 

正在对 AB 进行逐元素乘法运算,其中 B 存储赋予 A 中每个元素的权重。 那么:

C = tf.reduce_mean(A,axis=1)

将进行加权平均,因为 A 中的每个元素都已乘以其权重。

因为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)

,同样的答案也适用