将2D元素的大列表覆盖到3D NumPy数组-内存问题

时间:2019-06-06 16:53:09

标签: python numpy tensorflow keras deep-learning

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

获取序列。 内存信息:

Gen RAM Free:12.8 GB |进程大小:733.4 MB

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

获取序列...

时间:109.60107789899996

Gen RAM Free:11.4 GB |进程大小:2.8 GB

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

  

11507902个图像列表中的[INFO]数据矩阵

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

内存信息:

Gen RAM Free:11.8 GB |进程大小:2.1 GB

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

覆盖......

Gen RAM Free:6.7 GB |进程大小:7.3 GB

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

  

我们的训练数据形状:(11650348,11,11,1)分裂!参见下面的代码。

如您所见,我已经失去了很多记忆。为什么会发生?

我尝试将 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)

您如何看待?也许我做错了。数组应该比list占用更少的内存:/我通过stackoverflow和Internet进行了一些搜索,但是没有帮助。我不由自主。

我希望您会有一些好主意:D

更新08-06-2019

我已经在pyCharm中运行了代码,出现了其他错误:

  

X_train = np.array(uber_dane)ValueError:数组太大; arr.size * arr.dtype.itemsize大于最大可能的大小。

我有: 在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

你怎么看?

2 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

实际上,当您创建小片段列表时,您不是创建numpy数组列表,而是创建numpy视图列表(请参阅this section中的第一条注释)。因此,此对象并不会存储所有数据,而仅指向大型数组(在您的情况下为T2_images[i])。

在本示例中,您可以观察到它(实际上,当您修改slice的元素时,您引用的是源数组):

x = np.arange(5)
y = x[:2]
y[0] = 3
print(x)

将此列表转换为三维numpy数组时,必须从大型数组复制所有必需的数据。