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

Lerne Wertetabelle 3: Targets = (0, 0, 1, 0)
  -> Wertetabelle korrekt gelernt nach 19 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.
  -> 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.
  -> Neustart der Startgewichte nach 1100 Iterationen.
  -> Neustart der Startgewichte nach 1200 Iterationen.
  -> Neustart der Startgewichte nach 1300 Iterationen.
  -> Neustart der Startgewichte nach 1400 Iterationen.
  -> Neustart der Startgewichte nach 1500 Iterationen.
  -> Wertetabelle korrekt gelernt nach 1502 Iterationen.

Lerne Wertetabelle 5: Targets = (0, 1, 0, 0)
  -> Wertetabelle korrekt gelernt nach 1 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.
  -> 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.
  -> Neustart der Startgewichte nach 1100 Iterationen.
  -> Neustart der Startgewichte nach 1200 Iterationen.
  -> Wertetabelle korrekt gelernt nach 1202 Iterationen.

Lerne Wertetabelle 7: Targets = (0, 1, 1, 0)
  -> Wertetabelle korrekt gelernt nach 8 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.
  -> Wertetabelle korrekt gelernt nach 805 Iterationen.

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.
  -> Neustart der Startgewichte nach 1100 Iterationen.
  -> Neustart der Startgewichte nach 1200 Iterationen.
  -> Neustart der Startgewichte nach 1300 Iterationen.
  -> Neustart der Startgewichte nach 1400 Iterationen.
  -> Neustart der Startgewichte nach 1500 Iterationen.
  -> Neustart der Startgewichte nach 1600 Iterationen.
  -> Neustart der Startgewichte nach 1700 Iterationen.
  -> Neustart der Startgewichte nach 1800 Iterationen.
  -> Neustart der Startgewichte nach 1900 Iterationen.
  -> Neustart der Startgewichte nach 2000 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.
  -> Neustart der Startgewichte nach 1100 Iterationen.
  -> Neustart der Startgewichte nach 1200 Iterationen.
  -> Neustart der Startgewichte nach 1300 Iterationen.
  -> Neustart der Startgewichte nach 1400 Iterationen.
  -> Neustart der Startgewichte nach 1500 Iterationen.
  -> Neustart der Startgewichte nach 1600 Iterationen.
  -> Neustart der Startgewichte nach 1700 Iterationen.
  -> Neustart der Startgewichte nach 1800 Iterationen.
  -> Neustart der Startgewichte nach 1900 Iterationen.
  -> Neustart der Startgewichte nach 2000 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.
  -> Neustart der Startgewichte nach 1100 Iterationen.
  -> Neustart der Startgewichte nach 1200 Iterationen.
  -> Neustart der Startgewichte nach 1300 Iterationen.
  -> Neustart der Startgewichte nach 1400 Iterationen.
  -> Neustart der Startgewichte nach 1500 Iterationen.
  -> Neustart der Startgewichte nach 1600 Iterationen.
  -> Neustart der Startgewichte nach 1700 Iterationen.
  -> Neustart der Startgewichte nach 1800 Iterationen.
  -> Neustart der Startgewichte nach 1900 Iterationen.
  -> Neustart der Startgewichte nach 2000 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.
  -> Neustart der Startgewichte nach 1100 Iterationen.
  -> Neustart der Startgewichte nach 1200 Iterationen.
  -> Neustart der Startgewichte nach 1300 Iterationen.
  -> Neustart der Startgewichte nach 1400 Iterationen.
  -> Neustart der Startgewichte nach 1500 Iterationen.
  -> Neustart der Startgewichte nach 1600 Iterationen.
  -> Neustart der Startgewichte nach 1700 Iterationen.
  -> Neustart der Startgewichte nach 1800 Iterationen.
  -> Neustart der Startgewichte nach 1900 Iterationen.
  -> Neustart der Startgewichte nach 2000 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.
  -> Neustart der Startgewichte nach 1100 Iterationen.
  -> Neustart der Startgewichte nach 1200 Iterationen.
  -> Neustart der Startgewichte nach 1300 Iterationen.
  -> Neustart der Startgewichte nach 1400 Iterationen.
  -> Neustart der Startgewichte nach 1500 Iterationen.
  -> Neustart der Startgewichte nach 1600 Iterationen.
  -> Neustart der Startgewichte nach 1700 Iterationen.
  -> Neustart der Startgewichte nach 1800 Iterationen.
  -> Neustart der Startgewichte nach 1900 Iterationen.
  -> Neustart der Startgewichte nach 2000 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.
  -> Neustart der Startgewichte nach 1100 Iterationen.
  -> Neustart der Startgewichte nach 1200 Iterationen.
  -> Neustart der Startgewichte nach 1300 Iterationen.
  -> Neustart der Startgewichte nach 1400 Iterationen.
  -> Neustart der Startgewichte nach 1500 Iterationen.
  -> Neustart der Startgewichte nach 1600 Iterationen.
  -> Neustart der Startgewichte nach 1700 Iterationen.
  -> Neustart der Startgewichte nach 1800 Iterationen.
  -> Neustart der Startgewichte nach 1900 Iterationen.
  -> Neustart der Startgewichte nach 2000 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.
  -> Neustart der Startgewichte nach 1100 Iterationen.
  -> Neustart der Startgewichte nach 1200 Iterationen.
  -> Neustart der Startgewichte nach 1300 Iterationen.
  -> Neustart der Startgewichte nach 1400 Iterationen.
  -> Neustart der Startgewichte nach 1500 Iterationen.
  -> Neustart der Startgewichte nach 1600 Iterationen.
  -> Neustart der Startgewichte nach 1700 Iterationen.
  -> Neustart der Startgewichte nach 1800 Iterationen.
  -> Neustart der Startgewichte nach 1900 Iterationen.
  -> Neustart der Startgewichte nach 2000 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.
  -> Neustart der Startgewichte nach 1100 Iterationen.
  -> Neustart der Startgewichte nach 1200 Iterationen.
  -> Neustart der Startgewichte nach 1300 Iterationen.
  -> Neustart der Startgewichte nach 1400 Iterationen.
  -> Neustart der Startgewichte nach 1500 Iterationen.
  -> Neustart der Startgewichte nach 1600 Iterationen.
  -> Neustart der Startgewichte nach 1700 Iterationen.
  -> Neustart der Startgewichte nach 1800 Iterationen.
  -> Neustart der Startgewichte nach 1900 Iterationen.
  -> Neustart der Startgewichte nach 2000 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.79874014, 0.15553944, 0.71922605],
       [0.5625403 , 0.16843442, 0.9662489 ]]), array([0.54770924, 0.88905798, 0.5195004 ]))

