首页 > 解决方案 > 比较不同维度的张量

问题描述

我有两个不同维度的张量。说带有维度的张量A和带有维度的(1,3)张量。B(1, 5)

A = [a1, a2, a3]
B = [b1, b2, b3, b4, b5]

这些值之间存在已知的分组。例如,b1b2对应于a1b3对应于a2,并且b4b5对应于a3。我想计算这些张量之间的差异。所以我想要张量C为:

C = [b1-a1, b2-a1, b3-a2, b4-a3, b5-a3]

为了做到这一点,我必须转换A为:

A = [a1, a1, a2, a3, a3]

然后我可以计算C

有没有办法通过将给定张量的值复制给定次数来创建新张量?例如,我可以提供数组/张量来指示每个元素应该重复[2, 1, 2]多少次。A

我尝试使用tf.tile,但它在维度级别运行并且不能复制张量的值。

tf.map_fn似乎是对张量中的值进行修改的好方法。但我无法让它适用于上述情况。

我试过这样的事情:

k=(tf.constant([1,2]), tf.constant([2,3]))
z=tf.map_fn(lambda x: [code here to duplicate elements in x[0] by x[1] times], k, dtype=tf.int32)

但无法弄清楚[code here to duplicate elements in x[0] by x[1] times]

标签: tensorflow

解决方案


你不需要使用tf.map_fn. 矢量化可以通过组合tf.sequence_mask和来实现tf.boolean_mask

import tensorflow as tf

A = tf.constant([1,2,3])
indic = tf.constant([2,1,2])

max_length = tf.reduce_max(indic,axis=0)
# 2
new_A = tf.tile(tf.expand_dims(A,1),[1,max_length])
# [[1 1]
#  [2 2]
#  [3 3]]
mask = tf.sequence_mask(indic,max_length)
# [[ True  True]
#  [ True False]
#  [ True  True]]
result = tf.boolean_mask(new_A,mask)

with tf.Session() as sess:
    print(sess.run(result))

[1 1 2 3 3]

推荐阅读