在第三维索引张量

Indexing a tensor in the 3rd dimension

我有一批 N 长度为 L 的整数序列,它们被嵌入到 N*L*d 张量中。该序列由我的网络架构自动编码。所以,我有:

from theano import tensor as T
X = T.imatrix('X')  # N*L elements in [0,C]
EMB = T.tensor('Embedding')  # N*L*d
...  # some code goes here :-)
PY = T.tensor('PY')  # N*L*C probability of the predicted class in [0,C]
cost = -T.log(PY[X])  

据我所知,索引位于张量的第一维,因此我不得不使用 theano.scan。有没有办法直接索引张量?

听起来你想要 theano.tensor.nnet.categorical_crossentropy 的 3 维版本?

如果是这样,那么我认为您可以简单地将真实 class 标签索引的矩阵展平为一个向量,并将预测的 class 概率的 3D 张量展平为一个矩阵,然后使用内置的函数。

cost = T.nnet.categorical_crossentropy(
    Y.reshape((Y.shape[0] * Y.shape[1], X.shape[2])),
    X.flatten())

可能需要先调整 Y 中条目的顺序(例如通过 dimshuffle)以确保被比较的矩阵和向量中的条目相互对应。

这里我们假设,正如问题所暗示的那样,序列没有被填充——它们的长度正好是 L 个元素。如果序列实际上被填充,那么您可能需要做一些更复杂的事情来避免计算填充区域内的成本元素。