-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathANN.py
More file actions
161 lines (117 loc) · 5.25 KB
/
Copy pathANN.py
File metadata and controls
161 lines (117 loc) · 5.25 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
# -*- coding: utf-8 -*-
"""
Created on Thu Nov 13 07:55:48 2025
@author: asus
"""
import os
os.environ["KMP_DUPLICATE_LIB_OK"] = "True"
import torch #pytorch library for tensors
import torch.nn as nn #artificial neural network layers description
import torch.optim as optim #optimization algorithms modul
import torchvision#computer vision and pretrained models
import torchvision.transforms as transforms#vision transfroms
import matplotlib.pyplot as plt
#optional:device
device=torch.device("cuda" if torch.cuda.is_available() else "cpu")
def get_data_loader(batch_size=64):
transform=transforms.Compose([
transforms.ToTensor(),#scaling(standardization)
#transforms.Normalize((0.5,), (0.5,)) #pixel value is scaled between -1 & 1
])
#mnist dataset from pytorch
train_set=torchvision.datasets.MNIST(root="./data",train=True,download=True,transform=transform)
test_set=torchvision.datasets.MNIST(root="./data",train=False,download=True,transform=transform)
#create pytorch data loader
train_loader=torch.utils.data.DataLoader(train_set,batch_size=batch_size,shuffle=True)
test_loader=torch.utils.data.DataLoader(test_set,batch_size=batch_size,shuffle=False)
return train_loader,test_loader
#train_loader,test_loader=get_data_loader()
#data visualization
def visualize_samples(loader,n):
images,labels=next(iter(loader))
print(images[0].shape)
fig,axes=plt.subplots(1,n,figsize=(10,5))
for i in range(n):
axes[i].imshow(images[i].squeeze(),cmap="gray")
axes[i].set_title(f"label:{labels[i].item()}")
axes[i].axis("off")
plt.show()
#visualize_samples(train_loader,4)
#define ann model
class NeuralNetwork(nn.Module):#inheritance from pytorch nn.module class
def __init__(self):#build nn
super(NeuralNetwork,self).__init__()
#vectorization (1D)
self.flatten=nn.Flatten()
#first fully connected layer
self.fcl1=nn.Linear(28*28,128)#784=input size,128=output size
#activation fonks
self.relu=nn.ReLU()
#second fully connected layer
self.fcl2=nn.Linear(128,64)#128=input size, 64=output size
self.fcl3=nn.Linear(64,10)#output layer 64=input size ,10=output size we are classing data 10 class
def forward(self,x):#forward propagation,x=image
#initial x=28*28=flatten 784
x=self.flatten(x)
x=self.fcl1(x)
x=self.relu(x)
x=self.fcl2(x)
x=self.relu(x)
x=self.fcl3(x)
return x
#create model and compile
#model=NeuralNetwork().to(device)
#loss function and optimization algorithms
define_loss_and_optim=lambda model:(
nn.CrossEntropyLoss(),#multi clas calssification problem loss function
optim.Adam(model.parameters(),lr=0.001)#update weights with adam
)
#criterion,optimizer=define_loss_and_optim(model)
#training
def train_model(model,train_loader,criterion,optimizer,epochs=10):
model.train() #mode training
train_losses=[]#result for per epoch to save loss value
for epoch in range(epochs):#training
total_loss=0#total loss
for images,labels in train_loader:#iteration
images,labels=images.to(device),labels.to(device)#data is moved to device
optimizer.zero_grad()#get zero gradiant
predictions=model(images)#appyl model,forward propogation,
loss=criterion(predictions,labels)#loss calculating->y predction -y real
loss.backward()#backward propogation new gradiant calculating
optimizer.step()#update weights
total_loss=total_loss+loss.item()
avg_loss=total_loss/len(train_loader)#avarage loss
train_losses.append(avg_loss)
print(f"Epoch {epoch+1}/{epochs},loss:{avg_loss:.3f}")
#loss graph
plt.figure()
plt.plot(range(1,epochs+1),train_losses,marker="x",linestyle="-",label="Train Losss")
plt.xlabel("Epochs")
plt.ylabel("loss")
plt.title("Training Loss")
plt.legend()
plt.show()
#train_model(model,train_loader,criterion,optimizer,epochs=5)
#%%test
def test_model(model,test_loader):
model.eval()
correct=0
total=0#total data calculater
with torch.no_grad():#gradiant calculating is unnecessary becuse this is test step
for images,labels in test_loader:
images,labels=images.to(device),labels.to(device)
predictions=model(images)
_,predicted=torch.max(predictions,1)#find highest probability calss label
total+=labels.size(0)#update total data
correct+=(predicted==labels).sum().item()#calcualte correct pred
print(f"Test accuracy:{100*correct/total:.3f}%")
#test_model(model,test_loader)
#%%
if __name__=="__main__":
train_loader,test_loader=get_data_loader()
visualize_samples(train_loader,5)
model=NeuralNetwork().to(device)
criterion,optimizer=define_loss_and_optim(model)
train_model(model,train_loader,criterion,optimizer)
test_model(model,test_loader)