如何在张量流中用张量B指定的权重计算张量A的加权平均值?

问题描述 投票:0回答:2

我正在尝试对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,我无法计算加权平均值。

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

python tensorflow recurrent-neural-network weighted-average
2个回答
1
投票

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

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

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

更新:

你可以这样做:

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

这是AB的元素明智的乘法,其中B存储给A中每个元素的权重。然后:

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

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


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)有形状(a, b, c)。当它们相乘时,扩展的B也将被视为具有形状c,最后一个维度是相同值的broadcasting副本。这叫做B

由于广播如何运作,如果(1, b)形状qazxswpoi,同样的答案也有效。

© www.soinside.com 2019 - 2024. All rights reserved.