Tensorflow: загружать изображения в память только при необходимости - PullRequest
0 голосов
/ 26 апреля 2018

Я использую TensorFlow V1.7 с новым высокоуровневым интерфейсом Estimator. Я был в состоянии создать и обучить свою собственную сеть с моим собственным набором данных.

Однако политика, которую я использую для загрузки изображений, мне просто не подходит. Подход, который я использовал до сих пор (во многом вдохновленный учебником MNIST), заключается в загрузке всех изображений в память с начала (вот небольшой фрагмент кода, чтобы дать вам представление):

    for filename in os.listdir(folder):
        filepath = os.path.join(folder, filename)
        # using OpenCV to read image
        images.append(cv2.imread(filepath, cv2.IMREAD_GRAYSCALE))
        labels.append(<corresponding label>)

    # shuffle samples and labels in the same way
    temp = list(zip(images, labels))
    random.shuffle(temp)
    images, labels = zip(*temp)

    return images, labels

Это означает, что я должен загрузить в память весь свой тренировочный набор, содержащий что-то вроде 32 тыс. Изображений, перед тренировкой в ​​сети. Однако, поскольку размер моей партии равен 100, для сети не потребуется более 100 изображений одновременно.

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

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

Есть что-то, что я пропускаю?

1 Ответ

0 голосов
/ 26 апреля 2018

Рекомендуется использовать модуль Dataset , который предоставляет вам возможность (среди прочего) использовать очереди, предварительную выборку небольшого числа примеров в память, количество потоков и многое другое.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...