python - Python 3 在 shuffle(X,Y) 处导致内存错误,其中 X 是 36000 个 3 通道图像 (36000, 256,256,3),Y 是 3 通道普通数据 (36000, 256,256,3)
问题描述
下图显示内存使用情况: 发生内存错误。我正在使用 Numpy 和 Python3。我有两个形状为 (36000,256,256,3) 的 numpy 数组,每个数组为 X 和 Y,当我执行以下代码时会发生内存错误。它们是准备训练数据的代码。还有另一种使用较少内存的方法吗?
这是我的处理器:Intel® Xeon(R) CPU E5-2620 v4 @ 2.10GHz × 32
错误显示在:X, Y = shuffle(X,Y)
X = []
Y = []
for im , normal in zip(images,normals) :
image = getImageArr(dir_resize_mRGB + im , 256 , 256 )
X.append(image)
Y.append( getNormalArr( dir_resize_mNormal + normal , 256 , 256 ) )
X, Y = np.array(X) , np.array(Y)
print(X.shape)
X_min = np.min(X)
X_max = np.max(X)
X = (X-X_min)/(X_max-X_min)
print('min:{}, max:{}'.format(X_min, X_max))
train_rate = 0.85
np.random.seed(42)
index_train = np.random.choice(X.shape[0],int(X.shape[0]*train_rate),replace=False)
index_test = list(set(range(X.shape[0])) - set(index_train))
X, Y = shuffle(X,Y)
X_train, y_train = X[index_train],Y[index_train]
X_test, y_test = X[index_test],Y[index_test]
Traceback (most recent call last):
File "our_train_normal.py", line 312, in <module>
X, Y = shuffle(X,Y)
File "/home/ivlab/anaconda2/envs/tuto/lib/python3.7/site-packages/sklearn/utils/__init__.py", line 403, in shuffle
return resample(*arrays, **options)
File "/home/ivlab/anaconda2/envs/tuto/lib/python3.7/site-packages/sklearn/utils/__init__.py", line 327, in resample
resampled_arrays = [safe_indexing(a, indices) for a in arrays]
File "/home/ivlab/anaconda2/envs/tuto/lib/python3.7/site-packages/sklearn/utils/__init__.py", line 327, in <listcomp>
resampled_arrays = [safe_indexing(a, indices) for a in arrays]
File "/home/ivlab/anaconda2/envs/tuto/lib/python3.7/site-packages/sklearn/utils/__init__.py", line 216, in safe_indexing
return X.take(indices, axis=0)
MemoryError
解决方案
目前尚不清楚这是自定义shuffle
函数还是numpy.random.shuffle
似乎只包含一个数组的函数。
如果您遇到Out Of Memory
错误,您应该首先尝试对您的数组进行二次采样,例如X = X[100, :]
and Y = Y[100, :]
,并验证这确实是由于超出内存造成的。
为了按相同的顺序打乱两个数组,我建议使用numpy.random.permutation
which会给你一个索引列表。
shuff_indx = numpy.random.permutation(X.shape[0])
X = X[shuff_indx, :]
Y = Y[shuff_indx, :]
推荐阅读
- c# - Paket Newtonsoft ASP.NET 4.5
- prolog - 为什么 prolog 中的 length/2 谓词可以产生无限数量的长度?
- dc.js - 谁还需要维度?
- java - JxBrowser 网页到 java swing 面板拖放
- docker - 从 golang 主机应用程序连接到在 Docker 中运行的 elasticsearch 6.4
- ruby-on-rails - Rails 或 sinatra 专用于应用程序的内核
- python - 根据Python中文件名的数值对文件进行排序
- c# - 计算年利率
- django - 将初始(和正在进行的)数据加载到 Django 中的标准方法
- swift - 如何在具有一对多关系的核心数据实体中附加记录