Проблемы, когда я использую два загрузчика данных для чтения одного и того же набора данных одновременно - PullRequest
0 голосов
/ 25 апреля 2019

У меня есть список изображений, который включает в себя ['1.jpg',......,'1000.jpg'].

Мне нужен первый загрузчик данных для загрузки списка изображений по порядку.

В какой-то момент мне нужен второй загрузчик данных для загрузки списка изображений reverse , который до сих пор содержит часть изображений, например, ['55.jpg',...,'1.jpg'], or ['999.jpg', ..., '1.jpg']

Однако, когдаЯ использую эти два загрузчика данных в своем коде, моя программа иногда отключает .Памяти GPU не хватает памяти, но Volatile GPU-Util сохраняет нулевое значение , что, кажется, происходит блокировка.

Вот код:

# main function, first dataloader, ['1.jpg', ..., '1000.jpg']
seq_dt = SequenceLoader(ori_image_list)
seq_loader = DataLoader(seq_dt, batch_size=1, shuffle=False, sampler=None, num_workers=1, pin_memory=True)
for current_image_idx, img in enumerate(seq_laoder):
    if my_condition:
        flag = my_function(current_image_idx, ori_image_list)

Я сгенерирую второй загрузчик данных в своей функции

def my_function(current_image_idx, ori_image_list):
    backward_image_list = ori_image_list[:current_image_idx]
    backward_image_list.reverse()
    seq_dt = SequenceLoader(backward_image_list)
    seq_loader = DataLoader(seq_dt, batch_size=1, shuffle=False, sampler=None, 
    num_workers=1, pin_memory=True)
    for image_idx, img in enumerate(seq_loader):
        ...
        ...
        my_variable = ...
        ...
        if my_variable<my_threshold:
            return my_flag
    return False

В основной функции я буду выполнять my_function иногда.
Иногда my_function программы не могут вернуться косновная функция .Если я изменю параметр num_workers во втором загрузчике данных на 0, сбой не произойдет, но скорость будет низкой.

Вот код SequenceLoader

import os
import numpy as np
import cv2

import torch
import torchvision
from torch.utils.data import Dataset, DataLoader
from torchvision.transforms import ToTensor

class SequenceLoader(Dataset):
    ''' A dataset for loading images from a sequence '''

    def __init__(self, image_list):

        self.image_list = image_list


    def __getitem__(self, idx):

        # load images in PIL format
        # img = Image.open()
        img = cv2.imread(self.image_list[idx], cv2.IMREAD_COLOR).astype(np.float32)
        img_tensor = torch.from_numpy(img.transpose((2, 0, 1)))
        return img_tensor

    def __len__(self):
        return len(self.image_list)

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