gpt4 book ai didi

python - Theano/numpy 高级索引

转载 作者:行者123 更新时间:2023-11-30 09:21:21 25 4
gpt4 key购买 nike

我有一个 4d theano 张量(例如形状为 (1, 700, 16, 95000))和一个形状为 (1, 700, 16, 1024) 的 4d 'mask' 张量,使得mask 是我需要原始张量的索引。如何使用掩码来索引张量?像sample[mask]或sample[:,:,:,mask]这样的东西似乎并没有真正起作用。

我还尝试使用二进制掩码,但由于张量相当大,我收到“设备内存不足”异常。

关于如何从张量获取索引的其他想法也将非常感激。

谢谢

最佳答案

因此,在缺乏答案的情况下,我决定使用计算量更大的解决方案,该解决方案将我的数据展开为索引张量,向索引添加偏移量以将它们带到全局位置,对数据进行索引并将其 reshape 回原来的样子。

我在此处添加我的测试代码,包括矩阵的(注释掉的)解决方案。

def theano_convertion(els, inds, offsets):
els = T.flatten(els)
inds = T.flatten(inds) + offsets
return T.reshape(els[inds], (2, 3, 16, 5))


if __name__ == '__main__':
# command: np.transpose(t[range(2), indices])
# t = np.random.randint(0, 10, (2, 20))
# indices = np.random.randint(0, 10, (5, 2))

t = np.random.randint(0, 10, (2, 3, 16, 20)).astype('int32')
indices = np.random.randint(0, 10, (2, 3, 16, 5)).astype('int32')
offsets = np.asarray(range(1, 2 * 3 * 16 + 1), dtype='int32')
offsets = (offsets * 20) - 20
offsets = np.repeat(offsets, 5)

offsets_tens = T.ivector('offsets')
inds_tens = T.itensor4('inds')
t_tens = T.itensor4('t')

func = theano.function(
[t_tens, inds_tens, offsets_tens],
[theano_convertion(t_tens, inds_tens, offsets_tens)]
)

shaped_elements = []
flattened_elements = []

[tmp] = func(t, indices, offsets)

for i in range(2):
for j in range(3):
for k in range(16):
shaped_elements.append(t[i, j, k, indices[i, j, k, :]])
flattened_elements.append(tmp[i, j, k, :])

print shaped_elements[-1] == flattened_elements[-1]

关于python - Theano/numpy 高级索引,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36773947/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com