Почему этой реализации набора данных не хватает памяти? - PullRequest
4 голосов
/ 05 июля 2019

Я следую этой инструкции и пишу следующий код для создания набора данных для изображений ( COCO2014 обучающий набор )

from pathlib import Path
import tensorflow as tf


def image_dataset(filepath, image_size, batch_size, norm=True):
    def preprocess_image(image):
        image = tf.image.decode_jpeg(image, channels=3)
        image = tf.image.resize(image, image_size)
        if norm:
            image /= 255.0  # normalize to [0,1] range
        return image

    def load_and_preprocess_image(path):
        image = tf.read_file(path)
        return preprocess_image(image)

    all_image_paths = [str(f) for f in Path(filepath).glob('*')]
    path_ds = tf.data.Dataset.from_tensor_slices(all_image_paths)
    ds = path_ds.map(load_and_preprocess_image, num_parallel_calls=tf.data.experimental.AUTOTUNE)
    ds = ds.shuffle(buffer_size = len(all_image_paths))
    ds = ds.repeat()
    ds = ds.batch(batch_size)
    ds = ds.prefetch(tf.data.experimental.AUTOTUNE)

    return ds

ds = image_dataset(train2014_dir, (256, 256), 4, False)
image = ds.make_one_shot_iterator().get_next('images')
# image is then fed to the network

Этот код всегда будет исчерпывать память (32G) и графический процессор (11G) и уничтожать процесс. Вот сообщения, показанные на терминале. enter image description here

Я также заметил, что программа застряла на sess.run(opt_op). Где не так? Как я могу это исправить?

1 Ответ

2 голосов
/ 05 июля 2019

Проблема заключается в следующем:

ds = ds.shuffle(buffer_size = len(all_image_paths))

Буфер, используемый Dataset.shuffle(), является буфером «в памяти», поэтому вы фактически пытаетесь загрузить весь набор данных в память.

У вас есть несколько вариантов (которые вы можете комбинировать), чтобы исправить это:

Вариант 1:

Уменьшить размер буфера до гораздо меньшего числа.

Вариант 2:

Переместите shuffle() перед оператором map().

Это означает, что мы будем перетасовывать до того, как загрузим изображения, поэтому мы будем просто хранить имена файлов в буфере памяти для перемешивания, а не хранить огромные тензоры.

...