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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何在张量流中用张量B指定的权重计算张量A的加权平均值?相关的知识,希望对你有一定的参考价值。

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

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

答案

我不太明白为什么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中的每个元素都乘以其权重。

另一答案

由于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,同样的答案也有效。

以上是关于如何在张量流中用张量B指定的权重计算张量A的加权平均值?的主要内容,如果未能解决你的问题,请参考以下文章

如何解决权重矩阵维度较大的张量流梯度问题?

如何在张量流中创建集成?

如何使用 sparse_softmax_cross_entropy_with_logits 在张量流中实现加权交叉熵损失

用在张量流中具有变量依赖性的自定义操作替换图中的节点

从拥抱面权重构建张量流模型的问题

张量流模型不更新权重