fork download
  1. import numpy as np
  2.  
  3. def sigmoid(x):
  4. """Сигмоидная функция активации"""
  5. return 1 / (1 + np.exp(-x))
  6.  
  7. def sigmoid_derivative(x):
  8. """Производная сигмоидной функции"""
  9. return x * (1 - x)
  10.  
  11. class SimpleNeuralNetwork:
  12. def __init__(self, input_size=2, hidden_size=4, output_size=1):
  13. """Инициализация нейронной сети"""
  14. # Веса между входным и скрытым слоями
  15. self.weights1 = np.random.uniform(-1, 1, (input_size, hidden_size))
  16. # Веса между скрытым и выходным слоями
  17. self.weights2 = np.random.uniform(-1, 1, (hidden_size, output_size))
  18. # Смещения (bias)
  19. self.bias1 = np.zeros((1, hidden_size))
  20. self.bias2 = np.zeros((1, output_size))
  21.  
  22. def forward(self, X):
  23. """Прямое распространение"""
  24. # Входной -> скрытый слой
  25. self.hidden_input = np.dot(X, self.weights1) + self.bias1
  26. self.hidden_output = sigmoid(self.hidden_input)
  27.  
  28. # Скрытый -> выходной слой
  29. self.final_input = np.dot(self.hidden_output, self.weights2) + self.bias2
  30. self.final_output = sigmoid(self.final_input)
  31.  
  32. return self.final_output
  33.  
  34. def backward(self, X, y, output, learning_rate=0.1):
  35. """Обратное распространение ошибки"""
  36. # Ошибка на выходном слое
  37. output_error = y - output
  38. output_delta = output_error * sigmoid_derivative(output)
  39.  
  40. # Ошибка на скрытом слое
  41. hidden_error = np.dot(output_delta, self.weights2.T)
  42. hidden_delta = hidden_error * sigmoid_derivative(self.hidden_output)
  43.  
  44. # Обновление весов и смещений
  45. self.weights2 += learning_rate * np.dot(self.hidden_output.T, output_delta)
  46. self.bias2 += learning_rate * np.sum(output_delta, axis=0, keepdims=True)
  47.  
  48. self.weights1 += learning_rate * np.dot(X.T, hidden_delta)
  49. self.bias1 += learning_rate * np.sum(hidden_delta, axis=0, keepdims=True)
  50.  
  51. def train(self, X, y, epochs=10000, learning_rate=0.1, verbose=True):
  52. """Обучение нейронной сети"""
  53. for epoch in range(epochs):
  54. # Прямое распространение
  55. output = self.forward(X)
  56.  
  57. # Обратное распространение
  58. self.backward(X, y, output, learning_rate)
  59.  
  60. # Вывод прогресса
  61. if verbose and epoch % 1000 == 0:
  62. loss = np.mean(np.square(y - output))
  63. print(f"Эпоха {epoch}, Loss: {loss:.6f}")
  64.  
  65. def predict(self, X):
  66. """Предсказание для новых данных"""
  67. output = self.forward(X)
  68. return (output > 0.5).astype(int), output
  69.  
  70. # Данные для XOR
  71. X = np.array([[0, 0],
  72. [0, 1],
  73. [1, 0],
  74. [1, 1]])
  75.  
  76. y = np.array([[0],
  77. [1],
  78. [1],
  79. [0]])
  80.  
  81. # Создание и обучение сети
  82. print("Создание нейронной сети для XOR...")
  83. nn = SimpleNeuralNetwork(input_size=2, hidden_size=4, output_size=1)
  84.  
  85. print("\nОбучение сети...")
  86. nn.train(X, y, epochs=10000, learning_rate=0.5)
  87.  
  88. # Проверка результатов
  89. print("\nРезультаты:")
  90. predictions, probabilities = nn.predict(X)
  91. for i, (x, pred, prob) in enumerate(zip(X, predictions, probabilities)):
  92. print(f"Вход: {x} -> Предсказание: {pred[0]} (вероятность: {prob[0]:.4f})")
  93.  
  94. # Дополнительная проверка точности
  95. accuracy = np.mean(predictions == y) * 100
  96. print(f"\nТочность: {accuracy:.2f}%")
Success #stdin #stdout 2.11s 41776KB
stdin
Standard input is empty
stdout
Создание нейронной сети для XOR...

Обучение сети...
Эпоха 0, Loss: 0.254868
Эпоха 1000, Loss: 0.157740
Эпоха 2000, Loss: 0.004370
Эпоха 3000, Loss: 0.001733
Эпоха 4000, Loss: 0.001047
Эпоха 5000, Loss: 0.000741
Эпоха 6000, Loss: 0.000569
Эпоха 7000, Loss: 0.000461
Эпоха 8000, Loss: 0.000386
Эпоха 9000, Loss: 0.000331

Результаты:
Вход: [0 0] -> Предсказание: 0 (вероятность: 0.0085)
Вход: [0 1] -> Предсказание: 1 (вероятность: 0.9817)
Вход: [1 0] -> Предсказание: 1 (вероятность: 0.9832)
Вход: [1 1] -> Предсказание: 0 (вероятность: 0.0216)

Точность: 100.00%