首页 文章

使用具有Keras和Tensorflow的稀疏矩阵

提问于
浏览
14

我的数据可以被视为10B条目(100M x 100)的矩阵,这是非常稀疏的(<1/100 * 1/100的条目非零) . 我想使用Tensorflow后端将数据输入到我制作的Keras神经网络模型中 .

我的第一个想法是将数据扩展为密集,即将所有10B条目写入一系列CSV,大多数条目为零 . 然而,这很快就压倒了我的资源(甚至做了ETL不堪重负的大熊猫,并导致postgres挣扎) . 所以我需要使用真正的稀疏矩阵 .

我怎么能用Keras(和Tensorflow)做到这一点?虽然numpy没有就这个想法进行大量讨论(例如https://github.com/fchollet/keras/pull/1886 https://github.com/fchollet/keras/pull/3695/files https://github.com/pplonski/keras-sparse-check https://groups.google.com/forum/#!topic/keras-users/odsQBcNCdZg) - 要么使用scipy 's sparse matrixcs or going directly to Tensorflow' s稀疏矩阵 . 但我能够得到任何工作(或者甚至清楚知道要走哪条路!) .

我怎样才能做到这一点?

我相信有两种可能的方法:

  • 保持它作为一个scipy稀疏矩阵,然后,当给Keras一个小批量,让它密集

  • 一直保持稀疏,并使用Tensorflow稀疏张量

我也认为#2是首选,因为你会在整个过程中获得更好的表现(我相信),但#1可能更容易并且足够了 . 我会很高兴 .

如何实施?

1 回答

  • 6

    对不起,没有评论的声誉,但我认为你应该看一下这里的答案:Keras, sparse matrix issue . 我已经尝试了它并且它工作正常,但只有一个注意事项,至少在我的情况下,改组导致了非常糟糕的结果,所以我使用了这个稍微修改过的非改组替代方案:

    def nn_batch_generator(X_data, y_data, batch_size):
        samples_per_epoch = X_data.shape[0]
        number_of_batches = samples_per_epoch/batch_size
        counter=0
        index = np.arange(np.shape(y_data)[0])
        while 1:
            index_batch = index[batch_size*counter:batch_size*(counter+1)]
            X_batch = X_data[index_batch,:].todense()
            y_batch = y_data[index_batch]
            counter += 1
            yield np.array(X_batch),y_batch
            if (counter > number_of_batches):
                counter=0
    

    它产生与keras的混乱实现(在 fit 中设置 shuffle=True )所实现的精度相当的精度 .

相关问题