hkanumilli commited on
Commit
aaa317a
·
1 Parent(s): 2855b15

updating network architecture

Browse files
Files changed (5) hide show
  1. MNISTModel_97.pth +3 -0
  2. MNISTModel_98.pth +3 -0
  3. app.py +5 -5
  4. neural_network.py +36 -33
  5. train_model.py +86 -0
MNISTModel_97.pth ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:e8f6e5ce379e6857ca016fdc51f17e2b87926295a02e9f980bd214bd7a82e320
3
+ size 1745671
MNISTModel_98.pth ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:097d546bb4f0432bd9310f9228edb7d7304b6ecde70b2de66ae9a76ae9ecd034
3
+ size 1690063
app.py CHANGED
@@ -6,20 +6,20 @@ from neural_network import MNISTNetwork
6
 
7
  transform = transforms.Compose([
8
  transforms.ToTensor(), # Convert image to tensor
9
- transforms.Normalize((0.1307,), (0.3081,)) # Normalize the image
10
  ])
11
 
12
  # Load the trained model
13
- net = MNISTNetwork()
14
- net.load_state_dict(torch.load('mnist_net.pth'))
15
  LABELS = ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9']
16
 
17
  def predict(drawing):
18
  if drawing is None:
19
- return "Draw something hoe"
20
 
21
  input_tensor = transform(drawing)
22
- x = input_tensor.view(input_tensor.shape[0], -1)
 
23
 
24
  with torch.no_grad():
25
  output = net(x)
 
6
 
7
  transform = transforms.Compose([
8
  transforms.ToTensor(), # Convert image to tensor
9
+ transforms.Normalize((0.5,), (0.5,)) # Normalize the image
10
  ])
11
 
12
  # Load the trained model
13
+ net = torch.load('MNISTModel_98.pth')
 
14
  LABELS = ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9']
15
 
16
  def predict(drawing):
17
  if drawing is None:
18
+ return "Draw a number hoe"
19
 
20
  input_tensor = transform(drawing)
21
+ x = input_tensor
22
+ # x = input_tensor.view(input_tensor.shape[0], -1)
23
 
24
  with torch.no_grad():
25
  output = net(x)
neural_network.py CHANGED
@@ -1,39 +1,42 @@
1
- import torch.nn as nn
2
- import torch.nn.functional as F
 
3
 
4
- class MNISTNetwork(nn.Module):
 
 
 
 
 
 
 
 
5
 
6
- def __init__(self):
 
 
 
 
 
 
 
 
 
 
 
7
  super().__init__()
8
- self.layer1 = nn.Linear(784, 128)
9
- self.layer2 = nn.Linear(128, 64)
10
- self.layer3 = nn.Linear(64, 32)
11
- self.layer4 = nn.Linear(32, 10)
12
-
13
  def forward(self, x):
14
- x = F.relu(self.layer1(x))
15
- x = F.relu(self.layer2(x))
16
- x = F.relu(self.layer3(x))
17
- x = self.layer4(x)
 
 
 
18
  return F.log_softmax(x, dim=1)
19
 
20
-
21
-
22
- # class MNISTNetwork(nn.Module):
23
- # def __init__(self):
24
- # super().__init__()
25
- # self.conv1 = nn.Conv2d(1, 32, kernel_size=5, padding=2)
26
- # self.conv2 = nn.Conv2d(32, 64, kernel_size=5, padding=2)
27
- # self.fc1 = nn.Linear(64*7*7, 1024)
28
- # self.fc2 = nn.Linear(1024, 10)
29
-
30
- # def forward(self, x):
31
- # x = nn.functional.relu(self.conv1(x))
32
- # x = nn.functional.max_pool2d(x, 2)
33
- # x = nn.functional.relu(self.conv2(x))
34
- # x = nn.functional.max_pool2d(x, 2)
35
- # x = x.view(-1, 64*7*7)
36
- # x = nn.functional.relu(self.fc1(x))
37
- # x = nn.functional.dropout(x, training=self.training)
38
- # x = self.fc2(x)
39
- # return nn.functional.log_softmax(x, dim=1)
 
1
+ import torch
2
+ import torch.nn as nn
3
+ import torch.nn.functional as F
4
 
5
+ # class MNISTNetwork(nn.Module):
6
+ # # achieved 97 percent accuracy
7
+ # def __init__(self):
8
+ # super().__init__()
9
+ # self.layer1 = nn.Linear(784, 400)
10
+ # self.layer2 = nn.Linear(400, 256)
11
+ # self.layer3 = nn.Linear(256, 64)
12
+ # self.layer4 = nn.Linear(64, 32)
13
+ # self.layer5 = nn.Linear(32, 10)
14
 
15
+ # def forward(self, x):
16
+ # x = x.view(-1, 28*28)
17
+ # x = torch.relu(self.layer1(x))
18
+ # x = torch.relu(self.layer2(x))
19
+ # x = torch.relu(self.layer3(x))
20
+ # x = torch.relu(self.layer4(x))
21
+ # x = torch.relu(self.layer5(x))
22
+ # return F.log_softmax(x, dim=1)
23
+
24
+ class MNISTNetwork(nn.Module):
25
+ # achieved 98.76 percent accuracy
26
+ def __init__(self):
27
  super().__init__()
