我想合并两个可变长度张量。
由于它们的形状不匹配,我不能使用tf.concat或tf.stack.
所以我想我应该把其中一个压平,然后把它附加到另一个的每个元素上——但我不知道怎么做。
例如,
a = [ [1,2], [3,4] ]
flat_b = [5, 6]
combine(a, flat_b) would be [ [ [1,5,6], [2,5,6] ],
[ [3,5,6], [4,5,6] ] ]
有这样的方法吗?
使用tf.map_fn
和tf.concat
,示例代码:
import tensorflow as tf
a = tf.constant([ [1,2], [3,4] ])
flat_b = [5, 6]
flat_a = tf.reshape(a, (tf.reduce_prod(a.shape).numpy(), ))[:, tf.newaxis]
print(flat_a)
c = tf.map_fn(fn=lambda t: tf.concat([t, flat_b], axis=0), elems=flat_a)
c = tf.reshape(c, (-1, a.shape[1], c.shape[1]))
print(c)
输出:
tf.Tensor(
[[1]
[2]
[3]
[4]], shape=(4, 1), dtype=int32)
tf.Tensor(
[[[1 5 6]
[2 5 6]]
[[3 5 6]
[4 5 6]]], shape=(2, 2, 3), dtype=int32)
这是前面答案的一个简单版本。与其多次整形,我更喜欢使用tf.expand_dims
和tf.stack
。后者添加了一个维度,从而减少了对tf.reshape
的一次调用,这可能会令人困惑。
import tensorflow as tf
a = tf.constant([[1,2], [3,4]])
b = [5, 6]
flat_a = tf.reshape(a, [-1])
c = tf.map_fn(lambda x: tf.concat([[x], b], axis=0), flat_a)
c = tf.stack(tf.split(c, num_or_size_splits=len(a)), axis=0)
<tf.Tensor: shape=(2, 2, 3), dtype=int32, numpy=
array([[[1, 5, 6],
[2, 5, 6]],
[[3, 5, 6],
[4, 5, 6]]])>
您可以遍历元素。在列表形式中,你会做一些类似out[i][j]=[a[i][j]]+flat_b的事情,从out变成与a相同的形状开始。这得到了你想要的形式。我不确定tensorflow库中是否存在这种元素串联。