Imports


In [5]:
from __future__ import print_function
import argparse
import torch
import torch.nn as nn
import torch.nn.functional as F
import torch.optim as optim
from torchvision import datasets, transforms
from torch.autograd import Variable

NN


In [8]:
batch_size = 32
train_loader = torch.utils.data.DataLoader(
    datasets.MNIST('./data', train=True, download=True,
                   transform=transforms.Compose([
                       transforms.ToTensor(),
                       transforms.Normalize((0.1307,), (0.3081,))
                   ])),
    batch_size=batch_size, shuffle=True)

test_loader = torch.utils.data.DataLoader(
    datasets.MNIST('./data', train=False, transform=transforms.Compose([
                       transforms.ToTensor(),
                       transforms.Normalize((0.1307,), (0.3081,))
                   ])),
    batch_size=batch_size, shuffle=True)

In [9]:
class Net(nn.Module):
    def __init__(self):
        super(Net, self).__init__()
        self.conv1 = nn.Conv2d(1, 10, kernel_size=5)
        self.conv2 = nn.Conv2d(10, 20, kernel_size=5)
        self.conv2_drop = nn.Dropout2d()
        self.fc1 = nn.Linear(320, 50)
        self.fc2 = nn.Linear(50, 10)

    def forward(self, x):
        x = F.relu(F.max_pool2d(self.conv1(x), 2))
        x = F.relu(F.max_pool2d(self.conv2_drop(self.conv2(x)), 2))
        x = x.view(-1, 320)
        x = F.relu(self.fc1(x))
        x = F.dropout(x, training=self.training)
        x = self.fc2(x)
        return F.log_softmax(x)

In [23]:
model = Net()
cuda = False
log_interval = 30

In [24]:
optimizer = optim.SGD(model.parameters(), lr=0.01, momentum=0.5)

In [25]:
def train(epoch):
    model.train()
    for batch_idx, (data, target) in enumerate(train_loader):
        data, target = Variable(data), Variable(target)
        optimizer.zero_grad()
        output = model(data)
        loss = F.nll_loss(output, target)
        loss.backward()
        optimizer.step()
        if batch_idx % log_interval == 0:
            print('Train Epoch: {} [{}/{} ({:.0f}%)]\tLoss: {:.6f}'.format(
                epoch, batch_idx * len(data), len(train_loader.dataset),
                100. * batch_idx / len(train_loader), loss.data[0]))

def test():
    model.eval()
    test_loss = 0
    correct = 0
    for data, target in test_loader:
        data, target = Variable(data, volatile=True), Variable(target)
        output = model(data)
        test_loss += F.nll_loss(output, target, size_average=False).data[0] # sum up batch loss
        pred = output.data.max(1, keepdim=True)[1] # get the index of the max log-probability
        correct += pred.eq(target.data.view_as(pred)).cpu().sum()

    test_loss /= len(test_loader.dataset)
    print('\nTest set: Average loss: {:.4f}, Accuracy: {}/{} ({:.0f}%)\n'.format(
        test_loss, correct, len(test_loader.dataset),
        100. * correct / len(test_loader.dataset)))

In [26]:
epochs = 3
for epoch in range(1, epochs + 1):
    train(epoch)
    test()


