如何计算张量 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]
正在对 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)
。当它们相乘时,展开的 B 也将被视为具有形状 (a, b, c)
,最后一个维度是相同值的 c
个副本。这叫做broadcasting.
由于广播的工作原理,如果 B
的形状为 (1, b)
。
,同样的答案也适用
我正在尝试对 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]
正在对 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)
。当它们相乘时,展开的 B 也将被视为具有形状 (a, b, c)
,最后一个维度是相同值的 c
个副本。这叫做broadcasting.
由于广播的工作原理,如果 B
的形状为 (1, b)
。