fork download
  1. import numpy as np
  2. import itertools
  3.  
  4. # Initialisierung der Schwellenwerte
  5. lower_threshold = 0.8
  6. upper_threshold = 1.2
  7.  
  8. # Lernrate
  9. learning_rate = 0.1
  10.  
  11. # Eingabekombinationen (2 Eingänge)
  12. inputs = [[0, 0], [0, 1], [1, 0], [1, 1]]
  13.  
  14. # Generiere alle 16 möglichen Wertetabellen (Targets)
  15. all_truth_tables = list(itertools.product([0, 1], repeat=4))
  16.  
  17. # Trainingsloop für jede Wertetabelle
  18. max_iterations = 1000
  19. restart_threshold = 100 # Neustart der Gewichte nach 100 erfolglosen Iterationen
  20. results = [] # Zum Speichern der Ergebnisse für jede Wertetabelle
  21.  
  22. # Schwellenwert-Aktivierungsfunktion (Wie im Originalprogramm)
  23. def threshold_activation(x):
  24. if lower_threshold < x < upper_threshold:
  25. return 1
  26. return 0
  27.  
  28. # Trainingsprozess für jede Wertetabelle
  29. for truth_table_idx, targets in enumerate(all_truth_tables):
  30. print(f"\nLerne Wertetabelle {truth_table_idx + 1}: Targets = {targets}")
  31.  
  32. epoch = 0
  33. network_trained = False
  34. start_weights = None
  35. final_weights = None
  36. all_epoch_outputs = [] # Outputs jeder Epoche (Debugging und Transparenz)
  37.  
  38. # Initialisiere Startgewichte
  39. input_hidden_weights = np.random.rand(2, 3) # 2 Inputs, 3 Neuronen im Hidden Layer
  40. hidden_output_weights = np.random.rand(3) # 3 Neuronen im Hidden Layer, 1 Ausgang
  41.  
  42. # Trainingsprozess für die aktuelle Wertetabelle
  43. while epoch < max_iterations:
  44. epoch += 1
  45. all_correct = True # Flag, um zu überprüfen, ob alle Ausgaben korrekt sind
  46.  
  47. epoch_outputs = [] # Outputs der aktuellen Epoche
  48.  
  49. for input_vector, target in zip(inputs, targets):
  50. # Berechnung der gewichteten Summe für Hidden Layer
  51. hidden_input = np.dot(input_vector, input_hidden_weights)
  52. hidden_output = np.array([threshold_activation(x) for x in hidden_input])
  53.  
  54. # Berechnung der gewichteten Summe für Output Layer
  55. final_output = np.dot(hidden_output, hidden_output_weights)
  56. final_output = threshold_activation(final_output) # Aktivierung im Output Layer
  57.  
  58. # Fehlerberechnung
  59. error = target - final_output
  60. if error != 0:
  61. all_correct = False
  62.  
  63. # Fehlerkorrektur für den Output Layer
  64. hidden_output_weights += learning_rate * error * hidden_output
  65.  
  66. # Fehlerkorrektur für den Hidden Layer
  67. for i in range(len(input_vector)):
  68. input_hidden_weights[i] += learning_rate * error * input_vector[i] * hidden_output_weights
  69.  
  70. epoch_outputs.append((input_vector, final_output, target))
  71.  
  72. # Überprüfe, ob alle Ausgaben korrekt sind
  73. if all_correct:
  74. network_trained = True
  75. final_weights = (input_hidden_weights, hidden_output_weights) # Speichere die finalen Gewichte
  76. break
  77.  
  78. # Neustart der Gewichte nach `restart_threshold` Iterationen
  79. if epoch % restart_threshold == 0:
  80. print(f" -> Neustart der Startgewichte nach {epoch} Iterationen.")
  81. input_hidden_weights = np.random.rand(2, 3)
  82. hidden_output_weights = np.random.rand(3)
  83.  
  84. all_epoch_outputs.append(epoch_outputs)
  85.  
  86. # Ergebnisse speichern
  87. results.append({
  88. "truth_table_idx": truth_table_idx + 1,
  89. "targets": targets,
  90. "epochs": epoch,
  91. "network_trained": network_trained,
  92. "final_weights": final_weights,
  93. "all_epoch_outputs": all_epoch_outputs
  94. })
  95.  
  96. # Statusmeldung
  97. if network_trained:
  98. print(f" -> Wertetabelle korrekt gelernt nach {epoch} Iterationen.")
  99. else:
  100. print(f" -> Netzwerk konnte die Wertetabelle nicht lernen.")
  101.  
  102. # Alle Ergebnisse anzeigen
  103. print("\nZusammenfassung der Ergebnisse:")
  104. for result in results:
  105. print(f"Wertetabelle {result['truth_table_idx']}: Targets = {result['targets']}")
  106. print(f" -> Erfolg: {'Ja' if result['network_trained'] else 'Nein'}")
  107. print(f" -> Benötigte Epochen: {result['epochs']}")
  108. if result["network_trained"]:
  109. print(f" -> Finale Gewichte: {result['final_weights']}")
  110. print()
  111.  
