eaglelandsonce commited on
Commit
54db127
·
verified ·
1 Parent(s): aef53dc

Create 11_FFNN.py

Browse files
Files changed (1) hide show
  1. pages/11_FFNN.py +107 -0
pages/11_FFNN.py ADDED
@@ -0,0 +1,107 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import streamlit as st
2
+ import torch
3
+ import torch.nn as nn
4
+ import torch.optim as optim
5
+ import torchvision
6
+ import torchvision.transforms as transforms
7
+ import matplotlib.pyplot as plt
8
+ import numpy as np
9
+
10
+ # Define the Feedforward Neural Network
11
+ class FeedforwardNeuralNetwork(nn.Module):
12
+ def __init__(self, input_size, hidden1_size, hidden2_size, hidden3_size, output_size):
13
+ super(FeedforwardNeuralNetwork, self).__init__()
14
+ self.fc1 = nn.Linear(input_size, hidden1_size)
15
+ self.fc2 = nn.Linear(hidden1_size, hidden2_size)
16
+ self.fc3 = nn.Linear(hidden2_size, hidden3_size)
17
+ self.fc4 = nn.Linear(hidden3_size, output_size)
18
+ self.relu = nn.ReLU()
19
+
20
+ def forward(self, x):
21
+ x = x.view(-1, 28 * 28)
22
+ x = self.relu(self.fc1(x))
23
+ x = self.relu(self.fc2(x))
24
+ x = self.relu(self.fc3(x))
25
+ x = self.fc4(x)
26
+ return x
27
+
28
+ # Function to load the data
29
+ @st.cache
30
+ def load_data():
31
+ transform = transforms.Compose([transforms.ToTensor(), transforms.Normalize((0.5,), (0.5,))])
32
+ trainset = torchvision.datasets.MNIST(root='./data', train=True, download=True, transform=transform)
33
+ testset = torchvision.datasets.MNIST(root='./data', train=False, download=True, transform=transform)
34
+ trainloader = torch.utils.data.DataLoader(trainset, batch_size=64, shuffle=True)
35
+ testloader = torch.utils.data.DataLoader(testset, batch_size=64, shuffle=False)
36
+ return trainloader, testloader
37
+
38
+ # Function to train the network
39
+ def train_network(net, trainloader, criterion, optimizer, epochs):
40
+ for epoch in range(epochs):
41
+ running_loss = 0.0
42
+ for i, data in enumerate(trainloader, 0):
43
+ inputs, labels = data
44
+ optimizer.zero_grad()
45
+ outputs = net(inputs)
46
+ loss = criterion(outputs, labels)
47
+ loss.backward()
48
+ optimizer.step()
49
+ running_loss += loss.item()
50
+ st.write(f'Epoch {epoch + 1}: loss {running_loss / len(trainloader):.3f}')
51
+ st.write('Finished Training')
52
+
53
+ # Function to test the network
54
+ def test_network(net, testloader):
55
+ correct = 0
56
+ total = 0
57
+ with torch.no_grad():
58
+ for data in testloader:
59
+ images, labels = data
60
+ outputs = net(images)
61
+ _, predicted = torch.max(outputs.data, 1)
62
+ total += labels.size(0)
63
+ correct += (predicted == labels).sum().item()
64
+ st.write(f'Accuracy of the network on the 10000 test images: {100 * correct / total:.2f}%')
65
+
66
+ # Load the data
67
+ trainloader, testloader = load_data()
68
+
69
+ # Streamlit sidebar for input parameters
70
+ st.sidebar.header('Model Hyperparameters')
71
+ input_size = st.sidebar.slider('Input Size', 784, 784, 784)
72
+ hidden1_size = st.sidebar.slider('Hidden Layer 1 Size', 128, 1024, 512)
73
+ hidden2_size = st.sidebar.slider('Hidden Layer 2 Size', 128, 1024, 256)
74
+ hidden3_size = st.sidebar.slider('Hidden Layer 3 Size', 128, 1024, 128)
75
+ output_size = st.sidebar.slider('Output Size', 10, 10, 10)
76
+ learning_rate = st.sidebar.slider('Learning Rate', 0.001, 0.1, 0.01, step=0.001)
77
+ momentum = st.sidebar.slider('Momentum', 0.0, 1.0, 0.9, step=0.1)
78
+ epochs = st.sidebar.slider('Epochs', 1, 20, 5)
79
+
80
+ # Create the network
81
+ net = FeedforwardNeuralNetwork(input_size, hidden1_size, hidden2_size, hidden3_size, output_size)
82
+ criterion = nn.CrossEntropyLoss()
83
+ optimizer = optim.SGD(net.parameters(), lr=learning_rate, momentum=momentum)
84
+
85
+ # Train the network
86
+ if st.sidebar.button('Train Network'):
87
+ train_network(net, trainloader, criterion, optimizer, epochs)
88
+
89
+ # Test the network
90
+ if st.sidebar.button('Test Network'):
91
+ test_network(net, testloader)
92
+
93
+ # Visualize some test results
94
+ def imshow(img):
95
+ img = img / 2 + 0.5 # unnormalize
96
+ npimg = img.numpy()
97
+ plt.imshow(np.transpose(npimg, (1, 2, 0)))
98
+ plt.show()
99
+
100
+ if st.sidebar.button('Show Test Results'):
101
+ dataiter = iter(testloader)
102
+ images, labels = dataiter.next()
103
+ imshow(torchvision.utils.make_grid(images))
104
+ st.write('GroundTruth: ', ' '.join(f'{labels[j]}' for j in range(8)))
105
+ outputs = net(images)
106
+ _, predicted = torch.max(outputs, 1)
107
+ st.write('Predicted: ', ' '.join(f'{predicted[j]}' for j in range(8)))