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))。当发生这种情况时,我们需要能够在返回的张量中保留或恢复广播状态。

我尝试过的一些方法不起作用:

ret 具有(应该具有)与 expr 完全相同的形状,所以我没想到这会很难。如何恢复广播设置?

大声笑,它在 API: T.addbroadcast(x,*axes)