Theano:在密集->稀疏->密集转换后恢复可广播设置
Theano: Restoring broadcastable settings after dense -> sparse -> dense transformation
背景:我正在从事一个项目,该项目历来依赖稀疏矩阵进行大量数学运算,并正在开发一个插件以将一些繁重的工作外包给 theano。由于 theano 的稀疏支持有限,我们首先构建一个密集版本——但希望这能解释为什么我们对下面的方法感兴趣。
任务:仅将一些运算符应用于矩阵的非零值。
以下子例程大部分时间有效:
import theano.sparse.basic as TSB
def _applyOpToNonzerosOfDense(self,op,expr):
sparseExpr = TSB.clean(TSB.csr_from_dense(expr))
newData = op(TSB.csm_data(sparseExpr)).flatten()
newSparse = TS.CSR(newData, \
TSB.csm_indices(sparseExpr), \
TSB.csm_indptr(sparseExpr), \
TSB.csm_shape(sparseExpr))
ret = TSB.dense_from_sparse(newSparse)
return ret
当 expr
不是规范矩阵张量,而是行张量时,问题就来了(因此,expr
是 1xN,expr.broadcastable
是 (True, False)
)。当发生这种情况时,我们需要能够在返回的张量中保留或恢复广播状态。
我尝试过的一些方法不起作用:
dense_from_sparse
不支持广播设置
- Theano 0.9 不支持赋值给
ret.broadcastable
ret.dimshuffle( ('x',1) )
失败 "You cannot drop a non-broadcastable dimension."
ret
具有(应该具有)与 expr
完全相同的形状,所以我没想到这会很难。如何恢复广播设置?
大声笑,它在 API: T.addbroadcast(x,*axes)
背景:我正在从事一个项目,该项目历来依赖稀疏矩阵进行大量数学运算,并正在开发一个插件以将一些繁重的工作外包给 theano。由于 theano 的稀疏支持有限,我们首先构建一个密集版本——但希望这能解释为什么我们对下面的方法感兴趣。
任务:仅将一些运算符应用于矩阵的非零值。
以下子例程大部分时间有效:
import theano.sparse.basic as TSB
def _applyOpToNonzerosOfDense(self,op,expr):
sparseExpr = TSB.clean(TSB.csr_from_dense(expr))
newData = op(TSB.csm_data(sparseExpr)).flatten()
newSparse = TS.CSR(newData, \
TSB.csm_indices(sparseExpr), \
TSB.csm_indptr(sparseExpr), \
TSB.csm_shape(sparseExpr))
ret = TSB.dense_from_sparse(newSparse)
return ret
当 expr
不是规范矩阵张量,而是行张量时,问题就来了(因此,expr
是 1xN,expr.broadcastable
是 (True, False)
)。当发生这种情况时,我们需要能够在返回的张量中保留或恢复广播状态。
我尝试过的一些方法不起作用:
dense_from_sparse
不支持广播设置- Theano 0.9 不支持赋值给
ret.broadcastable
ret.dimshuffle( ('x',1) )
失败 "You cannot drop a non-broadcastable dimension."
ret
具有(应该具有)与 expr
完全相同的形状,所以我没想到这会很难。如何恢复广播设置?
大声笑,它在 API: T.addbroadcast(x,*axes)