0

我是 theano 的新手,我正在尝试调整此处的自动编码器脚本以处理文本数据。此代码使用 MNIST 数据集作为训练数据。该数据采用 numpy 二维数组的形式。

我的数据是一个包含大约 100,000 个实例和大约 50,000 个特征的 csr 稀疏矩阵。该矩阵是使用 sklearn 的 tfidfvectorizer 来拟合和转换文本数据的结果。当我使用稀疏矩阵时,我修改代码以使用 theano.sparse 包来表示我的输入。我的训练集是符号变量:

train_set_x = theano.sparse.shared(train_set)

但是,theano.sparse 矩阵不能执行原始脚本中使用的所有操作(这里有一个稀疏操作列表。该代码使用输入的张量方法中的点和总和。我已将点更改为 sparse.dot 但我找不到用什么替换总和,因此我将训练批次转换为密集矩阵并使用原始张量方法,如此成本函数所示:

 def get_cost(self):
     tilde_x = self.get_corrupted_input(self.x, self.corruption)
     y = self.get_hidden_values(tilde_x)
     z = self.get_reconstructed_input(y)
     #make dense, must be a better way to do this
     L = - T.sum(SP.dense_from_sparse(self.x) * T.log(z) + (1 - SP.dense_from_sparse(self.x)) * T.log(1 - z), axis=1)
     cost = T.mean(L)
     return cost

def get_hidden_values(self, input):
    # use theano.sparse.dot instead of T.dot
    return T.nnet.sigmoid(theano.sparse.dot(input, self.W) + self.b)

get_corrupted_input 和 get_reconstructed_input 方法与上面链接中的一样。我的问题是有没有更快的方法来做到这一点?

将矩阵转换为密集矩阵会使训练运行非常缓慢。目前,以 20 个训练实例的批大小进行一个训练 epoch 需要 20.67m。

您可以提供的任何帮助或提示将不胜感激!

4

1 回答 1

0

在 theano.sparse 的最新主分支中,列出了一个 sp_sum 方法。

(看这里)

如果你不使用最前沿的版本,我会安装它,看看调用它是否会起作用,如果这样做会加快速度:

pip install --upgrade --no-deps git+git://github.com/Theano/Theano.git

(如果确实如此,在这里注意到它会很好,但并不总是清楚稀疏功能比一直使用密集计算要快得多,尤其是在 gpu 上。)

于 2014-11-15T18:57:44.553 回答