我是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)