如何在张量流中用张量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
),其中包含A
的axis=1
加权平均值,使用B
中指定的权重。
更新:
你可以这样做:
A = A*B[:,:,None]
这是A
和B
的元素明智的乘法,其中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 在张量流中实现加权交叉熵损失