From e3de4766c94af18551a5375c3af257b71121aa0a Mon Sep 17 00:00:00 2001 From: mirimatcode Date: Wed, 22 Jan 2025 18:35:02 +0100 Subject: [PATCH] funziona and e or solo se metto bias < -1 in uno dei percettroni input --- hidden_layer.py => multi_layer.py | 33 +++++++++++-------------------- percettrone.py | 13 ++---------- single_layer.py | 5 +++-- tempCodeRunnerFile.py | 3 +++ 4 files changed, 19 insertions(+), 35 deletions(-) rename hidden_layer.py => multi_layer.py (72%) create mode 100644 tempCodeRunnerFile.py diff --git a/hidden_layer.py b/multi_layer.py similarity index 72% rename from hidden_layer.py rename to multi_layer.py index 18bd7f8..e5014c7 100644 --- a/hidden_layer.py +++ b/multi_layer.py @@ -3,15 +3,16 @@ from percettrone import Percettrone # rete neurale x = [(0,0),(0,1),(1,0),(1,1)] # Combinazioni #output = (0,1,1,0) # XOR Logico -output = (0,0,0,1) # AND Logico +#output = (0,0,0,1) # AND Logico +output = (0,1,1,1) # OR Logico corrette = 0 -#pin_est_1 = Percettrone(bias=-0.5) -#pin_est_2 = Percettrone(bias=-1.5) -#pinout = Percettrone(bias=-1) -pin_est_1 = Percettrone(w1=0.3, w2=4, bias=0.5) -pin_est_2 = Percettrone(w1=0.2, w2=4, bias=-0.5) -pinout = Percettrone(w1=0.3, w2=2, bias=0) +pin_est_1 = Percettrone(bias=0) +pin_est_2 = Percettrone(bias=-1.5) +pinout = Percettrone(bias=0) +""" pin_est_1 = Percettrone(w1=0.3, w2=4, bias=-0.5) +pin_est_2 = Percettrone(w1=0.2, w2=4, bias=-1.5) +pinout = Percettrone(w1=0.3, w2=2, bias=-1) """ def stampa_operazione(p, y, x1, x2, isFinal, errore = 0): if isFinal == 0: @@ -44,7 +45,7 @@ def stampa_risultati_multilayer(): print("Percettrone OUT:") print(f"\t W1: {pinout.w1}, W2: {pinout.w2}, bias: {pinout.bias}") -for i in range(1,10000): #Epoche +for i in range(1,100000): #Epoche if corrette == 4: print(f"Epoche necessarie: {i-1}") @@ -58,29 +59,17 @@ for i in range(1,10000): #Epoche print("\n") y_est_1 = pin_est_1.funzione_gradino(x[j][0], x[j][1]) y_est_2 = pin_est_2.funzione_gradino(x[j][0], x[j][1]) - - #y_int_1 = pin_int_1.funzione_gradino(y_est_1, y_est_2) - #y_int_2 = pin_int_2.funzione_gradino(y_est_1, y_est_2) - yout = pinout.funzione_gradino(y_est_1, y_est_2) - errore = pinout.valuta(y_est_1, y_est_2, output[j]) + + errore = output[j] - yout stampa_operazione(pin_est_1, y_est_1, x[j][0], x[j][1], 0) - #stampa_operazione(pin_int_1, y_int_1, y_est_1, y_est_2, 1) stampa_operazione(pinout, yout, y_est_1, y_est_2, 2, errore) - #stampa_operazione(pin_int_2, y_int_2, y_est_1, y_est_2, 1) stampa_operazione(pin_est_2, y_est_2, x[j][0], x[j][1], 0) if errore != 0: - #if y_est_1 != output[j]: pin_est_1.correggi_pesi(x[j][0], x[j][1], errore) - #if y_est_2 != output[j]: pin_est_2.correggi_pesi(x[j][0], x[j][1], errore) - #if y_int_1 != output[j]: - #pin_int_1.correggi_pesi(y_est_1, y_est_2, errore) - #if y_int_2 != output[j]: - #pin_int_2.correggi_pesi(y_est_1, y_est_2, errore) - pinout.correggi_pesi(y_est_1, y_est_2, errore) else: corrette += 1 \ No newline at end of file diff --git a/percettrone.py b/percettrone.py index 3c2e993..45675ed 100644 --- a/percettrone.py +++ b/percettrone.py @@ -1,6 +1,6 @@ class Percettrone: - def __init__(self, w1 = 0, w2 = 0, bias = 0, lre = 1): + def __init__(self, w1 = 1, w2 = 1, bias = 1, lre = 1): self.w1 = w1 self.w2 = w2 self.bias = bias @@ -11,16 +11,7 @@ class Percettrone: return 1 return 0 - def valuta(self, x1, x2, risultato_atteso): - y = self.funzione_gradino(x1, x2) - errore = risultato_atteso - y - return errore - def correggi_pesi(self, x1, x2, errore): self.bias = self.bias + (errore * self.lre) - #print(f"errore: {errore * self.bias}") self.w1 = self.w1 + (errore * x1 * self.lre) - self.w2 = self.w2 + (errore * x2 * self.lre) - - def get_pesi(self): - return (self.w1, self.w2, self.bias) \ No newline at end of file + self.w2 = self.w2 + (errore * x2 * self.lre) \ No newline at end of file diff --git a/single_layer.py b/single_layer.py index 1b062da..6b535fb 100644 --- a/single_layer.py +++ b/single_layer.py @@ -1,7 +1,8 @@ from percettrone import Percettrone x = [(0,0),(0,1),(1,0),(1,1)] # Combinazioni -output = (0,0,0,1) # AND Logico +#output = (0,0,0,1) # AND Logico +output = (0,1,1,1) # OR Logico p = Percettrone() corrette = 0 #Fermo le epoche se termina prima @@ -30,7 +31,7 @@ for i in range(1,100): #Epoche for j in range(0,4): #Combinazioni y = p.funzione_gradino(x[j][0], x[j][1]) - errore = p.valuta(x[j][0], x[j][1], output[j]) + errore = output[j] - y stampa_operazione(p, y, x[j][0], x[j][1]) if errore != 0: p.correggi_pesi(x[j][0], x[j][1], errore) diff --git a/tempCodeRunnerFile.py b/tempCodeRunnerFile.py new file mode 100644 index 0000000..ce4a57d --- /dev/null +++ b/tempCodeRunnerFile.py @@ -0,0 +1,3 @@ +pin_est_1 = Percettrone(w1=0.3, w2=4, bias=-0.5) +pin_est_2 = Percettrone(w1=0.2, w2=4, bias=-0.5) +pinout = Percettrone(w1=0.3, w2=2, bias=-1) \ No newline at end of file