@@ -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)) ) |
@@ -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)) ) |
@@ -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)) | |||||