Покрытие большого списка 2D элементов в массиве 3D NumPy - проблема с памятью - PullRequest
1 голос
/ 06 июня 2019

У меня проблемы с памятью во время преобразования большого списка 2D элементов в массив 3D-нюмпов.Я использую среду CoLab.Я занимаюсь глубоким изучением проекта, связанного с медицинскими изображениями (.nii), сетью CNN.Эти изображения являются плавающими (из-за стандартизации).Я загружаю изображения (один канал) в память в виде списка, затем делю его на мелкие кусочки (разрешение 11x11).В результате у меня есть список 11650348 - 11x11 изображений.

Получить последовательности. Информация о памяти:

Gen RAM Free: 12,8 ГБ |Размер процессора: 733,4 МБ

Объем ОЗУ графического процессора: 15079 МБ |Используется: 0MB |Использовать 0% |Всего 15079MB

get seqences ...

Время: 109.60107789899996

Gen RAM Free: 11,4 ГБ |Размер процессора: 2,8 ГБ

Объем ОЗУ графического процессора: 15079 МБ |Используется: 0MB |Использовать 0% |Всего 15079 МБ

[ИНФО] матрица данных в списке из 11507902 изображений

Теперь я использую метод np.array для преобразования списка в массив.

Информация о памяти:

Gen RAM Free: 11,8 ГБ |Размер процессора: 2,1 ГБ

Объем ОЗУ графического процессора: 15079 МБ |Используется: 0MB |Использовать 0% |Всего 15079MB

Coverting ....

Gen RAM Free: 6,7 ГБ |Размер процессора: 7,3 ГБ

ОЗУ GPU Свободно: 15079 МБ |Используется: 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 и Интернет, но это не помогло.Я не мог с собой поделать.

Надеюсь, у вас будут хорошие идеи: D

ОБНОВЛЕНИЕ 08-06-2019

Я запустил свой код в pyCharm,другая ошибка:

X_train = np.array (uber_dane) ValueError: массив слишком большой;arr.size * arr.dtype.itemsize больше максимально возможного размера.

У меня есть: Python 3.6.3 (v3.6.3: 2c5fed8, 3 октября 2017, 17:26:49) [MSC v.1900 32 бит (Intel)] на win32 Итак, python пытается выделить более 3 ГБ.

lmfit минимизирует неудачу с помощью ValueError: массив слишком большой

Что выдумаю

1 Ответ

0 голосов
/ 06 июня 2019

Планируете ли вы использовать fit, evaluate или predict?Если это так, вы можете попытаться загрузить только некоторые данные с помощью специального генератора и использовать fit_generator (evaluate_generator, ...)

...