Rom*_*man 5 python numpy flatten theano lstm
我试图理解Theano LSTM的实现(目前链接因任何原因都不起作用,但我希望很快就会回来).
在代码中我看到以下部分:
emb = tparams['Wemb'][x.flatten()].reshape([n_timesteps,
n_samples,
options['dim_proj']])
Run Code Online (Sandbox Code Playgroud)
为了使它"与上下文无关",我按以下方式重写它:
e = W[x.flatten()]].reshape([n1, n2, n3])
Run Code Online (Sandbox Code Playgroud)
其中的尺寸x就是(n1, n2)和的维数W是(N, n3).
所以,我的假设是代码可以重写为更短.特别是我们可以写:
e = W[x]
Run Code Online (Sandbox Code Playgroud)
或者,如果我们使用原始符号,它应该是:
emb = tparams['Wemb'][x]
Run Code Online (Sandbox Code Playgroud)
我对吗?
为了提供更多的上下文,x是包含表示单词的整数的2D数组(例如27表示"单词数字27").在W我的符号(或tparams['Wemb'])在原来的符号是其中每行对应于一个字一个二维矩阵.因此,它是一个字嵌入矩阵(Word2Vec),将每个字映射到实值向量.
是的你是对的。
W[x.flatten()]]W给出由 的值定义的行(即单词) x。所以结果是shape = (n1*n2,n3). 我们将其称为“单词列表”(不是 Python 列表,而只是一个常见的语音列表)。然后重塑为您提供所需的大小,其中单词列表按单词n1页面细分n2。
您可以使用 实现相同的效果W[x],因为 的每一行都会n2为您提供结果的一页x。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])
Run Code Online (Sandbox Code Playgroud)