Theano 中的高级 2d 索引从图像中提取多个像素

Advanced 2d indexing in Theano to extract multiple pixels from an image

背景

我有一张图像,我想在 x,y 坐标的数字 (P) 处采样。

在 Numpy 中,我可以使用高级索引通过以下方式执行此操作:

 n_points = n_image[ [n_pos[:,1],n_pos[:,0]] ]

这个 returns 从图像中采样的 P 像素向量。

问题

如何在 Theano 中进行高级索引?

我试过的

我试过theano中对应的代码:

t_points = t_image[ [t_pos[:,1],t_pos[:,0]] ]

此编译和执行没有任何警告消息,但会产生形状为 (2,8,100) 的输出张量,因此看起来它正在执行一些基本索引的变体,返回大量图像行,而不是提取像素。

完整代码

import numpy as np
import theano.tensor as T
from theano import function, shared
import theano

P = 8 # Number of points to sample
n_image = np.zeros((100,100), dtype=np.int16)  # 100*100 image
n_pos = np.zeros( (P,2) , dtype=np.int32) # Coordinates within the image

# NUMPY Method
n_points = n_image[ [n_pos[:,1],n_pos[:,0]] ]

# THEANO method
t_pos = T.imatrix('t_pos')
t_image = shared( n_image )
t_points = t_image[ [t_pos[:,1],t_pos[:,0]] ]
my_fun = function( [t_pos], t_points)
t_points = my_fun(n_pos)

print n_points.shape
print t_points.shape

Numpy 打印 (8,),Theano 打印 (2,8,100)。

我的Theano版本是0.7.0.dev-RELEASE

这似乎是 Theano 和 numpy 高级索引之间的细微差异(还有其他差异不适用于此处)。

而不是

t_points = t_image[ [t_pos[:,1],t_pos[:,0]] ]

你需要使用

t_points = t_image[ (t_pos[:,1],t_pos[:,0]) ]

注意从列表列表到列表元组的变化。此变体也适用于 numpy,因此最好也只使用元组而不是列表。