如何解决如何使用 MNIST 数据集在 pytorch 中进行手动批处理
我是 pytorch 的新手。
在 pytorch 中训练 MNIST 数据集时,我尝试使用不同的方法。
通常情况下,我们会为每个批次放置所有打乱的数字。
我想做的是(假设批量大小为 20 并且有 1000 个训练示例)。 批量查看这个(为了简单起见,我只写了标签)
batch_1 = [0,1,... ] 这个批次只有 0 和 1
batch_2 = [6,6,7,... ] 这个批次只有 6 和 7
batch_3 = [2,3,2,... ] 这个批次只有 2 和 3
batch_4 = [4,5,4,... ] 这个批次只有 4 和 5
batch_5 = [6,... ] 这个批次只有 6 和 7
batch_6 = [8,9,... ] 这个批次只有 8 和 9
batch_7 = [2,... ] 这个批次只有 2 和 3
batch_8 = [4,... ] 这个批次只有 4 和 5
...
batch_50 = [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,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,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)
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。