如何使用 MNIST 数据集在 pytorch 中进行手动批处理

时间:2021-02-23 15:16:18

标签: pytorch mnist batchsize

我是 pytorch 的新手。

在 pytorch 中训练 MNIST 数据集时,我尝试使用不同的方法。

通常情况下,我们会为每个批次放置所有打乱的数字。

我想做的是(假设批量大小为 20 并且有 1000 个训练示例)。 批量查看这个(为了简单起见,我只写了标签)


batch_1 = [0, 0, 1, 0, ... ] 这个批次只有 0 和 1

batch_2 = [6, 6, 7, 7, ... ] 这个批次只有 6 和 7

batch_3 = [2, 3, 2, 2, ... ] 这个批次只有 2 和 3

batch_4 = [4, 5, 5, 4, ... ] 这个批次只有 4 和 5

batch_5 = [6, 6, 7, 7, ... ] 这个批次只有 6 和 7

batch_6 = [8, 9, 9, 9, ... ] 这个批次只有 8 和 9

batch_7 = [2, 3, 2, 2, ... ] 这个批次只有 2 和 3

batch_8 = [4, 5, 5, 4, ... ] 这个批次只有 4 和 5

...

batch_50 = [4, 5, 5, 4, ... ] 这个批次只有 4 和 5


我怎样才能在 pytorch 中做到这一点??

谢谢


到目前为止,这是我的训练/测试实现。 我将扩展/操作下面的这段代码来开发上面的代码。

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

mnist_trainset = datasets.MNIST(root='./data', train=True, 
                                download=True, 
                                transform=transforms.Compose([transforms.ToTensor()]))

mnist_testset  = datasets.MNIST(root='./data', 
                                train=False, 
                                download=True, 
                                transform=transforms.Compose([transforms.ToTensor()]))

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

train_dataloaders = [
                     DataLoader(dataset=Subset(mnist_trainset, inds),
                                batch_size=50,
                                shuffle=True,
                                drop_last=False
                     )
                     for inds in class_inds
]

test_dataloader  = torch.utils.data.DataLoader(mnist_testset, 
                                               batch_size=50, 
                                               shuffle=False)

class Model(torch.nn.Module):
    def __init__(self):
        super(Model, self).__init__()
        self.linear_1 = torch.nn.Linear(784, 256)
        self.linear_2 = torch.nn.Linear(256, 10)
        self.sigmoid  = torch.nn.Sigmoid()

    def forward(self, x):
        x = x.reshape(x.size(0), -1)
        x = self.linear_1(x)
        x = self.sigmoid(x)
        pred = self.linear_2(x)

        return pred

model = Model()
optimizer = torch.optim.SGD(model.parameters(), lr=0.1)
epochs = 20

criterion = torch.nn.CrossEntropyLoss()

test_acc   = list()

for epoch in range(epochs):

    print(f"epoch {epoch} started")

    model.train()
    itr = 0 
    iterators = list(map(iter, train_dataloaders))   
    while iterators:
        itr = itr + 1 
        iterator = np.random.choice(iterators)
        try:
            image, label = next(iterator)   

            optimizer.zero_grad()

            pred = model(image)

            loss = criterion(pred, label)

            loss.backward()
            optimizer.step()
            
        except StopIteration:
            iterators.remove(iterator)

    model.eval()
    total = 0
    for itr, (image, label) in enumerate(test_dataloader):

        pred = model(image)

        loss = criterion(pred, label)

        # we now need softmax because we are testing.
        pred = torch.nn.functional.softmax(pred, dim=1)
        for i, p in enumerate(pred):
            if label[i] == torch.max(p.data, 0)[1]:
                total = total + 1

    accuracy = total / len(mnist_testset)

    # append accuracy here
    test_acc.append(accuracy)


0 个答案:

没有答案