稀疏矩阵乘法的Theano梯度

时间:2014-11-20 19:26:03

标签: python numpy scipy sparse-matrix theano

我正在尝试在Theano中实现具有稀疏输入的自动编码器。

我使用稀疏自动编码器来处理平方误差成本函数。但如果我想应用包含矩阵乘法的交叉熵错误,我会收到以下错误:

AsTensorError: ('Variable type field must be a TensorType.', SparseVariable{csr,float64}, Sparse[float64, csr])

我在http://nbviewer.ipython.org/urls/gist.githubusercontent.com/peterroelants/4946cdbf189c5e75f2b7/raw/2ee7d3e533a4a6ac2707a2ffa310b81a86e70afd/gistfile1.json上传了一个说明问题的示例笔记本。

我将问题提炼到矩阵乘法cost = T.sum(x * T.log(z))。这适用于密集的情况[参见单元格2],但在稀疏情况下给出错误[参见单元格3]。请注意,将稀疏案例[单元格3]中的此成本函数更改为平方误差(cost = T.sum((x-z)**2))将导致工作结果。

有谁能指出我做错了什么?并告诉我如何在Theano中使用具有交叉熵误差的稀疏输入自动编码器?

1 个答案:

答案 0 :(得分:1)

您不能在稀疏变量上使用T. *函数。在这种情况下,您可以使用:

theano.sparse.sp_sum((x * T.log(z))

\ edit Theano中的这个差异修复修复了这次崩溃:

diff --git a/theano/sparse/basic.py b/theano/sparse/basic.py
index 4620c5a..a352b9a 100644
--- a/theano/sparse/basic.py
+++ b/theano/sparse/basic.py
@@ -2244,7 +2244,7 @@ class MulSD(gof.op.Op):
     def grad(self, (x, y), (gz,)):
         assert _is_sparse_variable(x) and _is_dense_variable(y)
         assert _is_sparse_variable(gz)
-        return y * gz, x * gz
+        return y * gz, dense_from_sparse(x * gz)

     def infer_shape(self, node, shapes):
         return [shapes[0]]

本周我将尝试将修复程序合并到Theano中。