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

Обучение сети...
Эпоха 0, Loss: 0.249785

Результаты:
Вход: [0 0] -> Предсказание: 1 (вероятность: 0.9204)
Вход: [0 1] -> Предсказание: 0 (вероятность: 0.0992)
Вход: [1 0] -> Предсказание: 0 (вероятность: 0.1117)
Вход: [1 1] -> Предсказание: 1 (вероятность: 0.8756)

Точность: 100.00%