python - 将 2D 元素的大列表转换为 3D NumPy 数组 - 内存问题

标签 python numpy tensorflow keras deep-learning

在将 2D 元素的大列表转换为 3D numpy 数组时,我遇到了内存问题。 我正在使用 CoLab 环境。我正在做与医学图像(.nii)、CNN 网络相关的深度学习项目。这些图像是 float 类型(因为标准化)。 我将图像(一个 channel )作为列表加载到内存中,然后将其分成小块(11x11 分辨率)。结果我有 11650348 - 11x11 图像的列表。

获取序列。 内存信息:

第一代可用内存:12.8 GB |过程大小:733.4 MB

GPU RAM 可用:15079MB |已用:0MB |利用率 0% |总计 15079MB

获取序列...

时间:109.60107789899996

第一代可用内存:11.4 GB |进程大小:2.8 GB

GPU RAM 可用:15079MB |已用:0MB |利用率 0% |总计 15079MB

[INFO] data matrix in list of 11507902 images

现在我正在使用 np.array 方法将列表转换为数组。

内存信息:

第一代可用内存:11.8 GB |进程大小:2.1 GB

GPU RAM 可用:15079MB |已用:0MB |利用率 0% |总计 15079MB

掩饰....

第二代可用内存:6.7 GB |进程大小:7.3 GB

GPU RAM 可用:15079MB |已用:0MB |利用率 0% |总计 15079MB

Shape of our training data: (11650348, 11, 11, 1) SPLIT! See code below.

如你所见,我失去了很多内存。为什么会发生这种情况?

我尝试使用带有参数copynp.asarraynp.array。没成功。

负责分割原始图像的代码。

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)

你对此有何看法?也许我做错了什么。数组应该比列表占用更少的内存:/我通过 stackoverflow 和互联网进行了一些搜索,但没有帮助。我无法自拔。

我希望你能有一些好主意:D

更新 08-06-2019

我在 pyCharm 中运行了我的代码,出现了不同的错误:

X_train = np.array(uber_dane) ValueError: array is too big; arr.size * arr.dtype.itemsize is larger than the maximum possible size.

我有: Win32 上的 Python 3.6.3(v3.6.3:2c5fed8,2017 年 10 月 3 日,17:26:49)[MSC v.1900 32 位(Intel)] 所以 python 正在尝试分配超过 3GB 的空间。

lmfit minimize fails with ValueError: array is too big

你觉得怎么样?

最佳答案

您打算使用fitevaluatepredict吗?如果是这样,您可以尝试使用自定义generator仅加载一些数据并使用fit_generator (evaluate_generator,...)

关于python - 将 2D 元素的大列表转换为 3D NumPy 数组 - 内存问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56481982/

相关文章:

python - 基于 Django 类的 View - 将所有代码放在 urls.py 中是一种不好的风格吗?

python 根据内部元素和忽略大小写对列表列表进行排序

python - 在 heroku 上运行 flask-migrate 会产生错误

Python/Arduino串口通信

python - 更新多重索引 np.array 中的元素

python - Pandas rolling_quantile 错误?

python - Pycharm (Mac) 上的 Tensorflow 导入错误

python - 如何使用 numpy 在频率范围内产生噪声?

linux - TensorFlow 多 GPU InvalidArgumentError : cifar10_multi_gpu. py

tensorflow - 带 ID 列的训练模型