28
+ self.conv1 = nn.Conv2d(1, 32, kernel_size=3, padding=1)
29
+ self.conv2 = nn.Conv2d(32, 64, kernel_size=3, padding=1)
30
+ self.fc1 = nn.Linear(64*7*7, 128)
31
+ self.fc2 = nn.Linear(128, 10)
32
+
33
  def forward(self, x):
34
+ x = F.relu(self.conv1(x))
35
+ x = F.max_pool2d(x, 2)
36
+ x = F.relu(self.conv2(x))
37
+ x = F.max_pool2d(x, 2)
38
+ x = x.view(-1, 64*7*7)
39
+ x = F.relu(self.fc1(x))
40
+ x = self.fc2(x)
41
  return F.log_softmax(x, dim=1)
42
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
train_model.py ADDED
@@ -0,0 +1,86 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import torch
2
+ import torchvision
3
+ import multiprocessing, prettytable
4
+ import torchvision.transforms as transforms
5
+ from neural_network import MNISTNetwork
6
+
7
+
8
+ # hyperparameters
9
+ BATCH_SIZE = 64
10
+ NUM_WORKERS = 2
11
+ EPOCH = 12
12
+ LEARNING_RATE = 0.01
13
+ MOMENTUM = 0.5
14
+ LOSS = torch.nn.CrossEntropyLoss()
15
+
16
+
17
+ ## Step 1: define our transforms
18
+ transform = transforms.Compose(
19
+ [
20
+ transforms.ToTensor(),
21
+ transforms.Normalize((0.5), (0.5))
22
+ ]
23
+ )
24
+
25
+ ## Step 2: get our datasets
26
+ full_ds = torchvision.datasets.MNIST(root='./data', train=True, download=False, transform=transform)
27
+ train_ds, valid_ds = torch.utils.data.random_split(full_ds, [50000, 10000])
28
+ test_ds = torchvision.datasets.MNIST(root='./data', train=False, download=False, transform=transform)
29
+
30
+ ## Step 3: create our dataloaders
31
+ train_dl = torch.utils.data.DataLoader(train_ds, num_workers=NUM_WORKERS, shuffle=True, batch_size=BATCH_SIZE)
32
+ valid_dl = torch.utils.data.DataLoader(valid_ds, num_workers=NUM_WORKERS, shuffle=False, batch_size=BATCH_SIZE)
33
+ test_dl = torch.utils.data.DataLoader(test_ds, num_workers=NUM_WORKERS, shuffle=False, batch_size=BATCH_SIZE)
34
+
35
+ ## Step 4: define our model and optimizer
36
+ model = MNISTNetwork()
37
+ criteron = LOSS # define our loss function
38
+ optimizer = torch.optim.SGD(model.parameters(), lr=LEARNING_RATE, momentum=MOMENTUM)
39
+
40
+ ## define our table
41
+ table = prettytable.PrettyTable()
42
+ table.field_names = ['Epoch', 'Training Loss', 'Validation Accuracy']
43
+
44
+ if __name__ == "__main__":
45
+ multiprocessing.freeze_support()
46
+ ## begin training process
47
+ for e in range(EPOCH):
48
+ model.train()
49
+ running_loss = 0.0
50
+ for inputs, labels in train_dl:
51
+ optimizer.zero_grad()
52
+ outputs = model(inputs)
53
+ loss = criteron(outputs, labels)
54
+ loss.backward()
55
+ optimizer.step()
56
+ running_loss += loss.item()
57
+ train_loss = round(running_loss/len(train_dl), 4)
58
+
59
+ # evaluate on the test set
60
+ model.eval()
61
+ with torch.no_grad():
62
+ total, correct = 0, 0
63
+ for inputs, labels in valid_dl:
64
+ outputs = model(inputs)
65
+ _, predicted = torch.max(outputs.data, 1)
66
+ total += labels.size(0)
67
+ correct += (predicted == labels).sum().item()
68
+ val_acc = round((correct/total)*100, 3)
69
+ table.add_row([e, train_loss, val_acc])
70
+ print(f'Training Loss: {train_loss}, Validation Accuracy: {val_acc}')
71
+
72
+ print(table)
73
+ # evaluate on test set
74
+ model.eval()
75
+ with torch.no_grad():
76
+ total, correct = 0, 0
77
+ for inputs, labels in test_dl:
78
+ outputs = model(inputs)
79
+ _, predicted = torch.max(outputs.data, 1)
80
+ total += labels.size(0)
81
+ correct += (predicted == labels).sum().item()
82
+ test_acc = round((correct/total)*100, 3)
83
+
84
+ print(f'Test Accuracy: {test_acc}')
85
+ torch.save(model, 'MNISTModel.pth')
86
+