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

标签 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”)。我的符号中的W(或原始符号中的tparams['Wemb'])是一个二维矩阵,其中每一行对应一个单词。因此,它是一个词嵌入矩阵 (Word2Vec),将每个词映射到一个实值向量。

最佳答案

是的,你是对的。

W[x.flatten()]] 为您提供由 x 的值定义的 W 行(即单词)。所以结果是 shape = (n1*n2,n3)。我们称其为“单词列表”(不是 Python 列表,而是普通的语音列表)。 然后 reshape 为您提供所需的大小,其中单词列表被分割为 n1 页的 n2 单词。

您可以使用 W[x] 实现相同的效果,因为 xn2 行中的每一行都给您一个 结果的 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])

关于python - 如果我们使用索引矩阵,是否需要在 Theano 中使用 flatten 和 reshape?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44613824/

相关文章:

Python 3.3 C 字符串处理(wchar_t 与 char)

python - Numpy 向量化,使用列表作为参数

python - Theano CUDA 异常

Python Ctypes 异常 : access violation reading

Python杀死用户拥有的所有进程

python - 删除重复数据Python

python - 由于 polyfit 错误,macOS Big Sur python3 无法导入 numpy

python - 将 "input"传递给 Theano 中的函数的目的/意义是什么?

python - 逐片遍历theano向量

python - 如何根据需要用 gflags 标记一个标志?