我很抱歉,但我已经搜索了很长时间,但我找不到答案。我正在寻找Tensorflow函数,它在另一个方向上重复秩1 Tensor以生成秩2张量。 原因是我有两个1级张量,我想计算张量的每个元素之间的差异。
感谢您的帮助,
P
答案 0 :(得分:0)
首先重复1-D张量,您可以使用tf.tile
所以例如,如果你希望形状[n]的形状[n,m]的形状,你可以按如下方式使用它:
output = tf.tile(tf.expand_dims(input, axis=1), [1, m])
tf.expand_dims将添加大小为1的新维度,因此形状将从[n]更改为[n,1],然后tf.tile将重复[1,m]时间,因此形状将变为[n * 1,1 * m] = [n,m]
或者如果您希望输出形状为[m,n],您可以这样做:
output = tf.tile(tf.expand_dims(input, axis=0), [m, 1])
但我想补充一点来计算两个一维张量中所有元素之间的差异,你不需要重复它们,你可以像这样使用广播:
output = tf.expand_dims(input1, axis=1) - input2
因此如果input1
的形状为[n]而input2
的形状为[m],则tf.expand_dims会为input1
添加尺寸,因此它会成形[n,1]并且在减法期间,Tensorflow将尝试使用广播匹配它们的形状。由于第二个操作数(input2
)的等级小于第一个操作数(扩展的input1
)的等级,所以它将在第二个操作数的形状前面加1,直到它匹配为止第一个操作数的等级,因此操作数的形状将是[n,1]和[1,m]。然后在减法期间,将广播尺寸1的尺寸,就好像它们与另一个操作数中的相应尺寸尺寸匹配一样。因此结果将被塑造为[n,m]。这就是为什么在Tensorflow中[1,2,3] +1类似于[1,2,3] + [1,1,1],它们都给出[2,3,4]作为输出。
此解决方案具有更高的内存效率,因为在减法之前不会进行真正的重复,广播会隐式处理形状不匹配。
答案 1 :(得分:0)
有几种API可以解决此问题:
tf.repeat:tf.repeat(输入,重复,轴=无,名称=无)。可以在tf 1.15之后使用该API
tf.keras.backend.repeat_elements:tf.keras.backend.repeat_elements(x,表示,轴)。 “ rep”应该是Python整数,而不是Tensor。