Theano功能内的索引体操

时间:2014-08-06 17:36:06

标签: python neural-network theano

我正在使用Theano来实现Bengio et al 2003行的神经n-gram语言模型。这个模型使用了单词的分布式表示,我在编写一个符号表达式时遇到了麻烦,这个表达式允许我根据单词表示向量采用渐变。

根据论文中的符号,我有一个大小为 V xm 的单词表示矩阵C,其中 V 是词汇量大小, m 是单词嵌入的维度。 C的每一行都是一个单词的向量表示。

我的训练数据包括从语料库中提取的n-gram。我们说我让 n = 3 。然后我试图估计 P(w t | w t-1 ,w t-2 。神经网络通过使用 w t-1 w t-2 的连接嵌入向量来估计此概率通过非线性函数预测 w t 。 (有关详细信息,请参阅该文章。)每个单词都由一个词汇表的索引表示,该词汇表还在C中对其表示行进行索引。如果这些索引是 i 1 i 2 i 3 ,我正在尝试写一个Theano表达式。

f(i_3, C[i_1].C[i_2])

其中f包含隐藏图层和非线性函数,C[i_1].C[i_2]是数组C[i_1]C[i_2]的串联。我要做的第一件事就是为C[i_1].C[i_2]写一个象征性的Theano表达式。此外,此功能不仅需要一个训练实例,还需要一小批多个训练实例。

如果我直接使用numpy matricies而不是抽象的Theano表达式,我知道如何做到这一点。例如,如果共享C,并且X N xn - 1 N 单词索引训练向量的小批量,我可以看一下像这样的连接向量:

C.get_value()[X].reshape(X.shape[0], -1)

(我在StackOverflow上学到了一些索引体操elsewhere。)

但是,当我尝试将此表达式编译为Theano函数时,我遇到了错误。

X_var = T.lmatrix('X_var')
function([X_var], C[X_var].reshape(X_var.shape[0], -1))

前面给出了这个错误

Exception: ('The following error happened while compiling the node'
, Reshape{-1 (AdvancedSubtensor1.0, InplaceDimShuffle{x}.0), 
'\n', "Compilation failed (return status=1): 
/Users/williammcneill/.theano/compiledir_Darwin-13.3.0-x86_64-i386-64bit-i386-2.7.6-64/tmpOlUO0n/mod.cpp:300:31: error: 
'new_dims' declared as an array with a negative size.
             npy_intp new_dims[-1];.
                               ^~. 1 error generated.. ", '[Reshape{-1}(<TensorType(float64, matrix)>, <TensorType(int64, (True,))>)]')

我认为这意味着Theano编译器不支持将-1作为最终重塑参数的索引技巧。

等效命令会产生不同的错误。

function([X_var], C[X_var].reshape(X_var.shape[0], X_var.shape[1]*X_var.shape[2]))

ValueError: Expected ndim to be an integer, is <class 'theano.tensor.var.TensorVariable'>

我需要为f编写符号表达式,以便我可以对C采用渐变。任何人都可以帮我这么做吗?

或者,有人可以指出我使用单词嵌入的示例Theano代码。我发现的所有教程材料都是用于在图像数据上编写神经网络,但我还没有看到任何关于如何进行分布式表示的示例。

1 个答案:

答案 0 :(得分:3)

嗯,我是个白痴。均田。我在reshape参数周围错过了一对额外的括号。以下作品。

function([X_var], C[X_var].reshape((X_var.shape[0], -1)))

虽然令人困惑,因为reshape的{​​{1}}方法将采用我上面的两个参数或者像我在答案中那样的元组,但Theano只会编译后者。