theano ~ 使用索引矩阵和嵌入矩阵来生成 3D 张量?

theano ~ use an index matrix and embeddings matrix to produce a 3D tensor?

假设我有一个索引矩阵:

index_matrix = [[0,1],
                [2,1]]

还有一个嵌入矩阵:

embeddings_matrix = [[1,2,3],
                     [2,3,4],
                     [4,5,6],
                        .
                        .
                        .   ]

index_matrix 中的每个元素对应于 embeddings_matrix 中的特定行。例如,index_matrix中的0对应embeddings_matrix中的[1,2,3]

仅使用 theano 语法,如何构建 3D 张量,其中 index_matrix 中的每个索引都替换为 embeddings_matrix 中的行或向量?

编辑:我能够解决类似的问题:使用上面的 index_vector = [0,1,2,1]embeddings_matrix 生成二维张量。为此,我需要以下 theano 语法:

Matrix = embeddings_matrix[index_vector].reshape((index_vector.shape[0], -1))

但是,我有点卡在 3D 的情况下。

您可以使用索引矩阵简单地索引到嵌入矩阵中:

import numpy
import theano
import theano.tensor as tt

embeddings_matrix = theano.shared(numpy.array([[1, 2, 3], [2, 3, 4], [4, 5, 6]], dtype=theano.config.floatX))
index_matrix = tt.imatrix()
y = embeddings_matrix[index_matrix]
f = theano.function([index_matrix], y)
output = f(numpy.array([[0, 1], [2, 1]], dtype=numpy.int32))
print output.shape, '\n', output

这会打印

(2L, 2L, 3L) 
[[[ 1.  2.  3.]
  [ 2.  3.  4.]]

 [[ 4.  5.  6.]
  [ 2.  3.  4.]]]

输出是 3D 的,索引矩阵中的每个元素根据需要替换为相应的嵌入向量。