【发布时间】:2019-10-22 05:35:16
【问题描述】:
在将 2D 元素的大列表转换为 3D numpy 数组时,我遇到了内存问题。 我正在使用 CoLab 环境。我正在做与医学图像(.nii)、CNN 网络相关的深度学习项目。这些图像是浮动类型的(因为标准化)。 我将图像(一个通道)作为列表加载到内存中,然后将其分成小块(11x11 分辨率)。结果,我有 11650348 - 11x11 图像的列表。
获取序列。 内存信息:
Gen RAM 免费:12.8 GB |进程大小:733.4 MB
可用 GPU RAM:15079MB |已使用:0MB |使用率 0% |总计 15079MB
获取序列...
时间:109.60107789899996
Gen RAM 免费:11.4 GB |进程大小:2.8 GB
可用 GPU RAM:15079MB |已使用:0MB |使用率 0% |总计 15079MB
[INFO] 11507902 个图像列表中的数据矩阵
现在我正在使用 np.array 方法将列表转换为数组。
内存信息:
Gen RAM 免费:11.8 GB |进程大小:2.1 GB
可用 GPU RAM:15079MB |已使用:0MB |使用率 0% |总计 15079MB
掩饰....
免费一代 RAM:6.7 GB |进程大小:7.3 GB
可用 GPU RAM:15079MB |已使用:0MB |使用率 0% |总计 15079MB
我们的训练数据的形状:(11650348, 11, 11, 1) SPLIT!请参阅下面的代码。
如你所见,我失去了很多记忆。为什么会这样?
我尝试使用 np.asarray、np.array 和参数 copy。没用。
负责分割原始图像的代码。
def get_parts(image, segmented):
T2 = image[0]
seg = segmented[0]
labels = []
val = [];
window_width = 5
zlen, ylen, xlen = T2.shape
nda = np.zeros((240, 240))
for x in range(0, xlen):
for y in range(0, ylen):
for z in range(0, zlen):
if T2[z, y, x] != 0:
xbegin = x - window_width
xend = x + window_width + 1
ybegin = y - window_width
yend = y + window_width + 1
val.append(T2[z, ybegin:yend, xbegin:xend])
labels.append(seg[z, y, x])
#np_array_01 = np.asarray(val)
#np_array_02 = np.asarray(labels)
return val, labels
获取值
for x in range(0, length):
data, labels = get_parts(T2_images[x], segmented[x])
uber_dane.extend(data)
uber_label.extend(labels)
我正在以这种方式对其进行改造。
X_train, X_test, y_train, y_test = train_test_split(uber_dane, uber_label,test_size=0.2, random_state=0)
#LABELS
y_train = np.array(y_train)
y_test= np.array(y_test)
y_train = np.expand_dims(y_train, axis=3)
y_test = np.expand_dims(y_test, axis=3)
y_train = to_categorical(y_train)
y_test = to_categorical(y_test)
#DATA - HERE IS A PROBLEM
X_train = np.array(X_train)
X_test= np.array(X_test)
print(sys.getsizeof(X_train))
print(sys.getsizeof(X_test))
X_train = np.expand_dims(X_train, axis=4)
X_test = np.expand_dims(X_test, axis=4)
你怎么看?也许我做错了什么。 Array 应该比 list 占用更少的内存:/ 我通过 stackoverflow 和 Internet 进行了一些搜索,但没有帮助。我忍不住了。
我希望,你会有一些好主意:D
2019 年 8 月 6 日更新
我在 pyCharm 中运行了我的代码,出现了不同的错误:
X_train = np.array(uber_dane) ValueError: array is too big;
arr.size * arr.dtype.itemsize大于最大可能大小。
我有: Python 3.6.3(v3.6.3:2c5fed8,2017 年 10 月 3 日,17:26:49)[MSC v.1900 32 位(英特尔)] 在 win32 上 所以python试图分配超过3GB。
lmfit minimize fails with ValueError: array is too big
你怎么看?
【问题讨论】:
-
您可以尝试
numpy.memmap避免将数组加载到内存中(docs.scipy.org/doc/numpy/reference/generated/numpy.memmap.html)。 -
我明天试试 :) 我需要将整个数据放入网络。我猜。我也遇到了 HDF5 的问题,保存数据的时间太长了。
标签: python numpy tensorflow keras deep-learning