Theano 高级张量索引,共享索引
Theano advanced indexing for tensor, shared index
我有一个张量 probs
和 probs.shape = (max_time, num_batches, num_labels)
。
我有一个张量 targets
和 targets.shape = (max_seq_len, num_batches)
,其中值是标签索引,即 probs
中的第三维。
现在我想得到一个张量 probs_y
probs.shape = (max_time, num_batches, max_seq_len)
,其中第三维是 targets
中的索引。基本上
probs_y[:,i,:] = probs[:,i,targets[:,i]]
所有 0 <= i < num_batches
.
我怎样才能做到这一点?
已发布类似问题的解决方案 。
如果我理解正确的话,那里的解决方案是:
probs_y = probs[:,T.arange(targets.shape[1])[None,:],targets]
但这似乎不起作用。我得到:
IndexError: only integers, slices (`:`), ellipsis (`...`), numpy.newaxis (`None`) and integer or boolean arrays are valid indices
.
此外,创建临时 T.arange
是不是有点贵? Esp 当我尝试通过真正使它成为一个完整的密集整数数组来解决问题时。应该有更好的方法。
也许theano.map
?但据我所知,这并没有并行化代码,所以这也不是解决方案。
这对我有用:
import theano
import theano.tensor as T
max_time, num_batches, num_labels = 3, 4, 6
max_seq_len = 5
probs_ = np.arange(max_time * num_batches * num_labels).reshape(
max_time, num_batches, num_labels)
targets_ = np.arange(num_batches * max_seq_len).reshape(max_seq_len,
num_batches) % (num_batches - 1) # mix stuff up
probs, targets = map(theano.shared, (probs_, targets_))
print probs_
print targets_
probs_y = probs[:, T.arange(targets.shape[1])[:, np.newaxis], targets.T]
print probs_y.eval()
以上使用了索引的转置版本。您的确切提议也有效
probs_y2 = probs[:, T.arange(targets.shape[1])[np.newaxis, :], targets]
print probs_y2.eval()
print (probs_y2.dimshuffle(0, 2, 1) - probs_y).eval()
所以你的问题可能出在其他地方。
至于速度,我不知道还有什么能比这更快。 map
,这是 scan
的特化,几乎可以肯定不是。我不知道 arange
实际构建到什么程度,而不是简单地迭代。
我有一个张量 probs
和 probs.shape = (max_time, num_batches, num_labels)
。
我有一个张量 targets
和 targets.shape = (max_seq_len, num_batches)
,其中值是标签索引,即 probs
中的第三维。
现在我想得到一个张量 probs_y
probs.shape = (max_time, num_batches, max_seq_len)
,其中第三维是 targets
中的索引。基本上
probs_y[:,i,:] = probs[:,i,targets[:,i]]
所有 0 <= i < num_batches
.
我怎样才能做到这一点?
已发布类似问题的解决方案
如果我理解正确的话,那里的解决方案是:
probs_y = probs[:,T.arange(targets.shape[1])[None,:],targets]
但这似乎不起作用。我得到:
IndexError: only integers, slices (`:`), ellipsis (`...`), numpy.newaxis (`None`) and integer or boolean arrays are valid indices
.
此外,创建临时 T.arange
是不是有点贵? Esp 当我尝试通过真正使它成为一个完整的密集整数数组来解决问题时。应该有更好的方法。
也许theano.map
?但据我所知,这并没有并行化代码,所以这也不是解决方案。
这对我有用:
import theano
import theano.tensor as T
max_time, num_batches, num_labels = 3, 4, 6
max_seq_len = 5
probs_ = np.arange(max_time * num_batches * num_labels).reshape(
max_time, num_batches, num_labels)
targets_ = np.arange(num_batches * max_seq_len).reshape(max_seq_len,
num_batches) % (num_batches - 1) # mix stuff up
probs, targets = map(theano.shared, (probs_, targets_))
print probs_
print targets_
probs_y = probs[:, T.arange(targets.shape[1])[:, np.newaxis], targets.T]
print probs_y.eval()
以上使用了索引的转置版本。您的确切提议也有效
probs_y2 = probs[:, T.arange(targets.shape[1])[np.newaxis, :], targets]
print probs_y2.eval()
print (probs_y2.dimshuffle(0, 2, 1) - probs_y).eval()
所以你的问题可能出在其他地方。
至于速度,我不知道还有什么能比这更快。 map
,这是 scan
的特化,几乎可以肯定不是。我不知道 arange
实际构建到什么程度,而不是简单地迭代。