Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/304.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Pytorch上具有相同标签的批量点_Python_Classification_Pytorch - Fatal编程技术网

Python Pytorch上具有相同标签的批量点

Python Pytorch上具有相同标签的批量点,python,classification,pytorch,Python,Classification,Pytorch,我想用梯度下降法训练一个神经网络,每个批次包含N个训练点。我希望这些批次只包含具有相同标签的点,而不是从训练集中随机抽样 例如,如果我正在使用MNIST进行培训,我希望有如下所示的批处理: batch_1 = {0,0,0,0,0,0,0,0} batch_2 = {3,3,3,3,3,3,3,3} batch_3 = {7,7,7,7,7,7,7,7} 等等 我如何使用Pytork进行操作 一种方法是为每个类创建子集和数据加载器,然后通过在每次迭代中随机切换数据加载器进行迭代: imp

我想用梯度下降法训练一个神经网络,每个批次包含N个训练点。我希望这些批次只包含具有相同标签的点,而不是从训练集中随机抽样

例如,如果我正在使用MNIST进行培训,我希望有如下所示的批处理:

batch_1 = {0,0,0,0,0,0,0,0}

batch_2 = {3,3,3,3,3,3,3,3}

batch_3 = {7,7,7,7,7,7,7,7}

等等


我如何使用Pytork进行操作

一种方法是为每个类创建子集和数据加载器,然后通过在每次迭代中随机切换数据加载器进行迭代:

import torch
from torch.utils.data import DataLoader, Subset
from torchvision.datasets import MNIST
from torchvision import transforms
import numpy as np

dataset = MNIST('path/to/mnist_root/', 
                transform=transforms.ToTensor(),
                download=True)

class_inds = [torch.where(dataset.targets == class_idx)[0]
              for class_idx in dataset.class_to_idx.values()]

dataloaders = [
    DataLoader(
        dataset=Subset(dataset, inds),
        batch_size=8,
        shuffle=True,
        drop_last=False)
    for inds in class_inds]

epochs = 1

for epoch in range(epochs):
    iterators = list(map(iter, dataloaders))   
    while iterators:         
        iterator = np.random.choice(iterators)
        try:
            images, labels = next(iterator)   
            print(labels)
            # do_more_stuff()

        except StopIteration:
            iterators.remove(iterator)
tensor([6, 6, 6, 6, 6, 6, 6, 6])
tensor([3, 3, 3, 3, 3, 3, 3, 3])
tensor([0, 0, 0, 0, 0, 0, 0, 0])
tensor([5, 5, 5, 5, 5, 5, 5, 5])
tensor([8, 8, 8, 8, 8, 8, 8, 8])
tensor([0, 0, 0, 0, 0, 0, 0, 0])
...
tensor([1, 1, 1, 1, 1, 1, 1, 1])
tensor([1, 1, 1, 1, 1, 1])
这将适用于任何数据集(而不仅仅是MNIST)。 以下是每次迭代打印标签的结果:

import torch
from torch.utils.data import DataLoader, Subset
from torchvision.datasets import MNIST
from torchvision import transforms
import numpy as np

dataset = MNIST('path/to/mnist_root/', 
                transform=transforms.ToTensor(),
                download=True)

class_inds = [torch.where(dataset.targets == class_idx)[0]
              for class_idx in dataset.class_to_idx.values()]

dataloaders = [
    DataLoader(
        dataset=Subset(dataset, inds),
        batch_size=8,
        shuffle=True,
        drop_last=False)
    for inds in class_inds]

epochs = 1

for epoch in range(epochs):
    iterators = list(map(iter, dataloaders))   
    while iterators:         
        iterator = np.random.choice(iterators)
        try:
            images, labels = next(iterator)   
            print(labels)
            # do_more_stuff()

        except StopIteration:
            iterators.remove(iterator)
tensor([6, 6, 6, 6, 6, 6, 6, 6])
tensor([3, 3, 3, 3, 3, 3, 3, 3])
tensor([0, 0, 0, 0, 0, 0, 0, 0])
tensor([5, 5, 5, 5, 5, 5, 5, 5])
tensor([8, 8, 8, 8, 8, 8, 8, 8])
tensor([0, 0, 0, 0, 0, 0, 0, 0])
...
tensor([1, 1, 1, 1, 1, 1, 1, 1])
tensor([1, 1, 1, 1, 1, 1])

请注意,通过设置
drop\u last=False
,这里和那里会有批大小小于
batch\u的元素。如果将其设置为True,则所有批次的大小都相同,但会删除一些数据点。

每个类中的点数不同,不必除以批次大小。那你打算怎么处理呢?是否应该有一些批次包含不同的类(例如,在某一点上,您将有3个0类分数剩余),或者您希望删除不适合一个批次的分数?培训点数可能也不能被批次大小整除,因此这不应该是一个问题,对吗?例如,0类中有5923个分数,因此,如果你把它们分成大小为8的批次,你将有740个这样的批次(740*8=5920),剩下3个0级的点。你把它们放在哪里?当你有50000个训练点和128个批量时会发生什么?它们也不可分割,但这是一种非常常见的设置。为了回答你的问题,我可以在一个特定的时期内放弃一些分数。谢谢我错了,抱歉,删除了我的答案。