如果我们使用索引矩阵,我们是否需要在Theano中使用flatten和reshape?

时间:2017-06-18 10:00:39

标签: python numpy theano lstm flatten

我尝试理解Theano implementation of LSTM(目前链接因任何原因无法正常工作,但我希望很快就会回来)。

在代码中我看到以下部分:

emb = tparams['Wemb'][x.flatten()].reshape([n_timesteps,
                                            n_samples,
                                            options['dim_proj']])

使其独立于上下文"我用以下方式重写它:

e = W[x.flatten()]].reshape([n1, n2, n3])

其中x的维度为(n1, n2)W的维度为(N, n3)

所以,我的假设是代码可以重写为更短。特别是我们可以写:

e = W[x]

或者,如果我们使用原始符号,则应该是:

emb = tparams['Wemb'][x]

我是对的吗?

为了提供更多的上下文,x是一个包含表示单词的整数的二维数组(例如27表示"单词数字27和#34;)。原始符号中我的符号(或W)中的tparams['Wemb']是一个2D矩阵,其中每一行对应一个单词。因此,它是一个嵌入矩阵(Word2Vec)的单词,将每个单词映射到一个实数值的向量。

1 个答案:

答案 0 :(得分:3)

是的,你是对的。

W[x.flatten()]]为您提供由W的值定义的x行(即单词)。结果是shape = (n1*n2,n3)。让我们称之为“单词列表”(不是python列表,而只是一个常见的语音列表)。 然后,重塑为您提供所需的大小,其中单词列表在n1n2个单词的W[x]页中提供。

您与n2达到相同的效果,因为x的{​​{1}}行中的每一行都会为您提供结果的n1页之一。

这是一个示例程序,显示两个表达式都是等价的:

import numpy as np

N = 4
n3 = 5
W = np.arange(n3*N).reshape((N,n3))

print("W = \n", W)

n1 = 2
n2 = 3
x = np.random.randint(low=0, high=N,size=(n1,n2))

print("\nx = \n", x)

print("\ne = \n", W[x.flatten()].reshape([n1, n2, n3]))

print("\nalternativeE = \n", W[x])