通常,在pytorch中加载数据时,请执行以下操作
for x, y in dataloaders:
# Do something
但是,在名为MusicNet的数据集中,他们声明了自己的数据集和数据加载器,如下所示
train_set = musicnet.MusicNet(root=root, train=True, download=True, window=window)#, pitch_shift=5, jitter=.1)
test_set = musicnet.MusicNet(root=root, train=False, window=window, epoch_size=50000)
train_loader = torch.utils.data.DataLoader(dataset=train_set,batch_size=batch_size,**kwargs)
test_loader = torch.utils.data.DataLoader(dataset=test_set,batch_size=batch_size,**kwargs)
然后他们像这样加载数据
with train_set, test_set:
for i, (x, y) in enumerate(train_loader):
# Do something
我不明白为什么没有代码行不通with train_set, test_set
。
另外,如何访问数据?
我试过了
train_set.access(2560,0)
和
with train_set, test_set:
x, y = train_set.access(2560,0)
他们要么给我一条错误消息,如
----> 1 train_set.access(2560,0)中的KeyError Traceback(最近一次通话最后一次)
/workspace/raven_data/AMT/MusicNet/pytorch_musicnet/musicnet.py in access(self,rec_id,s,shift,jitter)106107 if self.mmap:-> 108 x = np.frombuffer(self.records [rec_id] [0] [ssz_float:int(s + scaleself.window)* sz_float],dtype = np.float32).copy()109否则:110 fid,_ = self.records [rec_id]
KeyError:2560
或者给我一个空x
和y
问题1
我不明白为什么没有代码行不通
with train_set, test_set
。
为了能够torch.utils.data.DataLoader
与自定义数据集设计一起使用,您必须创建一个数据集的类,该类将子类化(并实现特定功能)并将其传递给数据加载器,即使他们这样说:torch.utils.data.Dataset
所有其他数据集都应将其子类化。所有子类均应覆盖
__len__
,提供数据集的大小和,并__getitem__
支持从0到len(self)互斥的整数索引。
这是在以下情况中发生的:
train_set = musicnet.MusicNet(root=root, train=True, download=True, window=window)#, pitch_shift=5, jitter=.1)
test_set = musicnet.MusicNet(root=root, train=False, window=window, epoch_size=50000)
train_loader = torch.utils.data.DataLoader(dataset=train_set,batch_size=batch_size,**kwargs)
test_loader = torch.utils.data.DataLoader(dataset=test_set,batch_size=batch_size,**k
如果检查他们musicnet.MusicNet
,您会发现他们这样做了。
问题2
另外,如何访问数据?
有可能的方法:
要仅从数据集中获取批次,可以执行以下操作:
batch = next(iter(train_loader))
要访问整个数据集(尤其是在您的示例中):
dataset = train_loader.dataset.records
(.records
我说的是这部分可能因数据集而异,.records
因为这是我在这里找到的)
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句