Browse Source

Add demo code of CNN Mnist

fetches/feikei/master
Shuhui Bu 6 years ago
parent
commit
eeb0ae9e25
4 changed files with 264 additions and 0 deletions
  1. +99
    -0
      demo_code/3_CNN_MNIST.py
  2. +99
    -0
      demo_code/3_CNN_MNIST_dropout.py
  3. +0
    -0
      demo_code/3_NN_FC_1.py
  4. +66
    -0
      demo_code/3_NN_FC_2.py

+ 99
- 0
demo_code/3_CNN_MNIST.py View File

@@ -0,0 +1,99 @@

import torch
import torch.nn as nn
import torch.nn.functional as F
from torch.autograd import Variable

from torchvision import datasets, transforms

# Training settings
batch_size = 64

# MNIST Dataset
dataset_path = "../data/mnist"
train_dataset = datasets.MNIST(root=dataset_path,
train=True,
transform=transforms.ToTensor(),
download=True)

test_dataset = datasets.MNIST(root=dataset_path,
train=False,
transform=transforms.ToTensor())

# Data Loader (Input Pipeline)
train_loader = torch.utils.data.DataLoader(dataset=train_dataset,
batch_size=batch_size,
shuffle=True)

test_loader = torch.utils.data.DataLoader(dataset=test_dataset,
batch_size=batch_size,
shuffle=False)


# Define the network
class Net_CNN(nn.Module):
def __init__(self):
super(Net_CNN, self).__init__()
self.conv1 = nn.Conv2d(1, 6, 5)
self.conv2 = nn.Conv2d(6, 16, 5)
self.fc1 = nn.Linear(16*4*4, 120)
self.fc2 = nn.Linear(120, 84)
self.fc3 = nn.Linear(84, 10)

def forward(self, x):
x = F.max_pool2d(F.relu(self.conv1(x)), (2, 2))
x = F.max_pool2d(F.relu(self.conv2(x)), 2)
x = x.view(x.size()[0], -1)
x = F.relu(self.fc1(x))
x = F.relu(self.fc2(x))
x = self.fc3(x)
return x


# define optimizer & criterion
model = Net_CNN()
optim = torch.optim.Adam(model.parameters(), 0.01)
criterion = nn.CrossEntropyLoss()


# train the network
for e in range(100):
# train
model.train()
for batch_idx, (data, target) in enumerate(train_loader):
data, target = Variable(data), Variable(target)

out = model(data)
loss = criterion(out, target)
optim.zero_grad()
loss.backward()
optim.step()

if batch_idx % 100 == 0:
pred = out.data.max(1, keepdim=True)[1]
c = float(pred.eq(target.data.view_as(pred)).cpu().sum() ) /out.size(0)

print("epoch: %5d, loss: %f, acc: %f" %
( e +1, loss.data[0], c))

# test
model.eval()

test_loss = 0.0
correct = 0.0
for data, target in test_loader:
data, target = Variable(data), Variable(target)
output = model(data)

# sum up batch loss
test_loss += criterion(output, target).data[0]

# get the index of the max
pred = output.data.max(1, keepdim=True)[1]
correct += float(pred.eq(target.data.view_as(pred)).cpu().sum())

test_loss /= len(test_loader.dataset)
print("\nTest set: Average loss: %.4f, Accuracy: %6d/%6d (%4.2f %%)\n" %
(test_loss,
correct, len(test_loader.dataset),
100.0*correct / len(test_loader.dataset)) )

+ 99
- 0
demo_code/3_CNN_MNIST_dropout.py View File

@@ -0,0 +1,99 @@

import torch
import torch.nn as nn
import torch.nn.functional as F
from torch.autograd import Variable

from torchvision import datasets, transforms

# Training settings
batch_size = 64

# MNIST Dataset
dataset_path = "../data/mnist"
train_dataset = datasets.MNIST(root=dataset_path,
train=True,
transform=transforms.ToTensor(),
download=True)

test_dataset = datasets.MNIST(root=dataset_path,
train=False,
transform=transforms.ToTensor())

