我正在尝试对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
,我无法计算加权平均值。
有人可以提出解决方案吗?
答案 0 :(得分:1)
我不太明白为什么B
应该有(d,b)
的尺寸。如果B
包含权重以仅在一个维度上对A进行加权平均,则B
只需是向量(b,)
,而不是矩阵。
如果B
是向量,则可以执行以下操作:
C = tf.tensordot(A,B,[1,0])
得到形状为C
的向量(a,c
,该向量包含A
中axis=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)
,则同样的答案也适用。