Arhn - архитектура программирования

Обнаружение использования памяти

Вот ядро ​​кода:

import numpy as np

def float_im(img):
    return np.divide(img, 255.)

# adapted from: https://stackoverflow.com/a/52463034/9768291
def random_crop(images):
    print("Started randomly cropping HR images")
    crop_h, crop_w = img_width, img_height
    y = []
    i = -1  # To begin with 0

    for img in images:
        if (img.shape[0] >= crop_h) and (img.shape[1] >= crop_w):
            print(i + 1, "images processed")
            #img = rgb2ycbcr(img)  # TODO: switch from RGB channels to CbCrY
            for _ in range(crops_p_img):
                # Cropping a random part of the image
                rand_h = np.random.randint(0, img.shape[0]-crop_h)
                rand_w = np.random.randint(0, img.shape[1]-crop_w)
                tmp_img = img[rand_h:rand_h+crop_h, rand_w:rand_w+crop_w]

                # Saving the images
                i += 1
                initial_image = save_np_img(tmp_img, y_data_path, str(i) + ".png")
                y.append(float_im(initial_image))  # From [0,255] to [0.,1.]

                # Augmenting the image  TODO: look into integrating "imgaug" library
                if augment_img:
                    # Vertical axis flip
                    i += 1
                    tmp_img = np.fliplr(initial_image)
                    y.append(float_im(save_np_img(tmp_img, y_data_path, str(i) + ".png")))

                    # Horizontal axis flip of tmp_img
                    i += 1
                    y.append(float_im(save_np_img(np.flipud(tmp_img), y_data_path, str(i) + ".png")))

                    # Horizontal axis flip of initial_image
                    i += 1
                    y.append(float_im(save_np_img(np.flipud(initial_image), y_data_path, str(i) + ".png")))
            else:
                continue
    return np.array(y)

def save_np_img(np_img, path, name):
    """
    To save the image.
    :param np_img: numpy_array type image
    :param path: string type of the existing path where to save the image
    :param name: string type that includes the format (ex:"bob.png")
    :return: numpy array
    """

    if type(np_img[0][0][0].item()) != int:
        np_img = np.multiply(np_img, 255).astype(int)

    im = Image.fromarray(np_img)
    im.save(path + name)

    return np_img

Вот пример из моего диспетчера задач. Посмотрите на поле Committed внизу слева:

Совершенная утечка памяти?

Он просто продолжает увеличиваться, пока не достигнет максимума (23,9 ГБ), а затем возникает следующая ошибка:

...
2184 images processed
2212 images processed
2240 images processed
2268 images processed
2296 images processed
Traceback (most recent call last):
  File "main.py", line 11, in <module>
    prepare_data.load_imgs(hr_img_path + "*.png")  # TODO: customize path (command line)
  File "C:\Users\payne\Documents\GitHub\PixelEnhancer\SR-ResCNN-Keras-\prepare_data.py", line 73, in load_imgs
    y_train = random_crop(images)
  File "C:\Users\payne\Documents\GitHub\PixelEnhancer\SR-ResCNN-Keras-\prepare_data.py", line 62, in random_crop
    y.append(float_im(save_np_img(np.flipud(initial_image), y_data_path, str(i) + ".png")))
  File "C:\Users\payne\Documents\GitHub\PixelEnhancer\SR-ResCNN-Keras-\utils.py", line 27, in float_im
    return np.divide(img, 255.)
MemoryError

Как я должен изменить свой код, чтобы эта ошибка больше не появлялась? Как Python 3.5 может определить, что я достиг максимального объема памяти? Я использую его для предварительной обработки изображений для обучения нейронной сети.


  • Это, вероятно, не утечка памяти, это результат изменения каждого пикселя с 3x8-битных целочисленных каналов на 3x64-битные каналы с плавающей запятой, а затем сохранение их всех в памяти как часть y. 28.09.2018
  • Чтобы решить вашу проблему, вы можете попробовать использовать dtype=np.float16 в своем коде (что приведет к 4-кратному уменьшению использования памяти. Кроме того, вы можете рассмотреть возможность использования images.pop(), который будет потреблять ваш список ввода (я думаю, он вам не нужен в памяти после Наконец, если это не проблема утечки памяти (как я считаю, что это не так), вам, вероятно, следует соответствующим образом переформулировать свой вопрос. 28.09.2018
  • Измененный. Благодарю вас! Я не могу снизить точность, так как это важно для моего проекта. 28.09.2018

Новые материалы

Коллекции публикаций по глубокому обучению
Последние пару месяцев я создавал коллекции последних академических публикаций по различным подполям глубокого обучения в моем блоге https://amundtveit.com - эта публикация дает обзор 25..

Представляем: Pepita
Фреймворк JavaScript с открытым исходным кодом Я знаю, что недостатка в фреймворках JavaScript нет. Но я просто не мог остановиться. Я хотел написать что-то сам, со своими собственными..

Советы по коду Laravel #2
1-) Найти // You can specify the columns you need // in when you use the find method on a model User::find(‘id’, [‘email’,’name’]); // You can increment or decrement // a field in..

Работа с временными рядами спутниковых изображений, часть 3 (аналитика данных)
Анализ временных рядов спутниковых изображений для данных наблюдений за большой Землей (arXiv) Автор: Рольф Симоэс , Жильберто Камара , Жильберто Кейрос , Фелипе Соуза , Педро Р. Андраде ,..

3 способа решить квадратное уравнение (3-й мой любимый) -
1. Методом факторизации — 2. Используя квадратичную формулу — 3. Заполнив квадрат — Давайте поймем это, решив это простое уравнение: Мы пытаемся сделать LHS,..

Создание VR-миров с A-Frame
Виртуальная реальность (и дополненная реальность) стали главными модными терминами в образовательных технологиях. С недорогими VR-гарнитурами, такими как Google Cardboard , и использованием..

Демистификация рекурсии
КОДЕКС Демистификация рекурсии Упрощенная концепция ошеломляющей О чем весь этот шум? Рекурсия, кажется, единственная тема, от которой у каждого начинающего студента-информатика..