将稀疏矩阵与Keras和Tensorflow结合使用
keras
tensorflow
5
0

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

我的第一个想法是将数据扩展为密集数据,即将所有10B条目写到一系列CSV中,大多数条目为零。但是,这很快使我的资源不堪重负(即使执行ETL也使熊猫不堪重负,并且使postgres陷入困境)。因此,我需要使用真正的稀疏矩阵。

如何使用Keras(和Tensorflow)做到这一点?虽然numpy不支持稀疏矩阵,但scipy和tensorflow都支持。有很多讨论(例如https://github.com/fchollet/keras/pull/1886 https://github.com/fchollet/keras/pull/3695/files https://github.com/pplonski/keras-稀疏地检查 https://groups.google.com/forum/#!topic/keras-users/odsQBcNCdZg )有关此想法的信息-使用scipy的稀疏矩阵或直接进入Tensorflow的稀疏矩阵。但是我找不到明确的结论,也无法使任何事情奏效(甚至清楚地知道应该走哪条路!)。

我怎样才能做到这一点?

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

  1. 将其保留为稀疏稀疏矩阵,然后在给Keras微型批处理时使其密集
  2. 一直保持稀疏,并使用Tensorflow稀疏张量

我还认为#2是首选,因为在整个过程中(我相信)您将获得更好的性能,但是#1可能会更容易并且足够。我会满意的。

如何实现?

参考资料:
Stack Overflow
收藏
评论
共 1 个回答
高赞 时间 活跃

抱歉,没有信誉可言,但我想您应该在这里看看答案: Keras,稀疏矩阵问题 。我已经尝试过并且它可以正常工作,但是,至少在我的情况下,只有一个音符,混洗导致了非常糟糕的结果,因此我使用了这种经过稍微修改的非混洗替代方法:

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的改组实现(设置shuffle=True in fit )所获得的精度相当。

收藏
评论
新手导航
  • 社区规范
  • 提出问题
  • 进行投票
  • 个人资料
  • 优化问题
  • 回答问题

关于我们

常见问题

内容许可

联系我们

@2020 AskGo
京ICP备20001863号