我有一个格式定义的数据集:
class MyDataset(Dataset):
def __init__(self, N):
self.N = N
self.x = torch.rand(self.N, 10)
self.y = torch.randint(0, 3, (self.N,))
def __len__(self):
return self.N
def __getitem__(self, idx):
return self.x[idx], self.y[idx]
Run Code Online (Sandbox Code Playgroud)
在训练过程中,我想对m训练样本进行批量采样,并进行替换;例如,第一次迭代包括数据索引[1, 5, 6],第二次迭代包括数据点[12, 3, 5],依此类推。所以迭代总数是一个输入,而不是N/m
有没有办法用来dataloader处理这个问题?如果没有,除了以下形式之外还有其他方法吗
for i in range(iter):
x = np.random.choice(range(N), m, replace=True)
Run Code Online (Sandbox Code Playgroud)
来实施这个?
您可以使用RandomSampler,这是一个在数据集和数据加载器之间滑动的实用程序:
>>> ds = MyDataset(N)
>>> sampler = RandomSampler(ds, replacement=True, num_samples=M)
Run Code Online (Sandbox Code Playgroud)
以上,sampler将总共采样M(如果有的话当然需要更换num_samples > len(ds))。在你的例子中M = iter*m。
然后您可以使用以下DataLoader命令初始化 a sampler:
>>> dl = DataLoader(ds, sampler=sampler, batch_size=2)
Run Code Online (Sandbox Code Playgroud)
N = 2以下是、M = 2*len(ds) = 4和的可能结果batch_size = 2:
>>> for x, y in dl:
... print(x, y)
tensor([[0.5541, 0.3596, 0.5180, 0.1511, 0.3523, 0.4001, 0.6977, 0.1218, 0.2458, 0.8735],
[0.0407, 0.2081, 0.5510, 0.2063, 0.1499, 0.1266, 0.1928, 0.0589, 0.2789, 0.3531]])
tensor([1, 0])
tensor([[0.5541, 0.3596, 0.5180, 0.1511, 0.3523, 0.4001, 0.6977, 0.1218, 0.2458, 0.8735],
[0.0431, 0.0452, 0.3286, 0.5139, 0.4620, 0.4468, 0.3490, 0.4226, 0.3930, 0.2227]])
tensor([1, 0])
tensor([[0.5541, 0.3596, 0.5180, 0.1511, 0.3523, 0.4001, 0.6977, 0.1218, 0.2458, 0.8735],
[0.5541, 0.3596, 0.5180, 0.1511, 0.3523, 0.4001, 0.6977, 0.1218, 0.2458, 0.8735]])
tensor([1, 1])
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2734 次 |
| 最近记录: |