-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathXNOR.py
More file actions
161 lines (119 loc) · 4.92 KB
/
XNOR.py
File metadata and controls
161 lines (119 loc) · 4.92 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
import numpy as np
import matplotlib.pyplot as plt
x = np.array(([0,0,0],[0,0,1],[0,1,0],[0,1,1],[1,0,0],[1,0,1],[1,1,0],[1,1,1]), dtype=float)
y = np.array(([0],[1],[1],[0],[1],[0],[0],[1]), dtype=float)
xPredicted = np.array(([0,0,1]), dtype=float)
# Fișier pentru salvarea valorilor de pierdere
lossFile = open("SumSquaredLossList.txt", "w")
class Neural_Network(object):
def __init__(self):
# Definirea arhitecturii rețelei
self.inputLayerSize = 3
self.outputLayerSize = 1
self.hiddenLayerSize = 4 # mărimea stratului ascuns
# Inițializarea ponderilor (weights) cu valori aleatorii
self.W1 = np.random.randn(self.inputLayerSize, self.hiddenLayerSize)
self.W2 = np.random.randn(self.hiddenLayerSize, self.outputLayerSize)
# Inițializarea listei pentru valorile de pierdere
self.lossList = []
def feedForward(self, X):
"""
Propagarea înainte a datelor prin rețea
Args:
X: Date de intrare
Returns:
Ieșirea rețelei
"""
# Calculul pentru primul strat ascuns
self.z = np.dot(X, self.W1)
self.z2 = self.activationSigmoid(self.z)
# Calculul pentru stratul de ieșire
self.z3 = np.dot(self.z2, self.W2)
output = self.activationSigmoid(self.z3)
return output
def backwardPropagate(self, X, y, output):
"""
Propagarea înapoi a erorii pentru actualizarea ponderilor
Args:
X: Date de intrare
y: Ieșiri așteptate
output: Ieșiri actuale
"""
# Calculul erorii la ieșire
self.o_error = y - output
# Calculul delta pentru stratul de ieșire
self.o_delta = self.o_error * self.activationSigmoidPrime(output)
# Propagarea erorii către stratul ascuns
self.z2_error = self.o_delta.dot(self.W2.T)
# Calculul delta pentru stratul ascuns
self.z2_delta = self.z2_error * self.activationSigmoidPrime(self.z2)
# Actualizarea ponderilor
self.W1 += X.T.dot(self.z2_delta)
self.W2 += self.z2.T.dot(self.o_delta)
def trainNetwork(self, X, y):
"""
Antrenarea rețelei neuronale
Args:
X: Date de intrare
y: Ieșiri așteptate
"""
# Propagarea înainte
output = self.feedForward(X)
# Calculul funcției de pierdere (loss function)
self.loss = self.lossFunction(y, output)
self.lossList.append(self.loss)
# Propagarea înapoi
self.backwardPropagate(X, y, output)
def lossFunction(self, y, output):
"""
Funcția de pierdere - eroarea medie pătratică
Args:
y: Ieșiri așteptate
output: Ieșiri actuale
Returns:
Valoarea pierderii
"""
return np.mean(np.square(y - output))
def activationSigmoid(self, s):
return 1 / (1 + np.exp(-s))
def activationSigmoidPrime(self, s):
return s * (1 - s)
def saveSumSquaredLossList(self, i, error):
lossFile.write(str(i) + "," + str(error) + '\n')
def saveWeights(self):
np.savetxt("weightsLayer1.txt", self.W1, fmt="%s")
np.savetxt("weightsLayer2.txt", self.W2, fmt="%s")
def predictOutput(self):
print("Predicted data based on trained weights: ")
print("Input (scaled): \n" + str(xPredicted))
print("Output: \n" + str(self.feedForward(xPredicted)))
# Crearea și antrenarea rețelei neuronale
myNeuralNetwork = Neural_Network()
trainingEpochs = 1000
# Bucla de antrenare
for i in range(trainingEpochs):
if i % 100 == 0: # Afișăm informații doar la fiecare 100 de epoci pentru a reduce output-ul
print("Epoch: " + str(i))
print("Input: \n" + str(x))
print("Expected Output: \n" + str(y))
print("Actual Output: \n" + str(myNeuralNetwork.feedForward(x)))
loss = myNeuralNetwork.lossFunction(y, myNeuralNetwork.feedForward(x))
myNeuralNetwork.saveSumSquaredLossList(i, loss)
print("Sum Squared Loss: \n" + str(loss))
print("\n")
# Antrenarea rețelei
myNeuralNetwork.trainNetwork(x, y)
# Salvarea ponderilor și afișarea predicției
myNeuralNetwork.saveWeights()
myNeuralNetwork.predictOutput()
# Vizualizarea evoluției pierderii
plt.figure(figsize=(10, 6))
plt.plot(myNeuralNetwork.lossList)
plt.title('Evoluția funcției de pierdere')
plt.xlabel('Epocă')
plt.ylabel('Pierdere')
plt.grid(True)
plt.savefig('loss_evolution.png')
plt.show()
# Închiderea fișierului
lossFile.close()