Wertetabelle 2: Targets = (0, 0, 0, 1)
  -> Erfolg: Ja
  -> Benötigte Epochen: 2
  -> Finale Gewichte: (array([[1.01253421, 0.89306907, 0.70617587],
       [0.16464742, 0.65669668, 0.58458398]]), array([0.99692682, 0.52959006, 0.64734058]))

Wertetabelle 3: Targets = (0, 0, 1, 0)
  -> Erfolg: Ja
  -> Benötigte Epochen: 19
  -> Finale Gewichte: (array([[2.51926998, 2.07835941, 1.07489908],
       [0.87936654, 1.18121725, 0.21050429]]), array([1.07665094, 0.86610836, 0.82784126]))

Wertetabelle 4: Targets = (0, 0, 1, 1)
  -> Erfolg: Ja
  -> Benötigte Epochen: 1502
  -> Finale Gewichte: (array([[0.20828771, 0.77283502, 0.94465938],
       [0.68784396, 0.40712521, 0.44495497]]), array([0.39575095, 0.45837198, 0.98892748]))

Wertetabelle 5: Targets = (0, 1, 0, 0)
  -> Erfolg: Ja
  -> Benötigte Epochen: 1
  -> Finale Gewichte: (array([[0.29518707, 0.55442684, 0.39455136],
       [0.8183512 , 0.5254431 , 0.75275217]]), array([0.96367271, 0.57182525, 0.04693505]))

Wertetabelle 6: Targets = (0, 1, 0, 1)
  -> Erfolg: Ja
  -> Benötigte Epochen: 1202
  -> Finale Gewichte: (array([[0.96499477, 1.01173652, 0.17164271],
       [0.7346533 , 0.34088444, 0.90093724]]), array([0.84421429, 0.89075414, 0.90393962]))

Wertetabelle 7: Targets = (0, 1, 1, 0)
  -> Erfolg: Ja
  -> Benötigte Epochen: 8
  -> Finale Gewichte: (array([[1.33461134, 1.07489549, 0.31770494],
       [0.80720104, 0.73533919, 0.37973035]]), array([1.08958725, 0.8633415 , 0.40833845]))

Wertetabelle 8: Targets = (0, 1, 1, 1)
  -> Erfolg: Ja
  -> Benötigte Epochen: 805
  -> Finale Gewichte: (array([[0.88633088, 0.59313887, 0.28855808],
       [0.822299  , 0.52614038, 0.69455183]]), array([0.94214111, 0.71456267, 0.18649844]))

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

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

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

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

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

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

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

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