前言
大家好,
我正在尝试使用StellarGraph包制作几何深度学习模型。对于较小的数据集,它工作得很好,但不幸的是它不能扩展到更大的数据集。有关机器、环境、使用的数据和由此产生的错误的信息如下所示。
机器规格:
- CPU:英特尔酷睿 i5-8350U
- 内存:8GB DDR4
- SWAP:4 GB + 4 GB(在不同的SSD中分为两个交换文件)
- SSD:250 GB + 250 GB(2280 和 2242 NVMe)
环境:
- Linux 5.3.11_1 64 位
- 蟒蛇 3.6.9
使用的数据(从 获取的大小sys.getsizeof()):
- 稀疏块对角矩阵(形状:158,950 x 158,950;大小:56)
- 密集特征矩阵(形状:158,950 x 14,450;大小:9,537,152)
模块:
networkx 2.3numpy 1.15.4pandas 0.25.3scipy 1.1.0scikit-learn 0.21.3stellargraph 0.8.2tensorflow 1.14.0
问题描述
我的目标是创建一种几何深度学习,以根据从静息状态功能 MRI 获得的邻接矩阵对主题进行分类。邻接矩阵假设有 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和 only vim,top并且python会话正在运行。此外,我还确保没有其他占用内存的进程在后台运行。所以我确定内存瓶颈很可能是由python.
我试过的
为了利用内存消耗,我尝试dask在管理密集feature数据帧时使用。不幸的是,StellarGraph函数只能将 pandas 数组、pandas 数据框、字典、元组或其他可迭代对象作为其输入。
除此之外dask,我还尝试使用稀疏矩阵(因为我的数据集几乎 80% 都是零值的)。但是,它给了我,TypeError因为StellarGraph它不能将稀疏矩阵作为node_features.
我还阅读了几种管理大型数据集的解决方案,这些解决方案(主要)建议将数据迭代解析到 python 会话中。StellarGraph但是,我在这种方法中找不到任何文档。
另一种选择是使用硬件更好的计算机,但遗憾的是,由于资金有限,我无法做到这一点。我是学生,现在买不起更好的机器。
潜在的解决方案
- 升级内存。我会尝试从其他计算机上抢救 RAM,但我目前的最大大小为 16 GB。我不确定这是否足够。
- 使用较小的
feature数据集块。我设法采用了这个解决方案,但模型的准确性真的很差(50-ish %)。
问题
- 为什么
python在没有动态交换分配的情况下只使用我总 RAM 的 55%? - 我应该如何有效地管理大数据框?
MemoryError创建StellarGraph对象时如何处理?- 我实际需要多少内存?32GB就够了吗?