1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86
| import torch import torch.nn as nn import torch.nn.functional as F import torch.optim as optim from torch.utils.data import DataLoader from torchvision import datasets, transforms
class SoftmaxRegression(nn.Module): def __init__(self, num_input, num_output): super().__init__() self.flatten = nn.Flatten() self.linear1 = nn.Linear(num_input, 1000) self.linear2 = nn.Linear(1000, 600) self.linear3 = nn.Linear(600, 200) self.linear4 = nn.Linear(200, num_output) def forward(self, x): x = self.flatten(x) x = self.linear1(x) x = F.relu(x) x = self.linear2(x) x = F.relu(x) x = self.linear3(x) x = F.relu(x) return self.linear4(x)
class Accumulate(): def __init__(self, num): self.data = [0.0] * num def add(self, *args): self.data = [a + float(b) for a, b in zip(self.data, args)] def reset(self): self.data = [0.0] * len(self.data) def __getitem__(self, idx): return self.data[idx]
def accuracy(data_iter, model, device): accumulate = Accumulate(2) with torch.no_grad(): for X, y in data_iter: X, y = X.to(device), y.to(device) y_hat = model(X).argmax(dim=1) accumulate.add((y_hat == y).sum().item(), y.numel()) return accumulate[0] / accumulate[1]
def init_weight(m): if isinstance(m, nn.Linear): nn.init.kaiming_normal_(m.weight) nn.init.zeros_(m.bias) batch_size = 256 transform = transforms.ToTensor() train_data = datasets.FashionMNIST(root='./data', train=True, download=False, transform=transform) test_data = datasets.FashionMNIST(root='./data', train=False, download=False, transform=transform) train_iter = DataLoader(dataset=train_data, batch_size=batch_size, shuffle=True, num_workers=4) test_iter = DataLoader(dataset=test_data, batch_size=batch_size, shuffle=True, num_workers=4)
model = SoftmaxRegression(28*28, 10) model.apply(init_weight) loss_function = nn.CrossEntropyLoss() optimizer = optim.SGD(model.parameters(), lr=0.01)
device = torch.device("cuda:0" if torch.cuda.is_available() else "cpu") model.to(device)
num_epochs = 10 for epoch in range(num_epochs): accumulate = Accumulate(2) for X, y in train_iter: X, y = X.to(device), y.to(device) y_hat = model(X) accumulate.add((y_hat.argmax(dim=1) == y).sum().item(), y.numel()) loss = loss_function(y_hat, y) optimizer.zero_grad() loss.backward() optimizer.step() print(f'epoch {epoch + 1}, Train accuracy {(accumulate[0] / accumulate[1])*100:.2f}%, Test accuracy {accuracy(test_iter, model, device)*100:.2f}%')
|