在PyTorch中定义批量大小为1的手动排序MNIST数据集

在PyTorch中定义批量大小为1的手动排序MNIST数据集,pytorch,mnist,batchsize,pytorch-dataloader,Pytorch,Mnist,Batchsize,Pytorch Dataloader,[]:表示批次。例如,如果批次大小为5,则批次将类似于[1,4,7,4,2]。[]的长度表示批次大小 我想制作一个训练集,如下所示: [1] ->[1]->[1]->[1]->[1]->[7]->[7]->[7]->[7]->[3]->[3]->[3]->[3]->。。。等等 也就是说,第一个是5个1(批量大小=1),第二个是5个7(批量大小=1),第三个是5个3(批量大小=1),依此类推 有人能给我一个主意吗 如果有人能解释如何用代码实现这一点,那将非常有帮助 谢谢!:) 如果您想要一个数据加

[]:表示批次。例如,如果批次大小为5,则批次将类似于[1,4,7,4,2]。[]的长度表示批次大小

我想制作一个训练集,如下所示:

[1] ->[1]->[1]->[1]->[1]->[7]->[7]->[7]->[7]->[3]->[3]->[3]->[3]->。。。等等

也就是说,第一个是5个1(批量大小=1),第二个是5个7(批量大小=1),第三个是5个3(批量大小=1),依此类推

有人能给我一个主意吗

如果有人能解释如何用代码实现这一点,那将非常有帮助


谢谢!:)

如果您想要一个数据加载器,其中只需要为每个示例定义类标签,那么您可以使用该类。尽管名称不同,它并不一定需要定义数据集的子集。比如说

导入火炬
进口火炬视觉
将torchvision.transforms导入为T
从itertools导入周期
mnist=torchvision.datasets.mnist(root='./',train=True,transform=T.ToTensor())
#不确定“…等等”意味着什么,但请随意定义此列表
目标_类=[1,1,1,1,7,7,7,7,7,3,3,3,3,3]
#为MNIST中的每个类创建索引的循环迭代器
索引=dict()
对于torch.unique(mnist.targets).tolist()中的标签:
索引[标签]=循环(torch.nonzero(mnist.targets==标签).flatte().tolist())
#根据目标类定义新mnist子集中索引的顺序
新的_指数=[]
对于目标课程中的t:
新增索引。追加(下一个(索引[t]))
#基于新的索引创建MNIST的子集
mnist_modified=torch.utils.data.Subset(mnist,new_索引)
dataloader=torch.utils.data.dataloader(mnist\u修改,批大小=1,shuffle=False)
对于枚举(数据加载器)中的idx,(x,y):
#训练回路
打印(f'Batch{idx+1}标签:{y.tolist()}')

如果您想要一个在同一个类的一行中返回五个样本的
数据加载器,但不想手动为每个索引定义类,那么您可以创建一个自定义采样器。比如说

导入火炬
进口火炬视觉
将torchvision.transforms导入为T
从itertools导入周期
类重复类采样器(torch.utils.data.Sampler):
def uuu init uuuu(自我、目标、重复计数、长度、随机播放=假):
如果不是火炬,则为张量(目标):
目标=火炬张量(目标)
self.targets=目标
self.repeat\u count=repeat\u count
self.length=长度
self.shuffle=洗牌
self.classes=torch.unique(targets.tolist())
self.class_索引=dict()
对于self.class中的标签:
self.class_索引[label]=torch.nonzero(targets==label).flatten()
定义(自我):
类别索引=dict()
对于self.class中的标签:
如果self.shuffle:
class_index_iters[label]=循环(self.class_index[label][torch.randperm(len(self.class_index)))].tolist())
其他:
class\u index\u iters[label]=循环(self.class\u index[label].tolist())
如果self.shuffle:
target_iter=cycle(self.targets[torch.randperm(len(self.targets))].tolist())
其他:
target\u iter=cycle(self.targets.tolist())
def索引_生成器():
对于范围内的i(自身长度):
如果i%self.repeat_count==0:
当前级=下一级(目标级)
下一个收益率(类别指数[当前类别])
返回索引_生成器()
定义(自我):
返回自长度
mnist=torchvision.datasets.mnist(root='./',train=True,transform=T.ToTensor())
dataloader=torch.utils.data.dataloader(
mnist,
批次大小=1,
采样器=重复类采样器(
targets=mnist.targets,
重复_count=5,
长度=15,#从数据集中选择的总数
洗牌=真)
对于枚举(数据加载器)中的idx,(x,y):
#训练回路
打印(f'Batch{idx+1}标签:{y.tolist()}')