Tensorflow重复数组

时间:2017-05-26 10:16:53

标签: tensorflow

我很抱歉,但我已经搜索了很长时间,但我找不到答案。我正在寻找Tensorflow函数,它在另一个方向上重复秩1 Tensor以生成秩2张量。 原因是我有两个1级张量,我想计算张量的每个元素之间的差异。

感谢您的帮助,

P

2 个答案:

答案 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可以解决此问题:

  1. tf.repeat:tf.repeat(输入,重复,轴=无,名称=无)。可以在tf 1.15之后使用该API

  2. tf.keras.backend.repeat_elements:tf.keras.backend.repeat_elements(x,表示,轴)。 “ rep”应该是Python整数,而不是Tensor。