Success #stdin #stdout 1.58s 32248KB
stdin
Standard input is empty
stdout
Lerne Wertetabelle 1: Targets = (0, 0, 0, 0)
  -> Wertetabelle korrekt gelernt nach 1 Iterationen.

Lerne Wertetabelle 2: Targets = (0, 0, 0, 1)
  -> Wertetabelle korrekt gelernt nach 5 Iterationen.

Lerne Wertetabelle 3: Targets = (0, 0, 1, 0)
  -> Wertetabelle korrekt gelernt nach 6 Iterationen.

Lerne Wertetabelle 4: Targets = (0, 0, 1, 1)
  -> Neustart der Startgewichte nach 100 Iterationen.
  -> Neustart der Startgewichte nach 200 Iterationen.
  -> Neustart der Startgewichte nach 300 Iterationen.
  -> Neustart der Startgewichte nach 400 Iterationen.
  -> Wertetabelle korrekt gelernt nach 403 Iterationen.

Lerne Wertetabelle 5: Targets = (0, 1, 0, 0)
  -> Wertetabelle korrekt gelernt nach 4 Iterationen.

Lerne Wertetabelle 6: Targets = (0, 1, 0, 1)
  -> Neustart der Startgewichte nach 100 Iterationen.
  -> Neustart der Startgewichte nach 200 Iterationen.
  -> Neustart der Startgewichte nach 300 Iterationen.
  -> Neustart der Startgewichte nach 400 Iterationen.
  -> Wertetabelle korrekt gelernt nach 403 Iterationen.

Lerne Wertetabelle 7: Targets = (0, 1, 1, 0)
  -> Wertetabelle korrekt gelernt nach 6 Iterationen.

Lerne Wertetabelle 8: Targets = (0, 1, 1, 1)
  -> Neustart der Startgewichte nach 100 Iterationen.
  -> Neustart der Startgewichte nach 200 Iterationen.
  -> Neustart der Startgewichte nach 300 Iterationen.
  -> Neustart der Startgewichte nach 400 Iterationen.
  -> Neustart der Startgewichte nach 500 Iterationen.
  -> Neustart der Startgewichte nach 600 Iterationen.
  -> Neustart der Startgewichte nach 700 Iterationen.
  -> Neustart der Startgewichte nach 800 Iterationen.
  -> Neustart der Startgewichte nach 900 Iterationen.
  -> Neustart der Startgewichte nach 1000 Iterationen.
  -> Netzwerk konnte die Wertetabelle nicht lernen.

Lerne Wertetabelle 9: Targets = (1, 0, 0, 0)
  -> Neustart der Startgewichte nach 100 Iterationen.
  -> Neustart der Startgewichte nach 200 Iterationen.
  -> Neustart der Startgewichte nach 300 Iterationen.
  -> Neustart der Startgewichte nach 400 Iterationen.
  -> Neustart der Startgewichte nach 500 Iterationen.
  -> Neustart der Startgewichte nach 600 Iterationen.
  -> Neustart der Startgewichte nach 700 Iterationen.
  -> Neustart der Startgewichte nach 800 Iterationen.
  -> Neustart der Startgewichte nach 900 Iterationen.
  -> Neustart der Startgewichte nach 1000 Iterationen.
  -> Netzwerk konnte die Wertetabelle nicht lernen.

Lerne Wertetabelle 10: Targets = (1, 0, 0, 1)
  -> Neustart der Startgewichte nach 100 Iterationen.
  -> Neustart der Startgewichte nach 200 Iterationen.
  -> Neustart der Startgewichte nach 300 Iterationen.
  -> Neustart der Startgewichte nach 400 Iterationen.
  -> Neustart der Startgewichte nach 500 Iterationen.
  -> Neustart der Startgewichte nach 600 Iterationen.
  -> Neustart der Startgewichte nach 700 Iterationen.
  -> Neustart der Startgewichte nach 800 Iterationen.
  -> Neustart der Startgewichte nach 900 Iterationen.
  -> Neustart der Startgewichte nach 1000 Iterationen.
  -> Netzwerk konnte die Wertetabelle nicht lernen.

