前言
大家好,
我试图用StellarGraph软件包建立一个几何深度学习模型。对于较小的数据集,它工作良好,但不幸的是,它不能扩展到更大的数据集。有关机器、环境、使用数据和由此产生的错误的信息如下所示。
机器规格:
DDR4
环境:
64-bit
使用的数据(从sys.getsizeof()获取的大小):
单元:
networkx 2.3numpy 1.15.4pandas 0.25.3scipy 1.1.0scikit-learn 0.21.3stellargraph 0.8.2tensorflow 1.14.0问题描述
我的目的是建立一个几何深度学习,以分类的基础上,邻接矩阵获得的静息状态功能磁共振成像。邻接矩阵假设55个感兴趣区域,从而得到55x55个矩阵。在构建深度学习模型时,采用了StellarGraph中的谱图卷积网络模型,该模型以图形对象和节点特征为输入。通过将所有被试的邻接矩阵组合而得到的稀疏块对角线矩阵生成了图对象。而节点特征是每个节点的特征(1个节点有5个特征值),构造成密集块对角矩阵。
在此之前,我使用人口样本的子集(大约170)建立了模型。它运行得很完美,我想我可以使用更大的数据集来做同样的事情。不幸的是,使用相同的代码,我在注册MemoryError对象时得到了一个StellarGraph。代码和错误显示在下一节。
编码和错误
# Data parsing with scipy.io as sio and pandas as pd
data = sio.mmread('_data/sparse.mtx')
feature = sio.mmread('_data/sparse-feature.mtx')
feature = pd.DataFrame.sparse.from_spmatrix(feature)
# Create graph object using networkx as nx
g = nx.from_scipy_sparse_matrix(data)
# Create StellarGraph object and its generator
gs = StellarGraph(g, node_features=feature) # MemoryError
generator = FullBatchNodeGenerator(gs)由于保密原因,我很抱歉没有提供sparse.mtx和sparse-feature.mtx文件,但我希望以前对数据形状和大小的描述可以帮助您理解它的结构。使用上述代码,python给出了以下错误:
>>> gs = StellarGraph(g, node_features=feature) # MemoryError
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/home/lam/.local/lib/python3.6/site-packages/stellargraph/core/graph.py", line 786, in __init__
super().__init__(incoming_graph_data, **attr)
File "/home/lam/.local/lib/python3.6/site-packages/stellargraph/core/graph.py", line 381, in __init__
node_features, type_for_node, node_types, dtype
File "/home/lam/.local/lib/python3.6/site-packages/stellargraph/core/graph.py", line 216, in _convert_from_node_data
{node_type: data}, node_type_map, node_types, dtype
File "/home/lam/.local/lib/python3.6/site-packages/stellargraph/core/graph.py", line 182, in _convert_from_node_data
data_arr = arr.values.astype(dtype)
File "/home/lam/.local/lib/python3.6/site-packages/pandas/core/generic.py", line 5443, in values
return self._data.as_array(transpose=self._AXIS_REVERSED)
File "/home/lam/.local/lib/python3.6/site-packages/pandas/core/internals/managers.py", line 822, in as_array
arr = mgr._interleave()
File "/home/lam/.local/lib/python3.6/site-packages/pandas/core/internals/managers.py", line 840, in _interleave
result = np.empty(self.shape, dtype=dtype)
MemoryError在监视内存消耗时,我观察到RAM只消耗了其总容量的55%,而交换空间根本没有被使用。在运行代码时,我只使用TTY + tmux,只运行vim、top和python会话。此外,我还确保没有其他占用内存的进程在后台运行。因此,我确信内存瓶颈很可能是由python造成的。
我试过的
为了利用内存消耗,我尝试使用dask来管理密集的feature数据帧。不幸的是,StellarGraph函数只能有熊猫数组、熊猫数据帧、字典、元组或其他可迭代的输入。
除了dask之外,我还尝试使用稀疏矩阵(因为几乎80%的数据集都是零值的)。然而,它给了我TypeError,因为StellarGraph不能将稀疏矩阵作为它的node_features。
我还阅读了管理大型数据集的几种解决方案,其中(大部分)建议迭代地将数据解析为python会话。但是,我无法在StellarGraph中找到关于这种方法的任何文档。
另一种选择是使用拥有更好硬件的计算机,但遗憾的是,由于资金有限,我无法这么做。我是个学生,现在买不起更好的机器。
势解
feature数据集。我设法采用了这个解决方案,但模型的准确性非常差(50%)。问题
为什么在没有动态交换的情况下,allocation?
StellarGraph对象时如何处理MemoryError?发布于 2019-12-01 14:33:17
Python运行得很好。这是一个由StellarGraph引起的实现问题。
我认为StellarGraph到目前为止还不支持庞大的矩阵。
File "/home/lam/.local/lib/python3.6/site-packages/stellargraph/core/graph.py", line 182, in _convert_from_node_data
data_arr = arr.values.astype(dtype)从代码开始到这里,所有的数据都存储为稀疏数组,这不会占用太多的内存。在这里,arr应该是一个DataFrame,列作为pandas.SparseArray。这一行代码将数据结构转换为正常的numpy数组,这会使内存使用崩溃。
import numpy as np
a = np.empty((158950,14450),float)
print(a.nbytes/2**30)
17.112698405981064这里的空numpy数组实际上占用了17G内存。我可以在我的16G电脑上初始化3个数组。然后我得到内存错误,如果我试图得到超过3,而且我不能初始化一个158,950 x 158,950 numpy数组。
https://stackoverflow.com/questions/59119420
复制相似问题