Theano为张量,共享索引

时间:2015-07-09 13:31:03

标签: python theano

我有张量probsprobs.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

我怎样才能做到这一点?

解决方案的类似问题已发布here

如果我理解正确,那里的解决方案将是:

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?但据我了解,这并不是代码的并行化,所以这也不是解决方案。

1 个答案:

答案 0 :(得分:3)

这对我有用:

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()

所以也许你的问题就在其他地方。

至于速度,我对于比这更快的东西感到茫然。 mapscan的专业化几乎肯定不是。我不知道arange实际构建的程度,而不是简单地迭代。