Python — Torch — многослойный perceptron API хуже, чем закодированный вручную?

#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. извините, я не помню