Skip to content

Commit 8748f63

Browse files
committed
Initial Commit
0 parents  commit 8748f63

File tree

2 files changed

+178
-0
lines changed

2 files changed

+178
-0
lines changed

README.md

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
# ModelChimp: Pytorch Example
2+
3+
This repository contains example code of using ModelChimp with pytorch Framework
4+
5+
6+
7+
## ModelChimp Installation
8+
9+
10+
```shell
11+
pip3 install modelchimp
12+
```
13+
14+
Its assumed that pytorch is already installed
15+
16+
17+
## Define the project
18+
19+
Create the project in modelchimp and copy the project key to the code in main.py
20+
21+
![alt text](https://www.modelchimp.com/assets/img/docs/doc_project_definition.png )
22+
![alt text](https://www.modelchimp.com/assets/img/docs/doc_project_key.png )
23+
24+
```python
25+
tracker = Tracker('<PROJECT KEY>', host='demo.modelchimp.com', experiment_name='MNIST Classification') #MODELCHIMP
26+
```
27+
28+
## Execute the code
29+
Execute the code with the following command
30+
31+
```bash
32+
python3 main.py
33+
```

main.py

Lines changed: 145 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,145 @@
1+
2+
3+
from __future__ import print_function
4+
# MODELCHIMP tracker
5+
from modelchimp import Tracker
6+
7+
import argparse
8+
import torch
9+
import torch.nn as nn
10+
import torch.nn.functional as F
11+
import torch.optim as optim
12+
from torchvision import datasets, transforms
13+
14+
class Net(nn.Module):
15+
def __init__(self):
16+
super(Net, self).__init__()
17+
self.conv1 = nn.Conv2d(1, 10, kernel_size=5)
18+
self.conv2 = nn.Conv2d(10, 20, kernel_size=5)
19+
self.conv2_drop = nn.Dropout2d()
20+
self.fc1 = nn.Linear(320, 50)
21+
self.fc2 = nn.Linear(50, 10)
22+
23+
def forward(self, x):
24+
x = F.relu(F.max_pool2d(self.conv1(x), 2))
25+
x = F.relu(F.max_pool2d(self.conv2_drop(self.conv2(x)), 2))
26+
x = x.view(-1, 320)
27+
x = F.relu(self.fc1(x))
28+
x = F.dropout(x, training=self.training)
29+
x = self.fc2(x)
30+
return F.log_softmax(x, dim=1)
31+
32+
def train(args, model, device, train_loader, optimizer, epoch):
33+
model.train()
34+
train_loss = 0
35+
correct = 0
36+
37+
for batch_idx, (data, target) in enumerate(train_loader):
38+
data, target = data.to(device), target.to(device)
39+
optimizer.zero_grad()
40+
output = model(data)
41+
loss = F.nll_loss(output, target)
42+
train_loss += F.nll_loss(output, target, reduction='sum').item()
43+
loss.backward()
44+
optimizer.step()
45+
if batch_idx % args.log_interval == 0:
46+
print('Train Epoch: {} [{}/{} ({:.0f}%)]\tLoss: {:.6f}'.format(
47+
epoch, batch_idx * len(data), len(train_loader.dataset),
48+
100. * batch_idx / len(train_loader), loss.item()))
49+
pred = output.max(1, keepdim=True)[1] # get the index of the max log-probability
50+
correct += pred.eq(target.view_as(pred)).sum().item()
51+
52+
train_loss /= len(train_loader.dataset)
53+
accuracy = correct / len(train_loader.dataset)
54+
55+
return {
56+
'train_loss': train_loss,
57+
'train_accuracy': accuracy
58+
}
59+
60+
61+
def test(args, model, device, test_loader):
62+
model.eval()
63+
test_loss = 0
64+
correct = 0
65+
with torch.no_grad():
66+
for data, target in test_loader:
67+
data, target = data.to(device), target.to(device)
68+
output = model(data)
69+
test_loss += F.nll_loss(output, target, reduction='sum').item() # sum up batch loss
70+
pred = output.max(1, keepdim=True)[1] # get the index of the max log-probability
71+
correct += pred.eq(target.view_as(pred)).sum().item()
72+
73+
test_loss /= len(test_loader.dataset)
74+
accuracy = correct / len(test_loader.dataset)
75+
76+
print('\nTest set: Average loss: {:.4f}, Accuracy: {}/{} ({:.0f}%)\n'.format(
77+
test_loss, correct, len(test_loader.dataset),
78+
100. * correct / len(test_loader.dataset)))
79+
80+
return {
81+
'test_loss': test_loss,
82+
'test_accuracy': accuracy
83+
}
84+
85+
def main():
86+
# Training settings
87+
parser = argparse.ArgumentParser(description='PyTorch MNIST Example')
88+
parser.add_argument('--batch-size', type=int, default=64, metavar='N',
89+
help='input batch size for training (default: 64)')
90+
parser.add_argument('--test-batch-size', type=int, default=1000, metavar='N',
91+
help='input batch size for testing (default: 1000)')
92+
parser.add_argument('--epochs', type=int, default=10, metavar='N',
93+
help='number of epochs to train (default: 10)')
94+
parser.add_argument('--lr', type=float, default=0.01, metavar='LR',
95+
help='learning rate (default: 0.01)')
96+
parser.add_argument('--momentum', type=float, default=0.5, metavar='M',
97+
help='SGD momentum (default: 0.5)')
98+
parser.add_argument('--no-cuda', action='store_true', default=False,
99+
help='disables CUDA training')
100+
parser.add_argument('--seed', type=int, default=1, metavar='S',
101+
help='random seed (default: 1)')
102+
parser.add_argument('--log-interval', type=int, default=10, metavar='N',
103+
help='how many batches to wait before logging training status')
104+
args = parser.parse_args()
105+
use_cuda = not args.no_cuda and torch.cuda.is_available()
106+
param = args.__dict__
107+
108+
torch.manual_seed(args.seed)
109+
110+
# MODELCHIMP Tracker
111+
tracker = Tracker('<PROJECT KEY>', host='demo.modelchimp.com', experiment_name='MNIST Classification')
112+
tracker.add_multiple_params(param)
113+
114+
device = torch.device("cuda" if use_cuda else "cpu")
115+
116+
kwargs = {'num_workers': 1, 'pin_memory': True} if use_cuda else {}
117+
train_loader = torch.utils.data.DataLoader(
118+
datasets.MNIST('../data', train=True, download=True,
119+
transform=transforms.Compose([
120+
transforms.ToTensor(),
121+
transforms.Normalize((0.1307,), (0.3081,))
122+
])),
123+
batch_size=args.batch_size, shuffle=True, **kwargs)
124+
test_loader = torch.utils.data.DataLoader(
125+
datasets.MNIST('../data', train=False, transform=transforms.Compose([
126+
transforms.ToTensor(),
127+
transforms.Normalize((0.1307,), (0.3081,))
128+
])),
129+
batch_size=args.test_batch_size, shuffle=True, **kwargs)
130+
131+
132+
model = Net().to(device)
133+
optimizer = optim.SGD(model.parameters(), lr=args.lr, momentum=args.momentum)
134+
135+
for epoch in range(1, args.epochs + 1):
136+
train_metric = train(args, model, device, train_loader, optimizer, epoch)
137+
test_metric = test(args, model, device, test_loader)
138+
139+
# MODELCHIMP Tracker
140+
tracker.add_multiple_metrics(train_metric, epoch=epoch)
141+
tracker.add_multiple_metrics(test_metric, epoch=epoch)
142+
143+
144+
if __name__ == '__main__':
145+
main()

0 commit comments

Comments
 (0)