python - Theano/numpy 高级索引

标签 python numpy machine-learning computer-vision theano

我有一个 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/

相关文章:

Github 拉取请求的指数平滑(工作代码)的 Python Numpy 迭代改进

python - 使用 numpy.mean 分组

r - 尝试在 R 中使用朴素贝叶斯学习器,但 Predict() 给出的结果与模型建议的结果不同

python - Keras 总是预测相同的输出

python - 对于Where条件中的语法

python - 调整 numpy.memmap 数组的大小

python - 发布后单用户补丁时jmeter引发线程异常

python - 如何将魔杖图像对象转换为 numpy 数组(没有 OpenCV)?

python - 光谱聚类 Scikit 学习集群中的打印项目

python - 在git中检查配置文件时 stash 密码