AWS报错:MemoryError: Unable to allocate 81.1 GiB for an array with shape (3000, 942, 3851)

本文记录了一次在使用TensorFlow进行训练过程中遇到的内存错误及解决方法。错误发生在尝试分配一个超大尺寸的数组时,通过减少数据集的样本数量来解决此问题。
部署运行你感兴趣的模型镜像

AWS报错:MemoryError: Unable to allocate 81.1 GiB for an array with shape [3000, 942, 3851]

报错如下

Traceback (most recent call last):
  File "abstract.py", line 278, in <module>
    train()
  File "abstract.py", line 253, in train
    validation_split=0.2)
  File "/home/ubuntu/anaconda3/lib/python3.7/site-packages/tensorflow/python/keras/engine/training.py", line 1100, in fit
    tmp_logs = self.train_function(iterator)
  File "/home/ubuntu/anaconda3/lib/python3.7/site-packages/tensorflow/python/eager/def_function.py", line 828, in __call__
    result = self._call(*args, **kwds)
  File "/home/ubuntu/anaconda3/lib/python3.7/site-packages/tensorflow/python/eager/def_function.py", line 888, in _call
    return self._stateless_fn(*args, **kwds)
  File "/home/ubuntu/anaconda3/lib/python3.7/site-packages/tensorflow/python/eager/function.py", line 2943, in __call__
    filtered_flat_args, captured_inputs=graph_function.captured_inputs)  # pylint: disable=protected-access
  File "/home/ubuntu/anaconda3/lib/python3.7/site-packages/tensorflow/python/eager/function.py", line 1919, in _call_flat
    ctx, args, cancellation_manager=cancellation_manager))
  File "/home/ubuntu/anaconda3/lib/python3.7/site-packages/tensorflow/python/eager/function.py", line 560, in call
    ctx=ctx)
  File "/home/ubuntu/anaconda3/lib/python3.7/site-packages/tensorflow/python/eager/execute.py", line 60, in quick_execute
    inputs, attrs, num_outputs)
KeyboardInterrupt
ubuntu@ip-172-31-41-180:~/text_abstract_300$ cd
ubuntu@ip-172-31-41-180:~$ cd text_abstract
ubuntu@ip-172-31-41-180:~/text_abstract$ ls
abstract.csv  abstract.py
ubuntu@ip-172-31-41-180:~/text_abstract$ python3 abstract.py
2021-06-18 01:20:42.966221: I tensorflow/stream_executor/platform/default/dso_loader.cc:49] Successfully opened dynamic library libcudart.so.11.0
Number of unique input tokens: 3851
Number of unique output tokens: 2776
Max sequence length of input: 942
Max sequence length of outputs: 82
Traceback (most recent call last):
  File "abstract.py", line 135, in <module>
    encoder_input_data =np.zeros((NUM_SAMPLES,INUPT_LENGTH,num_encoder_tokens))
numpy.core._exceptions.MemoryError: Unable to allocate 81.1 GiB for an array with shape (3000, 942, 3851) and data type float64

在这里插入图片描述

解决方法

暂无很好方法解决,但可以通过减少数据集的样本数量,解决!!

您可能感兴趣的与本文相关的镜像

TensorFlow-v2.15

TensorFlow-v2.15

TensorFlow

TensorFlow 是由Google Brain 团队开发的开源机器学习框架,广泛应用于深度学习研究和生产环境。 它提供了一个灵活的平台,用于构建和训练各种机器学习模型

`MemoryError` 是由于尝试分配的内存超出了系统可用的内存限制。在你的例子中,尝试创建一个形状为 `(26097, 129766)` 的数组,数据类型为 `float64`,这需要大约 25.2 GiB 的内存。 以下是解决该问题的一些方法: --- ### 方法 1:降低数据维度 可以通过降维技术(如 PCA 或特征选择)减少特征数量,从而降低内存需求。 ```python from sklearn.decomposition import PCA from sklearn.feature_selection import SelectKBest, f_classif # 使用PCA降维到较小的维度 pca = PCA(n_components=100) # 选择100个主成分 X_pca = pca.fit_transform(X) # 或者使用特征选择 selector = SelectKBest(score_func=f_classif, k=100) # 选择100个最佳特征 X_selected = selector.fit_transform(X, y) ``` **解释**: - **PCA**:通过线性变换将高维数据投影到低维空间,同时保留尽可能多的信息。 - **SelectKBest**:基于统计检验选择与目标变量最相关的前 `k` 个特征。 --- ### 方法 2:分批处理数据 如果数据集过大,可以使用分批处理的方法,而不是一次性加载所有数据。 ```python import numpy as np from sklearn.linear_model import SGDClassifier # 分批训练模型 batch_size = 1000 model = SGDClassifier() for i in range(0, X.shape[0], batch_size): X_batch = X[i:i + batch_size] y_batch = y[i:i + batch_size] model.partial_fit(X_batch, y_batch, classes=np.unique(y)) ``` **解释**: - **SGDClassifier**:支持在线学习的分类器,适合大规模数据集。 - **partial_fit**:允许模型逐步更新权重,而不需要一次性加载所有数据。 --- ### 方法 3:调整数据类型 将数据类型从 `float64` 转换为更小的数据类型(如 `float32` 或 `float16`),以减少内存占用。 ```python import numpy as np # 将数据类型转换为 float32 X = X.astype(np.float32) y = y.astype(np.float32) ``` **解释**: - **float64** 每个元素占用 8 字节,而 **float32** 每个元素仅占用 4 字节。 - 如果精度要求不高,可以进一步尝试使用 `float16`。 --- ### 方法 4:使用稀疏矩阵 如果数据中包含大量零值,可以将其转换为稀疏矩阵格式以节省内存。 ```python from scipy.sparse import csr_matrix # 转换为稀疏矩阵 X_sparse = csr_matrix(X) ``` **解释**: - 稀疏矩阵只存储非零元素及其位置,因此可以显著减少内存占用。 - 许多机器学习库(如 scikit-learn)支持稀疏矩阵输入。 --- ### 方法 5:增加系统内存 如果以上方法仍无法解决问题,可以考虑以下硬件解决方案: 1. 增加物理内存(RAM)。 2. 使用具有更大内存的云服务器(如 AWS、Google Cloud)。 3. 使用 GPU 加速计算(如 TensorFlow 或 PyTorch 支持的 GPU 版本)。 --- ### 示例代码总结 以下是一个综合示例,结合了降维和分批处理: ```python from sklearn.decomposition import PCA from sklearn.linear_model import SGDClassifier import numpy as np # 降维 pca = PCA(n_components=100) X_reduced = pca.fit_transform(X.astype(np.float32)) # 分批训练 batch_size = 1000 model = SGDClassifier() for i in range(0, X_reduced.shape[0], batch_size): X_batch = X_reduced[i:i + batch_size] y_batch = y[i:i + batch_size] model.partial_fit(X_batch, y_batch, classes=np.unique(y)) ``` 上述代码中: 1. 使用 PCA 降维到 100 个主成分。 2. 将数据类型转换为 `float32`。 3. 使用分批训练避免一次性加载所有数据。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

FriendshipT

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值