当前位置: 首页 > 知识库问答 >
问题:

将稀疏矩阵与Keras和Tensorflow结合使用

韦正业
2023-03-14

我的数据可以看作是10B条目的矩阵(100Mx 100),非常稀疏(

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

我怎样才能用Keras(和Tensorflow)做到这一点?虽然numpy不支持稀疏矩阵,但scipy和tensorflow都支持。有很多讨论(例如。https://github.com/fchollet/keras/pull/1886https://github.com/fchollet/keras/pull/3695/fileshttps://github.com/pplonski/keras-sparse-checkhttps://groups.google.com/forum/#哦!主题/keras用户/odsQBcNCdZg)关于这个想法-要么使用scipy的稀疏矩阵,要么直接转到Tensorflow的稀疏矩阵。但我找不到一个明确的结论,我也没能做任何事情(甚至不知道该怎么做!)。

我该怎么做?

我认为有两种可能的方法:

  1. 将其保持为scipy稀疏矩阵,然后在给Keras一个小批次时,使其致密
  2. 始终保持稀疏,并使用Tensorflow稀疏张量

我还认为#2是首选,因为您会一直获得更好的html" target="_blank">性能(我相信),但#1可能更容易,也足够了。我都会很高兴的。

如何实现这两个目标?

共有2个答案

燕璞
2023-03-14

这个答案解决了问题中提到的第二种方法。如果您编写自定义训练循环,则可以使用稀疏矩阵作为带有Tensorflow后端的Keras模型的输入。在下面的示例中,该模型将稀疏矩阵作为输入并输出密集矩阵。

from keras.layers import Dense, Input
from keras.models import Model
import scipy
import numpy as np

trainX = scipy.sparse.random(1024, 1024)
trainY = np.random.rand(1024, 1024)

inputs = Input(shape=(trainX.shape[1],), sparse=True)
outputs = Dense(trainY.shape[1], activation='softmax')(inputs)
model = Model(inputs=inputs, outputs=outputs)
model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy'])

steps = 10
for i in range(steps):
  # For simplicity, we directly use trainX and trainY in this example
  # Usually, this is where batches are prepared
  print(model.train_on_batch(trainX, trainY))
# [3549.2546, 0.0]
# ...
# [3545.6448, 0.0009765625]

然而,这种方法的有用性取决于您的模型是否需要密集化稀疏矩阵。事实上,上面的模型有一层可以将稀疏矩阵转换为密集矩阵。如果您的稀疏矩阵不适合内存,这可能是一个问题。

臧兴学
2023-03-14

抱歉,我没有评论的名声,但我认为你应该看看这里的答案: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的无序实现相当(在拟合中设置无序=真)。

 类似资料:
  • 稀疏矩阵(Sparse Matrix) 注:压缩存储的矩阵可以分为特殊矩阵和稀疏矩阵。对于那些具有相同元素或零元素在矩阵中分布具有一定规律的矩阵,被称之为特殊矩阵。对于那些零元素数据远远多于非零元素数目,并且非零元素的分布没有规律的矩阵称之为稀疏矩阵。 1. 稀疏矩阵的概念 在矩阵中,若数值为0的元素数目远远多于非0元素的数目时,则称该矩阵为稀疏矩阵。与之相反,若非0元素数目占大多数时,则称该矩阵

  • 我正在实现一个稀疏矩阵类,使用映射向量来存储数据(映射表示矩阵的一行,其中键是列的索引,值是该位置的maitrix的值)我已经编写了计算行列式的函数,但我不知道是否有一种方法可以计算这种节省的时间(因为矩阵是稀疏的,大多数值为零)在这里我的实现: 这是类接口 我计算行列式的方式是什么?假设运算符()以这种方式重载 提前感谢您的帮助

  • 2.5.1 介绍 (密集) 矩阵是: 数据对象 存储二维值数组的数据结构 重要特征: 一次分配所有项目的内存 通常是一个连续组块,想一想Numpy数组 快速访问个项目(*) 2.5.1.1 为什么有稀疏矩阵? 内存,增长是n**2 小例子(双精度矩阵): In [2]: import numpy as np import matplotlib.pyplot as plt x = np.li

  • 在使用numpy的python中,假设我有两个矩阵: 稀疏矩阵 密集的x*y矩阵 现在我想做,它将返回一个密集的矩阵。 但是,我只关心中非零的单元格,这意味着如果我这样做了,对我的应用程序不会有任何影响 <代码>S\u=S*S\u 显然,这将是对操作的浪费,因为我想把在

  • 在课堂上,我必须为稀疏矩阵编写自己的线性方程求解器。我可以自由地使用任何类型的数据结构为稀疏矩阵,我必须实现几个解决方案,包括共轭梯度。 谢了!

  • 问题内容: 我有一个很大的csv文件,其中列出了图中节点之间的连接。例: 0001,95784 0001,98743 0002,00082 0002,00091 因此,这意味着节点id 0001连接到节点95784和98743,依此类推。我需要将其读入numpy中的稀疏矩阵。我怎样才能做到这一点?我是python的新手,所以有关此的教程也将有所帮助。 问题答案: 使用scipy的lil_matri