我为此遇到了以下问题:
我有一个包含M个元素的固定长度列表。此列表包含M个张量,每个张量均为3维,形状为[p,q,s]。从那时起,我需要一个形状为[p,q,s]的3维张量,但是需要从列表中的所有M个张量中提取该张量。
此信息在形状为[p]的附加张量中提供。对于n = 1,...,M的每个[p_n,:,:],都有一个索引值,该值指示数据应来自M个元素中的哪个元素。
这应该在不迭代张量的情况下起作用,因为列表的大小是固定的。但是我现在不能解决这个问题:-/
感谢您的帮助! :-)
示例:
给出一个包含M = 3个3维张量的列表:
shape(m0) = [5, 7, 16]
shape(m1) = [5, 7, 16]
shape(m2) = [5, 7, 16]
和len(index)= 5的索引向量:
index = [0, 1, 1, 2, 0]
我想计算一个形状(v)= [5,7,16]的3维张量v:
v[0, :, :] = m1[0, :, :] because of index[0] = 1
v[1, :, :] = m1[1, :, :] because of index[0] = 1
v[2, :, :] = m1[2, :, :] because of index[0] = 1
v[3, :, :] = m2[3, :, :] because of index[0] = 2
v[4, :, :] = m0[4, :, :] because of index[0] = 0
我发现一个解决方案,如果shape(m0)= shape(m1)= shape(m2):
M = [m1, m2, m3]
v = []
for i in range(5):
v.append(tf.gather(M, index[i])[:, i, :, :])
v = tf.stack(v)
否,如果m0,m1和m2的形状不同,我希望这样做可以。例如:
shape(m0) = [5, 7, 16]
shape(m1) = [5, 8, 16]
shape(m2) = [5, 9, 16]
我通过将张量零填充到列表中的最大形状来解决了这个问题。但是我想要一个没有填充的解决方案。则解不能是具有形状[5,9,16]的张量,而是具有不同形状的长度5的列表,例如。 g。:
v = [v0, v1, v2, v3, v4]
shape(v0) = [5, 7, 16]
shape(v0) = [5, 8, 16]
shape(v0) = [5, 8, 16]
shape(v0) = [5, 9, 16]
shape(v0) = [5, 9, 16]
问题是我在图构建时不知道张量的第二维(7或8或9)。