#python #torchvision
#python #torchvision
Вопрос:
Я прохожу курс на Coursera по машинному обучению, и одной из лабораторных работ было закодировать многослойный персептрон вручную и сравнить его с Torch API. Я так и сделал; однако после запуска обоих несколько раз Torch API выглядит на ~ 0,5% хуже (~ 92% против ~ 92,5%), чем ручное кодирование, что наводит меня на мысль, что я где-то перепутал какой-то синтаксис.
Я не знаю наверняка, но я предполагаю, что проблема в MNIST_Perceptron
классе… Есть идеи?
import numpy as np
import torch
import torch.nn as nn
import torch.nn.functional as F
from torchvision import datasets, transforms
from tqdm.notebook import tqdm
class MNIST_Perceptron(nn.Module):
def __init__(self):
super().__init__()
self.lin0 = nn.Linear(784, 500)
self.lin1 = nn.Linear(500, 10)
def forward(self, x):
return self.lin1( F.relu( self.lin0(x) ) )
mnist_train = datasets.MNIST(root="./datasets", train=True, transform=transforms.ToTensor(), download=True)
mnist_test = datasets.MNIST(root="./datasets", train=False, transform=transforms.ToTensor(), download=True)
train_loader = torch.utils.data.DataLoader(mnist_train, batch_size=100, shuffle=True)
test_loader = torch.utils.data.DataLoader(mnist_test, batch_size=100, shuffle=False)
## Training
# Instantiate model
model = MNIST_Perceptron()
# Loss and Optimizer
criterion = nn.CrossEntropyLoss()
optimizer = torch.optim.SGD(model.parameters(), lr=0.1)
# Iterate through train set minibatchs
for images, labels in tqdm(train_loader):
# Zero out the gradients
optimizer.zero_grad()
# Forward pass
x = images.view(-1, 28*28)
y = model(x)
loss = criterion(y, labels)
# Backward pass
loss.backward()
optimizer.step()
## Testing
correct = 0
total = len(mnist_test)
with torch.no_grad():
# Iterate through test set minibatchs
for images, labels in tqdm(test_loader):
# Forward pass
x = images.view(-1, 28*28)
y = model(x)
predictions = torch.argmax(y, dim=1)
correct = torch.sum((predictions == labels).float())
print('Test accuracy: {}'.format(correct/total))
Комментарии:
1. Я иду тем же курсом. Ваше решение API выглядит гладким. Опубликованный вами код является nn.Module более высокого уровня. Какова была ваша настройка в ручной версии? Я не уверен, как обрабатывается смещение между self.lin0 и self.lin1. Создается ли предвзятость, добавляется ли она? Вы пробовали задавать этот вопрос на форуме PyTorch discuss.pytorch.org ? В качестве альтернативы, разместили ли вы вопрос на форуме Coursera class?
2. извините, я не помню