使用两个数据加载器同时读取同一数据集时出现问题

时间:2019-04-25 03:50:34

标签: pytorch

我有一个图像列表,其中包括['1.jpg',......,'1000.jpg']

我需要第一个数据加载器按顺序加载图像列表。

有时,我需要第二个数据加载器来加载反向图像列表,该列表包含到目前为止的部分图像,例如['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

在main函数中,有时我会执行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)

0 个答案:

没有答案