Train Epoch: 1 [0/60000 (0%)]	Loss: 2.295406
Train Epoch: 1 [960/60000 (2%)]	Loss: 2.235366
Train Epoch: 1 [1920/60000 (3%)]	Loss: 2.175861
Train Epoch: 1 [2880/60000 (5%)]	Loss: 2.103730
Train Epoch: 1 [3840/60000 (6%)]	Loss: 1.727436
Train Epoch: 1 [4800/60000 (8%)]	Loss: 1.211874
Train Epoch: 1 [5760/60000 (10%)]	Loss: 1.245980
Train Epoch: 1 [6720/60000 (11%)]	Loss: 1.075009
Train Epoch: 1 [7680/60000 (13%)]	Loss: 1.044878
Train Epoch: 1 [8640/60000 (14%)]	Loss: 0.938734
Train Epoch: 1 [9600/60000 (16%)]	Loss: 0.626106
Train Epoch: 1 [10560/60000 (18%)]	Loss: 0.691826
Train Epoch: 1 [11520/60000 (19%)]	Loss: 0.548265
Train Epoch: 1 [12480/60000 (21%)]	Loss: 0.628562
Train Epoch: 1 [13440/60000 (22%)]	Loss: 0.769787
Train Epoch: 1 [14400/60000 (24%)]	Loss: 0.724283
Train Epoch: 1 [15360/60000 (26%)]	Loss: 0.631656
Train Epoch: 1 [16320/60000 (27%)]	Loss: 0.695840
Train Epoch: 1 [17280/60000 (29%)]	Loss: 0.710374
Train Epoch: 1 [18240/60000 (30%)]	Loss: 0.796127
Train Epoch: 1 [19200/60000 (32%)]	Loss: 0.733726
Train Epoch: 1 [20160/60000 (34%)]	Loss: 0.227776
Train Epoch: 1 [21120/60000 (35%)]	Loss: 0.746073
Train Epoch: 1 [22080/60000 (37%)]	Loss: 0.501336
Train Epoch: 1 [23040/60000 (38%)]	Loss: 0.721570
Train Epoch: 1 [24000/60000 (40%)]	Loss: 0.719098
Train Epoch: 1 [24960/60000 (42%)]	Loss: 0.540412
Train Epoch: 1 [25920/60000 (43%)]	Loss: 0.554842
Train Epoch: 1 [26880/60000 (45%)]	Loss: 0.638289
Train Epoch: 1 [27840/60000 (46%)]	Loss: 0.632515
Train Epoch: 1 [28800/60000 (48%)]	Loss: 0.774320
Train Epoch: 1 [29760/60000 (50%)]	Loss: 0.443260
Train Epoch: 1 [30720/60000 (51%)]	Loss: 0.320713
Train Epoch: 1 [31680/60000 (53%)]	Loss: 0.242847
Train Epoch: 1 [32640/60000 (54%)]	Loss: 0.181369
Train Epoch: 1 [33600/60000 (56%)]	Loss: 0.607073
Train Epoch: 1 [34560/60000 (58%)]	Loss: 0.262537
Train Epoch: 1 [35520/60000 (59%)]	Loss: 0.361853
Train Epoch: 1 [36480/60000 (61%)]	Loss: 0.672591
Train Epoch: 1 [37440/60000 (62%)]	Loss: 0.617234
Train Epoch: 1 [38400/60000 (64%)]	Loss: 0.471534
Train Epoch: 1 [39360/60000 (66%)]	Loss: 0.219688
Train Epoch: 1 [40320/60000 (67%)]	Loss: 0.400357
Train Epoch: 1 [41280/60000 (69%)]	Loss: 0.397013
Train Epoch: 1 [42240/60000 (70%)]	Loss: 0.309156
Train Epoch: 1 [43200/60000 (72%)]	Loss: 0.745791
Train Epoch: 1 [44160/60000 (74%)]	Loss: 0.521672
Train Epoch: 1 [45120/60000 (75%)]	Loss: 0.467531
Train Epoch: 1 [46080/60000 (77%)]	Loss: 0.355311
Train Epoch: 1 [47040/60000 (78%)]	Loss: 0.237006
Train Epoch: 1 [48000/60000 (80%)]	Loss: 0.349374
Train Epoch: 1 [48960/60000 (82%)]	Loss: 0.298388
Train Epoch: 1 [49920/60000 (83%)]	Loss: 0.177769
Train Epoch: 1 [50880/60000 (85%)]	Loss: 0.428570
Train Epoch: 1 [51840/60000 (86%)]	Loss: 0.370661
Train Epoch: 1 [52800/60000 (88%)]	Loss: 0.418585
Train Epoch: 1 [53760/60000 (90%)]	Loss: 0.229977
Train Epoch: 1 [54720/60000 (91%)]	Loss: 0.404841
Train Epoch: 1 [55680/60000 (93%)]	Loss: 0.447167
Train Epoch: 1 [56640/60000 (94%)]	Loss: 0.268207
Train Epoch: 1 [57600/60000 (96%)]	Loss: 0.378413
Train Epoch: 1 [58560/60000 (98%)]	Loss: 0.173025
Train Epoch: 1 [59520/60000 (99%)]	Loss: 0.431608

Test set: Average loss: 0.1316, Accuracy: 9618/10000 (96%)

