给定具有两个或更多不同维度占位符的网络,例如
x1 = tf.placeholder(tf.int32, [None, seq_len])
x2 = tf.placeholder(tf.int32, [None, seq_len])
xn = tf.placeholder(tf.int32, [None, None, seq_len]
每个占位符的第一个维度对应于小批量大小。 seq_len
是输入的长度。第二个维度就像我需要为小批量中的每个索引与x1
和x2
一起处理的输入列表。如何通过批量索引对这些张量进行分组以对其进行操作?
例如
x1 = [[1, 2, 3], [4, 5, 6]]
x2 = [[7, 8, 9], [8, 7, 6]]
xn = [[[1, 5, 2], [7, 2, 8], [3, 2, 5]], [[8, 9, 8]]]
我需要将x1[0] i.e. [1, 2, 3]
,x2[0] i.e. [7, 8, 9]
和xn[0] i.e. [[1, 5, 2], [7, 2, 8], [3, 2, 5]]
放在一起,因为我需要在x1[i]
和xn[i]
中的每个元素之间执行矩阵运算所有i
。
请注意xn
的维度锯齿状。
答案 0 :(得分:2)
仍然不确定我是否理解你的问题。如果我理解正确,您的挑战来自xn
维度的锯齿状性质。我有以下方式来展开"展开"沿批量索引。结果是一个大小为batch_size的数组;数组中的每个元素都是Tensor。当然,在评估之前,您可以对所有这些单个张量执行其他操作。
我必须使用tf.scan
为xn[i]
的每个元素执行操作,因为它的第一个维度是动态的。可能存在更好的解决方案。
x1 = np.array([[1, 2, 3]])
xn = np.array([[[1, 5, 2], [7, 2, 8], [3, 2, 5]]])
batch_size = x1.shape[0]
result = []
for batch_idx in range(batch_size):
x1_i = x1[batch_idx]
xn_i = xn[batch_idx]
result.append(tf.scan(fn=lambda a, x: x * x1_i, elems=xn_i, initializer=x1_i))
with tf.Session() as sess:
print sess.run([result[0]])
# result, this is x1[0] multiply each element in xn[0] for all i (element-wise).
# free free to plug in your own matrix operations in the `fn` arg of `tf.scan`.
[array([[ 1, 10, 6],
[ 7, 4, 24],
[ 3, 4, 15]])]