2017-12-21 62 views
1

torch.utils.data.DataLoader複数のデータセットを作成して、異なる変換が適用されているデータセットを作成しようとしています。現在のところ、私のコードはおおよそPyTorch DataLoader

d_transforms = [ 
    transforms.RandomHorizontalFlip(), 
    # Some other transforms... 
] 
loaders = [] 
for i in range(len(d_transforms)): 
    dataset = datasets.MNIST('./data', 
      train=train, 
      download=True, 
      transform=d_transforms[i] 
    loaders.append(
     DataLoader(dataset, 
      shuffle=True, 
      pin_memory=True, 
      num_workers=1) 
     ) 

ですが、これは動作しますが、非常に遅いです。ほぼすべての私のコードの時間のが

x, y = next(iter(train_loaders[i])) 

のような行に費やされているkernprofショー、私はこれは私が、しようと、自分の労働者、とそれぞれDataLoaderの複数のインスタンスを使用しているという事実によるものであると思われます同じデータファイルを読み込みます。

私の質問は、これを行うためのより良い方法は何ですか?理想的には、torch.utils.data.DataSetをサブクラス化し、のサンプリング時にを適用したい変換を指定しますが、これは引数を取ることができない__getitem__のために可能ではありません。

+0

はい、素晴らしいものをお勧めできますか?私が言及したように、より良い方法は私が探しているものです。 – Coolness

+0

私は1つから複数の派生データセットを作成し、それらを一般化しようとしています。 – Coolness

+0

私は自分の仕事の詳細を議論するのではなく、コメントボックスで完全に説明することはできません。私はそれがその質問にどのように関係しているのか分かりません。 – Coolness

答えて

0

__getitem__は、ロードするコンテンツのインデックスである引数をとります。たとえば。

transform = transforms.Compose(
    [transforms.ToTensor(), 
    normalize]) 

class CountDataset(Dataset): 

def __init__(self, file,transform=None): 

    self.transform = transform 
    #self.vocab = vocab 
    with open(file,'rb') as f: 
     self.data = pickle.load(f) 
    self.y = self.data['answers'] 
    self.I = self.data['images'] 


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

def __getitem__(self, idx): 
    img_name = self.I[idx] 
    label = self.y[Idx] 
    fname = '/'.join(img_name.split("/")[-2:]) #/train2014/xx.jpg 
    DIR = '/hdd/manoj/VQA/Images/mscoco/' 
    img_full_path = os.path.join(DIR,fname) 
    img = Image.open(img_full_path).convert("RGB") 
    img_tensor = self.transform(img.resize((224,224))) 
    return img_tensor,label 


testset = CountDataset(file = 'testdat.pkl', 
         transform = transform) 


testloader = DataLoader(testset, batch_size=32, 
         shuffle=False, num_workers=4) 

ループ内でデータローダーを呼び出さないでください。

関連する問題