Train Epoch: 2 [0/60000 (0%)]	Loss: 0.281486
Train Epoch: 2 [960/60000 (2%)]	Loss: 0.414493
Train Epoch: 2 [1920/60000 (3%)]	Loss: 0.253803
Train Epoch: 2 [2880/60000 (5%)]	Loss: 0.437033
Train Epoch: 2 [3840/60000 (6%)]	Loss: 0.207859
Train Epoch: 2 [4800/60000 (8%)]	Loss: 0.280900
Train Epoch: 2 [5760/60000 (10%)]	Loss: 0.627268
Train Epoch: 2 [6720/60000 (11%)]	Loss: 0.543275
Train Epoch: 2 [7680/60000 (13%)]	Loss: 0.167857
Train Epoch: 2 [8640/60000 (14%)]	Loss: 0.223386
Train Epoch: 2 [9600/60000 (16%)]	Loss: 0.477240
Train Epoch: 2 [10560/60000 (18%)]	Loss: 0.370202
Train Epoch: 2 [11520/60000 (19%)]	Loss: 0.158215
Train Epoch: 2 [12480/60000 (21%)]	Loss: 0.189375
Train Epoch: 2 [13440/60000 (22%)]	Loss: 0.362869
Train Epoch: 2 [14400/60000 (24%)]	Loss: 0.400479
Train Epoch: 2 [15360/60000 (26%)]	Loss: 0.211785
Train Epoch: 2 [16320/60000 (27%)]	Loss: 0.294231
Train Epoch: 2 [17280/60000 (29%)]	Loss: 0.231881
Train Epoch: 2 [18240/60000 (30%)]	Loss: 0.143388
Train Epoch: 2 [19200/60000 (32%)]	Loss: 0.291713
Train Epoch: 2 [20160/60000 (34%)]	Loss: 0.257314
Train Epoch: 2 [21120/60000 (35%)]	Loss: 0.253233
Train Epoch: 2 [22080/60000 (37%)]	Loss: 0.561208
Train Epoch: 2 [23040/60000 (38%)]	Loss: 0.369655
Train Epoch: 2 [24000/60000 (40%)]	Loss: 0.301215
Train Epoch: 2 [24960/60000 (42%)]	Loss: 0.509635
Train Epoch: 2 [25920/60000 (43%)]	Loss: 0.368167
Train Epoch: 2 [26880/60000 (45%)]	Loss: 0.345610
Train Epoch: 2 [27840/60000 (46%)]	Loss: 0.289827
Train Epoch: 2 [28800/60000 (48%)]	Loss: 0.607375
Train Epoch: 2 [29760/60000 (50%)]	Loss: 0.326177
Train Epoch: 2 [30720/60000 (51%)]	Loss: 0.757204
Train Epoch: 2 [31680/60000 (53%)]	Loss: 0.441585
Train Epoch: 2 [32640/60000 (54%)]	Loss: 0.429446
Train Epoch: 2 [33600/60000 (56%)]	Loss: 0.222458
Train Epoch: 2 [34560/60000 (58%)]	Loss: 0.228259
Train Epoch: 2 [35520/60000 (59%)]	Loss: 0.138747
Train Epoch: 2 [36480/60000 (61%)]	Loss: 0.317081
Train Epoch: 2 [37440/60000 (62%)]	Loss: 0.435933
Train Epoch: 2 [38400/60000 (64%)]	Loss: 0.326388
Train Epoch: 2 [39360/60000 (66%)]	Loss: 0.235206
Train Epoch: 2 [40320/60000 (67%)]	Loss: 0.300818
Train Epoch: 2 [41280/60000 (69%)]	Loss: 0.225635
Train Epoch: 2 [42240/60000 (70%)]	Loss: 0.282973
Train Epoch: 2 [43200/60000 (72%)]	Loss: 0.142325
Train Epoch: 2 [44160/60000 (74%)]	Loss: 0.328438
Train Epoch: 2 [45120/60000 (75%)]	Loss: 0.609073
Train Epoch: 2 [46080/60000 (77%)]	Loss: 0.351565
Train Epoch: 2 [47040/60000 (78%)]	Loss: 0.292268
Train Epoch: 2 [48000/60000 (80%)]	Loss: 0.310604
Train Epoch: 2 [48960/60000 (82%)]	Loss: 0.170181
Train Epoch: 2 [49920/60000 (83%)]	Loss: 0.200295
Train Epoch: 2 [50880/60000 (85%)]	Loss: 0.219787
Train Epoch: 2 [51840/60000 (86%)]	Loss: 0.277616
Train Epoch: 2 [52800/60000 (88%)]	Loss: 0.297647
Train Epoch: 2 [53760/60000 (90%)]	Loss: 0.229242
Train Epoch: 2 [54720/60000 (91%)]	Loss: 0.313362
Train Epoch: 2 [55680/60000 (93%)]	Loss: 0.270400
Train Epoch: 2 [56640/60000 (94%)]	Loss: 0.061130
Train Epoch: 2 [57600/60000 (96%)]	Loss: 0.189340
Train Epoch: 2 [58560/60000 (98%)]	Loss: 0.263550
Train Epoch: 2 [59520/60000 (99%)]	Loss: 0.321810

Test set: Average loss: 0.0859, Accuracy: 9738/10000 (97%)