# Data Loader (Input Pipeline)
train_loader = torch.utils.data.DataLoader(dataset=train_dataset,
batch_size=batch_size,
shuffle=True)

test_loader = torch.utils.data.DataLoader(dataset=test_dataset,
batch_size=batch_size,
shuffle=False)


# Define the network
class Net_CNN(nn.Module):
def __init__(self):
super(Net_CNN, self).__init__()
self.conv1 = nn.Conv2d(1, 6, 5)
self.conv2 = nn.Conv2d(6, 16, 5)
self.conv2_drop = nn.Dropout2d()
self.fc1 = nn.Linear(16*4*4, 120)
self.fc2 = nn.Linear(120, 10)

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


# define optimizer & criterion
model = Net_CNN()
optim = torch.optim.Adam(model.parameters(), 0.01)
criterion = nn.CrossEntropyLoss()


# train the network
for e in range(100):
# train
model.train()
for batch_idx, (data, target) in enumerate(train_loader):
data, target = Variable(data), Variable(target)

out = model(data)
loss = criterion(out, target)
optim.zero_grad()
loss.backward()
optim.step()

if batch_idx % 100 == 0:
pred = out.data.max(1, keepdim=True)[1]
c = float(pred.eq(target.data.view_as(pred)).cpu().sum() ) /out.size(0)

print("epoch: %5d, loss: %f, acc: %f" %
( e +1, loss.data[0], c))

# test
model.eval()

test_loss = 0.0
correct = 0.0
for data, target in test_loader:
data, target = Variable(data), Variable(target)
output = model(data)

# sum up batch loss
test_loss += criterion(output, target).data[0]

# get the index of the max
pred = output.data.max(1, keepdim=True)[1]
correct += float(pred.eq(target.data.view_as(pred)).cpu().sum())

test_loss /= len(test_loader.dataset)
print("\nTest set: Average loss: %.4f, Accuracy: %6d/%6d (%4.2f %%)\n" %
(test_loss,
correct, len(test_loader.dataset),
100.0*correct / len(test_loader.dataset)) )

demo_code/3_NN_FC.py → demo_code/3_NN_FC_1.py View File


+ 66
- 0
demo_code/3_NN_FC_2.py View File

@@ -0,0 +1,66 @@
import torch
import torch.nn as nn
import torch.nn.functional as F
import torch.optim as optim
from torch.autograd import Variable

from torchvision import datasets, transforms

# Training settings
batch_size = 64

# MNIST Dataset
dataset_path = "../data/mnist"
train_dataset = datasets.MNIST(root=dataset_path,
train=True,
transform=transforms.ToTensor(),
download=True)

test_dataset = datasets.MNIST(root=dataset_path,
train=False,
transform=transforms.ToTensor())

# Data Loader (Input Pipeline)
train_loader = torch.utils.data.DataLoader(dataset=train_dataset,
batch_size=batch_size,
shuffle=True)

test_loader = torch.utils.data.DataLoader(dataset=test_dataset,
batch_size=batch_size,
shuffle=False)


# define Network
seq_net = nn.Sequential(
nn.Linear(28*28, 300),
nn.ReLU(),
nn.Linear(300, 100),
nn.ReLU(),
nn.Linear(100, 10)
)

# define optimizer & criterion
param = seq_net.parameters()
optim = torch.optim.Adam(param, 0.01)
criterion = nn.CrossEntropyLoss()

# train the network
for e in range(100):
for batch_idx, (data, target) in enumerate(train_loader):
data, target = Variable(data), Variable(target)
data = data.view(-1, 784)

out = seq_net(data)
loss = criterion(out, target)
optim.zero_grad()
loss.backward()
optim.step()

if batch_idx % 100 == 0:
pred = out.data.max(1, keepdim=True)[1]
c = float(pred.eq(target.data.view_as(pred)).cpu().sum())/out.size(0)

print("epoch: %5d, loss: %f, acc: %f" %
(e+1, loss.data[0], c))


Loading…
Cancel
Save