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

Posted

技术标签:

【中文标题】如果我们使用索引矩阵,我们是不是需要在 Theano 中使用 flatten 和 reshape ?【英文标题】:Do we need to use flatten and reshape in Theano if we use a matrix of indexes?如果我们使用索引矩阵,我们是否需要在 Theano 中使用 flatten 和 reshape ? 【发布时间】:2017-11-20 16:21:50 【问题描述】:

我试图理解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.sizeW.shapex.sizex.shape 也许原文更具描述性“我们从W 检索具有x 值的行,并最终得到一个形状为n1,n2,n3 的数组”。很好的教程,代码来自哪里。 【参考方案1】:

是的,你是对的。

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

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

【讨论】:

以上是关于如果我们使用索引矩阵,我们是不是需要在 Theano 中使用 flatten 和 reshape ?的主要内容,如果未能解决你的问题,请参考以下文章

特征矩阵是不是支持向量索引?

MATLAB之逻辑

现代 OpenGL:VBO、GLM 和矩阵堆栈

颜色空间缩减和计时函数

将ndarray对象的数据按索引矩阵进行选取的几种方法

MySQL索引总结