Lerne Wertetabelle 11: Targets = (1, 0, 1, 0)
  -> Neustart der Startgewichte nach 100 Iterationen.
  -> Neustart der Startgewichte nach 200 Iterationen.
  -> Neustart der Startgewichte nach 300 Iterationen.
  -> Neustart der Startgewichte nach 400 Iterationen.
  -> Neustart der Startgewichte nach 500 Iterationen.
  -> Neustart der Startgewichte nach 600 Iterationen.
  -> Neustart der Startgewichte nach 700 Iterationen.
  -> Neustart der Startgewichte nach 800 Iterationen.
  -> Neustart der Startgewichte nach 900 Iterationen.
  -> Neustart der Startgewichte nach 1000 Iterationen.
  -> Netzwerk konnte die Wertetabelle nicht lernen.

Lerne Wertetabelle 12: Targets = (1, 0, 1, 1)
  -> Neustart der Startgewichte nach 100 Iterationen.
  -> Neustart der Startgewichte nach 200 Iterationen.
  -> Neustart der Startgewichte nach 300 Iterationen.
  -> Neustart der Startgewichte nach 400 Iterationen.
  -> Neustart der Startgewichte nach 500 Iterationen.
  -> Neustart der Startgewichte nach 600 Iterationen.
  -> Neustart der Startgewichte nach 700 Iterationen.
  -> Neustart der Startgewichte nach 800 Iterationen.
  -> Neustart der Startgewichte nach 900 Iterationen.
  -> Neustart der Startgewichte nach 1000 Iterationen.
  -> Netzwerk konnte die Wertetabelle nicht lernen.

Lerne Wertetabelle 13: Targets = (1, 1, 0, 0)
  -> Neustart der Startgewichte nach 100 Iterationen.
  -> Neustart der Startgewichte nach 200 Iterationen.
  -> Neustart der Startgewichte nach 300 Iterationen.
  -> Neustart der Startgewichte nach 400 Iterationen.
  -> Neustart der Startgewichte nach 500 Iterationen.
  -> Neustart der Startgewichte nach 600 Iterationen.
  -> Neustart der Startgewichte nach 700 Iterationen.
  -> Neustart der Startgewichte nach 800 Iterationen.
  -> Neustart der Startgewichte nach 900 Iterationen.
  -> Neustart der Startgewichte nach 1000 Iterationen.
  -> Netzwerk konnte die Wertetabelle nicht lernen.

Lerne Wertetabelle 14: Targets = (1, 1, 0, 1)
  -> Neustart der Startgewichte nach 100 Iterationen.
  -> Neustart der Startgewichte nach 200 Iterationen.
  -> Neustart der Startgewichte nach 300 Iterationen.
  -> Neustart der Startgewichte nach 400 Iterationen.
  -> Neustart der Startgewichte nach 500 Iterationen.
  -> Neustart der Startgewichte nach 600 Iterationen.
  -> Neustart der Startgewichte nach 700 Iterationen.
  -> Neustart der Startgewichte nach 800 Iterationen.
  -> Neustart der Startgewichte nach 900 Iterationen.
  -> Neustart der Startgewichte nach 1000 Iterationen.
  -> Netzwerk konnte die Wertetabelle nicht lernen.

Lerne Wertetabelle 15: Targets = (1, 1, 1, 0)
  -> Neustart der Startgewichte nach 100 Iterationen.
  -> Neustart der Startgewichte nach 200 Iterationen.
  -> Neustart der Startgewichte nach 300 Iterationen.
  -> Neustart der Startgewichte nach 400 Iterationen.
  -> Neustart der Startgewichte nach 500 Iterationen.
  -> Neustart der Startgewichte nach 600 Iterationen.
  -> Neustart der Startgewichte nach 700 Iterationen.
  -> Neustart der Startgewichte nach 800 Iterationen.
  -> Neustart der Startgewichte nach 900 Iterationen.
  -> Neustart der Startgewichte nach 1000 Iterationen.
  -> Netzwerk konnte die Wertetabelle nicht lernen.

