import numpy as np
# Initialisierung der Schwellenwerte
lower_threshold = 0.8
upper_threshold = 1.2
# Lernrate
learning_rate = 0.1
# Trainingsdaten (XOR-Problem)
inputs = [[0, 0], [0, 1], [1, 0], [1, 1]]
targets = [0, 1, 1, 0]
# Trainingsloop mit max. 1000 Iterationen
max_iterations = 1000
epoch = 0
network_trained = False
start_weights = None
final_weights = None
bias = np.random.rand() # Zufälliger Start-Bias
while epoch < max_iterations:
epoch += 1
all_correct = True # Flag, um zu überprüfen, ob alle Ausgaben korrekt sind
current_weights = np.random.rand(2) # Zufällige Startgewichte
if epoch == 1: # Die erste Iteration nach Initialisierung
start_weights = current_weights # Speichere die Startgewichte
for input_vector, target in zip(inputs, targets):
# Berechnung der gewichteten Summe + Bias
weighted_sum = np.dot(input_vector, current_weights) + bias
# Aktivierungsfunktion (Schwellenwert)
if lower_threshold < weighted_sum < upper_threshold:
output = 1
else:
output = 0
# Fehlerberechnung
error = target - output
# Wenn Fehler vorliegt, Gewichte und Bias anpassen
if error != 0:
all_correct = False
current_weights += learning_rate * error * np.array(input_vector)
bias += learning_rate * error # Bias anpassen
# Überprüfe, ob alle Ausgaben korrekt sind
if all_correct:
network_trained = True
final_weights = current_weights # Speichere die finalen Gewichte
break # Stoppe, wenn alle Ausgaben korrekt sind
# Wenn XOR nach 100 Iterationen nicht gelernt wurde, setze neue zufällige Startgewichte
if epoch % 100 == 0: # 100 statt 20
print(f"Nicht funktionierende Startgewichte: {start_weights}")
start_weights = np.random.rand(2) # Setze neue Startgewichte
if network_trained:
print(f"Das Netzwerk hat XOR korrekt nach {epoch} Iterationen gelernt.")
print(f"Die Working Startgewichte waren: {start_weights}")
print(f"Die finalen Gewichte sind: {final_weights}")
print(f"Der Bias ist: {bias}")
else:
print(f"Das Netzwerk hat XOR nach {epoch} Iterationen nicht korrekt gelernt.")
# Testen des Netzwerks nach den Lern-Iterationen
print("\nFinal Test Output:")
for input_vector, target in zip(inputs, targets):
weighted_sum = np.dot(input_vector, final_weights) + bias
if lower_threshold < weighted_sum < upper_threshold:
output = 1
else:
output = 0
print(f"Input: {input_vector}, Target: {target}, Output: {output}")
aW1wb3J0IG51bXB5IGFzIG5wCgojIEluaXRpYWxpc2llcnVuZyBkZXIgU2Nod2VsbGVud2VydGUKbG93ZXJfdGhyZXNob2xkID0gMC44CnVwcGVyX3RocmVzaG9sZCA9IDEuMgoKIyBMZXJucmF0ZQpsZWFybmluZ19yYXRlID0gMC4xCgojIFRyYWluaW5nc2RhdGVuIChYT1ItUHJvYmxlbSkKaW5wdXRzID0gW1swLCAwXSwgWzAsIDFdLCBbMSwgMF0sIFsxLCAxXV0KdGFyZ2V0cyA9IFswLCAxLCAxLCAwXQoKIyBUcmFpbmluZ3Nsb29wIG1pdCBtYXguIDEwMDAgSXRlcmF0aW9uZW4KbWF4X2l0ZXJhdGlvbnMgPSAxMDAwCmVwb2NoID0gMApuZXR3b3JrX3RyYWluZWQgPSBGYWxzZQpzdGFydF93ZWlnaHRzID0gTm9uZQpmaW5hbF93ZWlnaHRzID0gTm9uZQpiaWFzID0gbnAucmFuZG9tLnJhbmQoKSAgIyBadWbDpGxsaWdlciBTdGFydC1CaWFzCgp3aGlsZSBlcG9jaCA8IG1heF9pdGVyYXRpb25zOgogICAgZXBvY2ggKz0gMQogICAgYWxsX2NvcnJlY3QgPSBUcnVlICAjIEZsYWcsIHVtIHp1IMO8YmVycHLDvGZlbiwgb2IgYWxsZSBBdXNnYWJlbiBrb3JyZWt0IHNpbmQKICAgIGN1cnJlbnRfd2VpZ2h0cyA9IG5wLnJhbmRvbS5yYW5kKDIpICAjIFp1ZsOkbGxpZ2UgU3RhcnRnZXdpY2h0ZQoKICAgIGlmIGVwb2NoID09IDE6ICAjIERpZSBlcnN0ZSBJdGVyYXRpb24gbmFjaCBJbml0aWFsaXNpZXJ1bmcKICAgICAgICBzdGFydF93ZWlnaHRzID0gY3VycmVudF93ZWlnaHRzICAjIFNwZWljaGVyZSBkaWUgU3RhcnRnZXdpY2h0ZQoKICAgIGZvciBpbnB1dF92ZWN0b3IsIHRhcmdldCBpbiB6aXAoaW5wdXRzLCB0YXJnZXRzKToKICAgICAgICAjIEJlcmVjaG51bmcgZGVyIGdld2ljaHRldGVuIFN1bW1lICsgQmlhcwogICAgICAgIHdlaWdodGVkX3N1bSA9IG5wLmRvdChpbnB1dF92ZWN0b3IsIGN1cnJlbnRfd2VpZ2h0cykgKyBiaWFzCgogICAgICAgICMgQWt0aXZpZXJ1bmdzZnVua3Rpb24gKFNjaHdlbGxlbndlcnQpCiAgICAgICAgaWYgbG93ZXJfdGhyZXNob2xkIDwgd2VpZ2h0ZWRfc3VtIDwgdXBwZXJfdGhyZXNob2xkOgogICAgICAgICAgICBvdXRwdXQgPSAxCiAgICAgICAgZWxzZToKICAgICAgICAgICAgb3V0cHV0ID0gMAoKICAgICAgICAjIEZlaGxlcmJlcmVjaG51bmcKICAgICAgICBlcnJvciA9IHRhcmdldCAtIG91dHB1dAoKICAgICAgICAjIFdlbm4gRmVobGVyIHZvcmxpZWd0LCBHZXdpY2h0ZSB1bmQgQmlhcyBhbnBhc3NlbgogICAgICAgIGlmIGVycm9yICE9IDA6CiAgICAgICAgICAgIGFsbF9jb3JyZWN0ID0gRmFsc2UKICAgICAgICAgICAgY3VycmVudF93ZWlnaHRzICs9IGxlYXJuaW5nX3JhdGUgKiBlcnJvciAqIG5wLmFycmF5KGlucHV0X3ZlY3RvcikKICAgICAgICAgICAgYmlhcyArPSBsZWFybmluZ19yYXRlICogZXJyb3IgICMgQmlhcyBhbnBhc3NlbgoKICAgICMgw5xiZXJwcsO8ZmUsIG9iIGFsbGUgQXVzZ2FiZW4ga29ycmVrdCBzaW5kCiAgICBpZiBhbGxfY29ycmVjdDoKICAgICAgICBuZXR3b3JrX3RyYWluZWQgPSBUcnVlCiAgICAgICAgZmluYWxfd2VpZ2h0cyA9IGN1cnJlbnRfd2VpZ2h0cyAgIyBTcGVpY2hlcmUgZGllIGZpbmFsZW4gR2V3aWNodGUKICAgICAgICBicmVhayAgIyBTdG9wcGUsIHdlbm4gYWxsZSBBdXNnYWJlbiBrb3JyZWt0IHNpbmQKCiAgICAjIFdlbm4gWE9SIG5hY2ggMTAwIEl0ZXJhdGlvbmVuIG5pY2h0IGdlbGVybnQgd3VyZGUsIHNldHplIG5ldWUgenVmw6RsbGlnZSBTdGFydGdld2ljaHRlCiAgICBpZiBlcG9jaCAlIDEwMCA9PSAwOiAgIyAxMDAgc3RhdHQgMjAKICAgICAgICBwcmludChmIk5pY2h0IGZ1bmt0aW9uaWVyZW5kZSBTdGFydGdld2ljaHRlOiB7c3RhcnRfd2VpZ2h0c30iKQogICAgICAgIHN0YXJ0X3dlaWdodHMgPSBucC5yYW5kb20ucmFuZCgyKSAgIyBTZXR6ZSBuZXVlIFN0YXJ0Z2V3aWNodGUKCmlmIG5ldHdvcmtfdHJhaW5lZDoKICAgIHByaW50KGYiRGFzIE5ldHp3ZXJrIGhhdCBYT1Iga29ycmVrdCBuYWNoIHtlcG9jaH0gSXRlcmF0aW9uZW4gZ2VsZXJudC4iKQogICAgcHJpbnQoZiJEaWUgV29ya2luZyBTdGFydGdld2ljaHRlIHdhcmVuOiB7c3RhcnRfd2VpZ2h0c30iKQogICAgcHJpbnQoZiJEaWUgZmluYWxlbiBHZXdpY2h0ZSBzaW5kOiB7ZmluYWxfd2VpZ2h0c30iKQogICAgcHJpbnQoZiJEZXIgQmlhcyBpc3Q6IHtiaWFzfSIpCmVsc2U6CiAgICBwcmludChmIkRhcyBOZXR6d2VyayBoYXQgWE9SIG5hY2gge2Vwb2NofSBJdGVyYXRpb25lbiBuaWNodCBrb3JyZWt0IGdlbGVybnQuIikKCiMgVGVzdGVuIGRlcyBOZXR6d2Vya3MgbmFjaCBkZW4gTGVybi1JdGVyYXRpb25lbgpwcmludCgiXG5GaW5hbCBUZXN0IE91dHB1dDoiKQpmb3IgaW5wdXRfdmVjdG9yLCB0YXJnZXQgaW4gemlwKGlucHV0cywgdGFyZ2V0cyk6CiAgICB3ZWlnaHRlZF9zdW0gPSBucC5kb3QoaW5wdXRfdmVjdG9yLCBmaW5hbF93ZWlnaHRzKSArIGJpYXMKICAgIGlmIGxvd2VyX3RocmVzaG9sZCA8IHdlaWdodGVkX3N1bSA8IHVwcGVyX3RocmVzaG9sZDoKICAgICAgICBvdXRwdXQgPSAxCiAgICBlbHNlOgogICAgICAgIG91dHB1dCA9IDAKICAgIHByaW50KGYiSW5wdXQ6IHtpbnB1dF92ZWN0b3J9LCBUYXJnZXQ6IHt0YXJnZXR9LCBPdXRwdXQ6IHtvdXRwdXR9IikK
Das Netzwerk hat XOR korrekt nach 2 Iterationen gelernt.
Die Working Startgewichte waren: [0.19773093 0.22916919]
Die finalen Gewichte sind: [0.57758066 0.56518903]
Der Bias ist: 0.44756470656278113
Final Test Output:
Input: [0, 0], Target: 0, Output: 0
Input: [0, 1], Target: 1, Output: 1
Input: [1, 0], Target: 1, Output: 1
Input: [1, 1], Target: 0, Output: 0