fork download
  1. import math
  2. import random
  3.  
  4. # --- 1. ВСПОМОГАТЕЛЬНЫЕ ФУНКЦИИ (Вместо формул) ---
  5.  
  6.  
  7. def activation(x):
  8. """Сглаживает любое число в диапазон от 0 до 1 (функция Сигмоида)"""
  9. return 1 / (1 + math.exp(-x))
  10.  
  11.  
  12. def activation_derivative(x):
  13. """Показывает, насколько сильно нужно изменить вес при ошибке"""
  14. return x * (1 - x)
  15.  
  16.  
  17. # --- 2. ДАННЫЕ ДЛЯ ОБУЧЕНИЯ ---
  18. # Задача: выдать 1, только если ОДИН из входов равен 1. Если оба 0 или оба 1 -> выдать 0.
  19. training_inputs = [[0, 0], [0, 1], [1, 0], [1, 1]]
  20. training_outputs = [[0], [1], [1], [0]]
  21.  
  22. # --- 3. ИНИЦИАЛИЗАЦИЯ СЕТИ (Случайные веса) ---
  23. random.seed(1) # Задаем фиксацию случайности для повторяемости
  24.  
  25. # Веса между входным слоем (2 входа) и скрытым слоем (3 нейрона)
  26. weights_input_hidden = [
  27. [random.uniform(-1, 1) for _ in range(3)] for _ in range(2)
  28. ]
  29.  
  30. # Веса между скрытым слоем (3 нейрона) и выходным слоем (1 выход)
  31. weights_hidden_output = [
  32. [random.uniform(-1, 1) for _ in range(1)] for _ in range(3)
  33. ]
  34.  
  35. learning_rate = 0.5 # Скорость обучения
  36.  
  37. # --- 4. ЦИКЛ ОБУЧЕНИЯ (20 000 повторений) ---
  38. for epoch in range(20000):
  39. for inputs, correct_output in zip(training_inputs, training_outputs):
  40.  
  41. # ---- ШАГ А: ПРЯМОЙ ХОД (Сигнал идет вперед) ----
  42.  
  43. # Считаем сигналы для 3-х нейронов в скрытом слое
  44. hidden_layer_outputs = []
  45. for j in range(3):
  46. sum_j = inputs[0] * weights_input_hidden[0][j] + inputs[1] * weights_input_hidden[1][j]
  47. hidden_layer_outputs.append(activation(sum_j))
  48.  
  49. # Считаем финальный прогноз на выходе
  50. final_sum = 0
  51. for j in range(3):
  52. final_sum += hidden_layer_outputs[j] * weights_hidden_output[j][0]
  53. prediction = activation(final_sum)
  54.  
  55. # ---- ШАГ Б: ОБРАТНЫЙ ХОД (Исправление ошибок) ----
  56.  
  57. # 1. Считаем ошибку на самом выходе
  58. output_error = correct_output[0] - prediction
  59. output_delta = output_error * activation_derivative(prediction)
  60.  
  61. # 2. Переносим ошибку назад на скрытый слой
  62. hidden_deltas = []
  63. for j in range(3):
  64. hidden_error = output_delta * weights_hidden_output[j][0]
  65. hidden_deltas.append(
  66. hidden_error * activation_derivative(hidden_layer_outputs[j])
  67. )
  68.  
  69. # 3. Корректируем веса между скрытым и выходным слоями
  70. for j in range(3):
  71. weights_hidden_output[j][0] += (
  72. learning_rate * output_delta * hidden_layer_outputs[j]
  73. )
  74.  
  75. # 4. Корректируем веса между входным и скрытым слоями
  76. for i in range(2):
  77. for j in range(3):
  78. weights_input_hidden[i][j] += (
  79. learning_rate * hidden_deltas[j] * inputs[i]
  80. )
  81.  
  82. print("Обучение многослойной сети завершено!\n")
  83.  
  84. # --- 5. ПРОВЕРКА РЕЗУЛЬТАТОВ ---
  85. print("--- ТЕСТИРОВАНИЕ СЕТИ ---")
  86. for inputs in training_inputs:
  87. # Повторяем только ПРЯМОЙ ХОД для проверки
  88. hidden_layer_outputs = []
  89. for j in range(3):
  90. sum_j = inputs[0] * weights_input_hidden[0][j] + inputs[1] * weights_input_hidden[1][j]
  91. hidden_layer_outputs.append(activation(sum_j))
  92.  
  93. final_sum = 0
  94. for j in range(3):
  95. final_sum += hidden_layer_outputs[j] * weights_hidden_output[j][0]
  96. prediction = activation(final_sum)
  97.  
  98. print(
  99. f"Входы: {inputs} -> Прогноз сети: {prediction:.4f} (Округляем до {round(prediction)})"
  100. )
  101.  
Success #stdin #stdout 0.72s 14164KB
stdin
Standard input is empty
stdout
Обучение многослойной сети завершено!

--- ТЕСТИРОВАНИЕ СЕТИ ---
Входы: [0, 0] -> Прогноз сети: 0.0231 (Округляем до 0)
Входы: [0, 1] -> Прогноз сети: 0.9635 (Округляем до 1)
Входы: [1, 0] -> Прогноз сети: 0.9696 (Округляем до 1)
Входы: [1, 1] -> Прогноз сети: 0.0288 (Округляем до 0)