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. # Backpropagation: Fehler von Output zurück auf den Hidden Layer
  69. hidden_errors = error * hidden_output_weights
  70. for j in range(len(hidden_errors)):
  71. input_hidden_weights[i, j] += learning_rate * error * input_vector[i] * hidden_errors[j]
  72.  
  73. epoch_outputs.append((input_vector, final_output, target))
  74.  
  75. # Überprüfe, ob alle Ausgaben korrekt sind
  76. if all_correct:
  77. network_trained = True
  78. final_weights = (input_hidden_weights, hidden_output_weights) # Speichere die finalen Gewichte
  79. break
  80.  
  81. # Neustart der Gewichte nach `restart_threshold` Iterationen
  82. if epoch % restart_threshold == 0:
  83. print(f" -> Neustart der Startgewichte nach {epoch} Iterationen.")
  84. input_hidden_weights = np.random.rand(2, 3)
  85. hidden_output_weights = np.random.rand(3)
  86.  
  87. all_epoch_outputs.append(epoch_outputs)
  88.  
  89. # Ergebnisse speichern
  90. results.append({
  91. "truth_table_idx": truth_table_idx + 1,
  92. "targets": targets,
  93. "epochs": epoch,
  94. "network_trained": network_trained,
  95. "final_weights": final_weights,
  96. "all_epoch_outputs": all_epoch_outputs
  97. })
  98.  
  99. # Statusmeldung
  100. if network_trained:
  101. print(f" -> Wertetabelle korrekt gelernt nach {epoch} Iterationen.")
  102. else:
  103. print(f" -> Netzwerk konnte die Wertetabelle nicht lernen.")
  104.  
  105. # Alle Ergebnisse anzeigen
  106. print("\nZusammenfassung der Ergebnisse:")
  107. for result in results:
  108. print(f"Wertetabelle {result['truth_table_idx']}: Targets = {result['targets']}")
  109. print(f" -> Erfolg: {'Ja' if result['network_trained'] else 'Nein'}")
  110. print(f" -> Benötigte Epochen: {result['epochs']}")
  111. if result["network_trained"]:
  112. print(f" -> Finale Gewichte: {result['final_weights']}")
  113. print()
  114.  
Success #stdin #stdout 1.19s 31916KB
stdin
Standard input is empty
stdout
Lerne Wertetabelle 1: Targets = (0, 0, 0, 0)
  -> Wertetabelle korrekt gelernt nach 2 Iterationen.

Lerne Wertetabelle 2: Targets = (0, 0, 0, 1)
  -> Neustart der Startgewichte nach 100 Iterationen.
  -> Neustart der Startgewichte nach 200 Iterationen.
  -> Wertetabelle korrekt gelernt nach 205 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 6 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.
  -> Wertetabelle korrekt gelernt nach 303 Iterationen.

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

Lerne Wertetabelle 8: Targets = (0, 1, 1, 1)
  -> Neustart der Startgewichte nach 100 Iterationen.
  -> Wertetabelle korrekt gelernt nach 104 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.
  -> 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: 2
  -> Finale Gewichte: (array([[0.32037111, 0.27247938, 0.35422595],
       [1.04153738, 0.93687906, 0.44033162]]), array([ 0.80432003, -0.03779477,  0.05838403]))

Wertetabelle 2: Targets = (0, 0, 0, 1)
  -> Erfolg: Ja
  -> Benötigte Epochen: 205
  -> Finale Gewichte: (array([[0.79763619, 1.08703181, 0.3954143 ],
       [0.86777791, 1.18874311, 0.66388521]]), array([0.21566446, 0.56793466, 0.87447502]))

Wertetabelle 3: Targets = (0, 0, 1, 0)
  -> Erfolg: Ja
  -> Benötigte Epochen: 6
  -> Finale Gewichte: (array([[0.32738748, 0.6142781 , 0.95167814],
       [0.50092992, 0.57669829, 0.50657702]]), array([0.43950359, 0.77463244, 0.85948318]))

Wertetabelle 4: Targets = (0, 0, 1, 1)
  -> Erfolg: Ja
  -> Benötigte Epochen: 403
  -> Finale Gewichte: (array([[0.99010898, 0.65076259, 0.5636722 ],
       [0.22429882, 0.40411051, 0.11639652]]), array([0.98707125, 0.96665386, 0.14438613]))

Wertetabelle 5: Targets = (0, 1, 0, 0)
  -> Erfolg: Ja
  -> Benötigte Epochen: 6
  -> Finale Gewichte: (array([[0.68828893, 0.8399393 , 0.75921068],
       [0.39021869, 0.50302991, 0.86519731]]), array([0.20704505, 0.59249759, 0.93303675]))

Wertetabelle 6: Targets = (0, 1, 0, 1)
  -> Erfolg: Ja
  -> Benötigte Epochen: 303
  -> Finale Gewichte: (array([[0.59525151, 0.56840434, 0.94812677],
       [0.49267195, 1.05021812, 0.91526074]]), array([0.87209763, 0.37697212, 0.54133434]))

Wertetabelle 7: Targets = (0, 1, 1, 0)
  -> Erfolg: Ja
  -> Benötigte Epochen: 5
  -> Finale Gewichte: (array([[0.90727599, 0.25042469, 0.99935233],
       [0.24655351, 0.94545994, 0.89039706]]), array([0.30096415, 0.4544791 , 0.63464842]))

Wertetabelle 8: Targets = (0, 1, 1, 1)
  -> Erfolg: Ja
  -> Benötigte Epochen: 104
  -> Finale Gewichte: (array([[0.31036572, 1.22254034, 1.04476402],
       [0.70288774, 1.11281887, 0.26379475]]), array([0.80824048, 0.90886172, 1.03083004]))

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