Tensorflow1 concat 二维张量与所有按行排列

Tensorflow1 concat 2D tensors with all row wise permutations

假设我们有两个形状为 (n, k) 和 (n, k) 的二维张量。我们想要将两个张量与所有行方向排列相结合,使得所得张量的形状为 (n, n, 2*k).

示例,

A = [[a, b], [c, d]]; B = [[e, f], [g, h]]

生成的张量应该是:

[[[a, b, e, f], [a, b, g, h]], [[c, d, e, f], [c, d, g, h]]]

假设输入张量 A 和 B 具有非静态形状,因此我们不能使用 for 循环 tf.shape() 索引值。

感谢任何帮助。非常感谢。

试试这个方法:

A = np.array([['a', 'b'], ['c', 'd']])
B = np.array([['e', 'f'], ['g', 'h']])

C = np.array([np.concatenate((a, b), axis=0) for a in A for b in B])

你可以像这样轻松地将它转换为tensorflow

data =tf.convert_to_tensor(C, dtype=tf.string)

输出:

<tf.Tensor: shape=(4, 4), dtype=string, numpy=
array([[b'a', b'b', b'e', b'f'],
       [b'a', b'b', b'g', b'h'],
       [b'c', b'd', b'e', b'f'],
       [b'c', b'd', b'g', b'h']], dtype=object)>

不确定列表理解部分是否对大数据最有效

使用tf.concat with tf.repeat and tf.tile

import tensorflow as tf
import numpy as np

# Input
A = tf.convert_to_tensor(np.array([['a', 'b'], ['c', 'd']]))
B = tf.convert_to_tensor(np.array([['e', 'f'], ['g', 'h']]))

# Repeat, tile and concat
C = tf.concat([tf.repeat(A, repeats=tf.shape(A)[-1], axis=0), 
               tf.tile(B, multiples=[tf.shape(A)[0], 1])], 
              axis=-1)

# Reshape to requested shape
C = tf.reshape(C, [tf.shape(A)[0], tf.shape(A)[0], -1])

print(C)

>>> <tf.Tensor: shape=(2, 2, 4), dtype=string, numpy=
>>> array([[[b'a', b'b', b'e', b'f'],
>>>         [b'a', b'b', b'g', b'h']],
>>>        [[b'c', b'd', b'e', b'f'],
>>>         [b'c', b'd', b'g', b'h']]], dtype=object)>