Feedforward Neural Networks (FNN) – Deep Learning Wizard
import
torch
import
torch.nn
as
nn
import
torchvision.transforms
as
transforms
import
torchvision.datasets
as
dsets
'''
STEP 1: LOADING DATASET
'''
train_dataset
=
dsets
.
MNIST
(
root
=
'./data'
,
train
=
True
,
transform
=
transforms
.
ToTensor
(),
download
=
True
)
test_dataset
=
dsets
.
MNIST
(
root
=
'./data'
,
train
=
False
,
transform
=
transforms
.
ToTensor
())
'''
STEP 2: MAKING DATASET ITERABLE
'''
batch_size
=
100
n_iters
=
3000
num_epochs
=
n_iters
/
(
len
(
train_dataset
)
/
batch_size
)
num_epochs
=
int
(
num_epochs
)
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
)
'''
STEP 3: CREATE MODEL CLASS
'''
class
FeedforwardNeuralNetModel
(
nn
.
Module
):
def
__init__
(
self
,
input_dim
,
hidden_dim
,
output_dim
):
super
(
FeedforwardNeuralNetModel
,
self
)
.
__init__
()
# Linear function 1: 784 --> 100
self
.
fc1
=
nn
.
Linear
(
input_dim
,
hidden_dim
)
# Non-linearity 1
self
.
relu1
=
nn
.
ReLU
()
# Linear function 2: 100 --> 100
self
.
fc2
=
nn
.
Linear
(
hidden_dim
,
hidden_dim
)
# Non-linearity 2
self
.
relu2
=
nn
.
ReLU
()
# Linear function 3: 100 --> 100
self
.
fc3
=
nn
.
Linear
(
hidden_dim
,
hidden_dim
)
# Non-linearity 3
self
.
relu3
=
nn
.
ReLU
()
# Linear function 4 (readout): 100 --> 10
self
.
fc4
=
nn
.
Linear
(
hidden_dim
,
output_dim
)
def
forward
(
self
,
x
):
# Linear function 1
out
=
self
.
fc1
(
x
)
# Non-linearity 1
out
=
self
.
relu1
(
out
)
# Linear function 2
out
=
self
.
fc2
(
out
)
# Non-linearity 2
out
=
self
.
relu2
(
out
)
# Linear function 2
out
=
self
.
fc3
(
out
)
# Non-linearity 2
out
=
self
.
relu3
(
out
)
# Linear function 4 (readout)
out
=
self
.
fc4
(
out
)
return
out
'''
STEP 4: INSTANTIATE MODEL CLASS
'''
input_dim
=
28
*
28
hidden_dim
=
100
output_dim
=
10
model
=
FeedforwardNeuralNetModel
(
input_dim
,
hidden_dim
,
output_dim
)
#######################
# USE GPU FOR MODEL #
#######################
device
=
torch
.
device
(
"cuda:0"
if
torch
.
cuda
.
is_available
()
else
"cpu"
)
model
.
to
(
device
)
'''
STEP 5: INSTANTIATE LOSS CLASS
'''
criterion
=
nn
.
CrossEntropyLoss
()
'''
STEP 6: INSTANTIATE OPTIMIZER CLASS
'''
learning_rate
=
0.1
optimizer
=
torch
.
optim
.
SGD
(
model
.
parameters
(),
lr
=
learning_rate
)
'''
STEP 7: TRAIN THE MODEL
'''
iter
=
0
for
epoch
in
range
(
num_epochs
):
for
i
,
(
images
,
labels
)
in
enumerate
(
train_loader
):
#######################
# USE GPU FOR MODEL #
#######################
images
=
images
.
view
(
-
1
,
28
*
28
)
.
requires_grad_
()
.
to
(
device
)
labels
=
labels
.
to
(
device
)
# Clear gradients w.r.t. parameters
optimizer
.
zero_grad
()
# Forward pass to get output/logits
outputs
=
model
(
images
)
# Calculate Loss: softmax --> cross entropy loss
loss
=
criterion
(
outputs
,
labels
)
# Getting gradients w.r.t. parameters
loss
.
backward
()
# Updating parameters
optimizer
.
step
()
iter
+=
1
if
iter
%
500
==
0
:
# Calculate Accuracy
correct
=
0
total
=
0
# Iterate through test dataset
for
images
,
labels
in
test_loader
:
#######################
# USE GPU FOR MODEL #
#######################
images
=
images
.
view
(
-
1
,
28
*
28
)
.
requires_grad_
()
.
to
(
device
)
# Forward pass only to get logits/output
outputs
=
model
(
images
)
# Get predictions from the maximum value
_
,
predicted
=
torch
.
max
(
outputs
.
data
,
1
)
# Total number of labels
total
+=
labels
.
size
(
0
)
#######################
# USE GPU FOR MODEL #
#######################
# Total correct predictions
if
torch
.
cuda
.
is_available
():
correct
+=
(
predicted
.
cpu
()
==
labels
.
cpu
())
.
sum
()
else
:
correct
+=
(
predicted
==
labels
)
.
sum
()
accuracy
=
100
*
correct
/
total
# Print Loss
print
(
'Iteration:
{}
. Loss:
{}
. Accuracy:
{}
'
.
format
(
iter
,
loss
.
item
(),
accuracy
))