我正在尝试在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中使用具有交叉熵误差的稀疏输入自动编码器?
答案 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中。