Train Epoch: 3 [0/60000 (0%)]	Loss: 0.302775
Train Epoch: 3 [960/60000 (2%)]	Loss: 0.240120
Train Epoch: 3 [1920/60000 (3%)]	Loss: 0.465725
Train Epoch: 3 [2880/60000 (5%)]	Loss: 0.026950
Train Epoch: 3 [3840/60000 (6%)]	Loss: 0.369019
Train Epoch: 3 [4800/60000 (8%)]	Loss: 0.145716
Train Epoch: 3 [5760/60000 (10%)]	Loss: 0.204446
Train Epoch: 3 [6720/60000 (11%)]	Loss: 0.062196
Train Epoch: 3 [7680/60000 (13%)]	Loss: 0.085274
Train Epoch: 3 [8640/60000 (14%)]	Loss: 0.184332
Train Epoch: 3 [9600/60000 (16%)]	Loss: 0.475533
Train Epoch: 3 [10560/60000 (18%)]	Loss: 0.248954
Train Epoch: 3 [11520/60000 (19%)]	Loss: 0.073763
Train Epoch: 3 [12480/60000 (21%)]	Loss: 0.328890
Train Epoch: 3 [13440/60000 (22%)]	Loss: 0.543661
Train Epoch: 3 [14400/60000 (24%)]	Loss: 0.233355
Train Epoch: 3 [15360/60000 (26%)]	Loss: 0.139484
Train Epoch: 3 [16320/60000 (27%)]	Loss: 0.442533
Train Epoch: 3 [17280/60000 (29%)]	Loss: 0.300676
Train Epoch: 3 [18240/60000 (30%)]	Loss: 0.823776
Train Epoch: 3 [19200/60000 (32%)]	Loss: 0.076787
Train Epoch: 3 [20160/60000 (34%)]	Loss: 0.099019
Train Epoch: 3 [21120/60000 (35%)]	Loss: 0.306013
Train Epoch: 3 [22080/60000 (37%)]	Loss: 0.611400
Train Epoch: 3 [23040/60000 (38%)]	Loss: 0.089003
Train Epoch: 3 [24000/60000 (40%)]	Loss: 0.245727
Train Epoch: 3 [24960/60000 (42%)]	Loss: 0.228465
Train Epoch: 3 [25920/60000 (43%)]	Loss: 0.248237
Train Epoch: 3 [26880/60000 (45%)]	Loss: 0.126115
Train Epoch: 3 [27840/60000 (46%)]	Loss: 0.217290
Train Epoch: 3 [28800/60000 (48%)]	Loss: 0.120077
Train Epoch: 3 [29760/60000 (50%)]	Loss: 0.105484
Train Epoch: 3 [30720/60000 (51%)]	Loss: 0.240541
Train Epoch: 3 [31680/60000 (53%)]	Loss: 0.223729
Train Epoch: 3 [32640/60000 (54%)]	Loss: 0.068497
Train Epoch: 3 [33600/60000 (56%)]	Loss: 0.112911
Train Epoch: 3 [34560/60000 (58%)]	Loss: 0.190478
Train Epoch: 3 [35520/60000 (59%)]	Loss: 0.169739
Train Epoch: 3 [36480/60000 (61%)]	Loss: 0.176765
Train Epoch: 3 [37440/60000 (62%)]	Loss: 0.271082
Train Epoch: 3 [38400/60000 (64%)]	Loss: 0.141968
Train Epoch: 3 [39360/60000 (66%)]	Loss: 0.483633
Train Epoch: 3 [40320/60000 (67%)]	Loss: 0.178564
Train Epoch: 3 [41280/60000 (69%)]	Loss: 0.393331
Train Epoch: 3 [42240/60000 (70%)]	Loss: 0.135823
Train Epoch: 3 [43200/60000 (72%)]	Loss: 0.109804
Train Epoch: 3 [44160/60000 (74%)]	Loss: 0.203419
Train Epoch: 3 [45120/60000 (75%)]	Loss: 0.110011
Train Epoch: 3 [46080/60000 (77%)]	Loss: 0.028858
Train Epoch: 3 [47040/60000 (78%)]	Loss: 0.151170
Train Epoch: 3 [48000/60000 (80%)]	Loss: 0.132253
Train Epoch: 3 [48960/60000 (82%)]	Loss: 0.266742
Train Epoch: 3 [49920/60000 (83%)]	Loss: 0.118250
Train Epoch: 3 [50880/60000 (85%)]	Loss: 0.132651
Train Epoch: 3 [51840/60000 (86%)]	Loss: 0.267680
Train Epoch: 3 [52800/60000 (88%)]	Loss: 0.418498
Train Epoch: 3 [53760/60000 (90%)]	Loss: 0.205899
Train Epoch: 3 [54720/60000 (91%)]	Loss: 0.625456
Train Epoch: 3 [55680/60000 (93%)]	Loss: 0.263379
Train Epoch: 3 [56640/60000 (94%)]	Loss: 0.196387
Train Epoch: 3 [57600/60000 (96%)]	Loss: 0.247170
Train Epoch: 3 [58560/60000 (98%)]	Loss: 0.273901
Train Epoch: 3 [59520/60000 (99%)]	Loss: 0.239714

Test set: Average loss: 0.0739, Accuracy: 9747/10000 (97%)


In [ ]: