Theano:密集后恢复可播放设置 - >稀疏 - >密集的转变

时间:2017-04-28 16:44:41

标签: sparse-matrix theano numpy-broadcasting

背景:我正在研究一个历史上依赖稀疏矩阵进行大量数学计算的项目,并开发一个插件来将一些繁重的工作外包给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) )失败并显示“您无法删除不可广播的维度。”

ret已经(应该)具有与expr完全相同的形状,所以我并不认为这很难。如何恢复广播设置?

1 个答案:

答案 0 :(得分:1)

LOL,它在API中:T.addbroadcast(x,*axes)