Lerne Wertetabelle 16: Targets = (1, 1, 1, 1)
  -> Neustart der Startgewichte nach 100 Iterationen.
  -> Neustart der Startgewichte nach 200 Iterationen.
  -> Neustart der Startgewichte nach 300 Iterationen.
  -> Neustart der Startgewichte nach 400 Iterationen.
  -> Neustart der Startgewichte nach 500 Iterationen.
  -> Neustart der Startgewichte nach 600 Iterationen.
  -> Neustart der Startgewichte nach 700 Iterationen.
  -> Neustart der Startgewichte nach 800 Iterationen.
  -> Neustart der Startgewichte nach 900 Iterationen.
  -> Neustart der Startgewichte nach 1000 Iterationen.
  -> Netzwerk konnte die Wertetabelle nicht lernen.

Zusammenfassung der Ergebnisse:
Wertetabelle 1: Targets = (0, 0, 0, 0)
  -> Erfolg: Ja
  -> Benötigte Epochen: 1
  -> Finale Gewichte: (array([[0.68814028, 0.13183144, 0.86273055],
       [0.8216364 , 0.43863911, 0.53083751]]), array([0.05845465, 0.74694724, 0.21336231]))

Wertetabelle 2: Targets = (0, 0, 0, 1)
  -> Erfolg: Ja
  -> Benötigte Epochen: 5
  -> Finale Gewichte: (array([[0.29692834, 0.51312557, 0.68567277],
       [0.92077488, 0.95424181, 0.20005196]]), array([0.61927748, 0.12655351, 0.80769768]))

Wertetabelle 3: Targets = (0, 0, 1, 0)
  -> Erfolg: Ja
  -> Benötigte Epochen: 6
  -> Finale Gewichte: (array([[0.74198457, 0.80805933, 0.54506015],
       [0.34834807, 0.3039823 , 0.53202519]]), array([0.57279568, 0.93896017, 0.33665928]))

Wertetabelle 4: Targets = (0, 0, 1, 1)
  -> Erfolg: Ja
  -> Benötigte Epochen: 403
  -> Finale Gewichte: (array([[0.78019014, 0.62464232, 1.12989761],
       [0.3616712 , 0.14906123, 0.2443763 ]]), array([1.0531931 , 0.5266019 , 0.95585659]))

Wertetabelle 5: Targets = (0, 1, 0, 0)
  -> Erfolg: Ja
  -> Benötigte Epochen: 4
  -> Finale Gewichte: (array([[0.64530127, 0.21686531, 0.03267521],
       [0.71017716, 1.15678816, 0.53337163]]), array([0.22875331, 0.85997839, 0.774752  ]))

Wertetabelle 6: Targets = (0, 1, 0, 1)
  -> Erfolg: Ja
  -> Benötigte Epochen: 403
  -> Finale Gewichte: (array([[0.30193151, 0.62798002, 0.28737129],
       [0.84960969, 0.94957149, 0.69304363]]), array([0.67760016, 0.4097593 , 0.22661546]))

Wertetabelle 7: Targets = (0, 1, 1, 0)
  -> Erfolg: Ja
  -> Benötigte Epochen: 6
  -> Finale Gewichte: (array([[0.89932078, 0.65170997, 0.68366776],
       [1.06183943, 0.22524756, 0.37854208]]), array([0.88446237, 0.29509544, 0.33437249]))

Wertetabelle 8: Targets = (0, 1, 1, 1)
  -> Erfolg: Nein
  -> Benötigte Epochen: 1000

Wertetabelle 9: Targets = (1, 0, 0, 0)
  -> Erfolg: Nein
  -> Benötigte Epochen: 1000

Wertetabelle 10: Targets = (1, 0, 0, 1)
  -> Erfolg: Nein
  -> Benötigte Epochen: 1000

Wertetabelle 11: Targets = (1, 0, 1, 0)
  -> Erfolg: Nein
  -> Benötigte Epochen: 1000

Wertetabelle 12: Targets = (1, 0, 1, 1)
  -> Erfolg: Nein
  -> Benötigte Epochen: 1000

Wertetabelle 13: Targets = (1, 1, 0, 0)
  -> Erfolg: Nein
  -> Benötigte Epochen: 1000

Wertetabelle 14: Targets = (1, 1, 0, 1)
  -> Erfolg: Nein
  -> Benötigte Epochen: 1000

Wertetabelle 15: Targets = (1, 1, 1, 0)
  -> Erfolg: Nein
  -> Benötigte Epochen: 1000

Wertetabelle 16: Targets = (1, 1, 1, 1)
  -> Erfolg: Nein
  -> Benötigte Epochen: 1000