fork download
  1. # your code goes here
  2. import numpy as np
  3.  
  4. class TrainableXNOR:
  5. def __init__(self, learning_rate=0.1):
  6. # Инициализация весов случайными значениями
  7. np.random.seed(42)
  8. self.W1 = np.random.randn(2, 2) * 0.01
  9. self.b1 = np.zeros((1, 2))
  10. self.W2 = np.random.randn(2, 1) * 0.01
  11. self.b2 = np.zeros((1, 1))
  12. self.lr = learning_rate
  13.  
  14. def sigmoid(self, x):
  15. return 1 / (1 + np.exp(-np.clip(x, -700, 700)))
  16.  
  17. def sigmoid_derivative(self, x):
  18. return x * (1 - x)
  19.  
  20. def forward(self, X):
  21. self.z1 = np.dot(X, self.W1) + self.b1
  22. self.a1 = self.sigmoid(self.z1)
  23. self.z2 = np.dot(self.a1, self.W2) + self.b2
  24. self.a2 = self.sigmoid(self.z2)
  25. return self.a2
  26.  
  27. def backward(self, X, y, output):
  28. m = X.shape[0]
  29.  
  30. # Градиент выходного слоя
  31. dz2 = output - y
  32. dW2 = (1/m) * np.dot(self.a1.T, dz2)
  33. db2 = (1/m) * np.sum(dz2, axis=0, keepdims=True)
  34.  
  35. # Градиент скрытого слоя
  36. da1 = np.dot(dz2, self.W2.T)
  37. dz1 = da1 * self.sigmoid_derivative(self.a1)
  38. dW1 = (1/m) * np.dot(X.T, dz1)
  39. db1 = (1/m) * np.sum(dz1, axis=0, keepdims=True)
  40.  
  41. # Обновление параметров
  42. self.W2 -= self.lr * dW2
  43. self.b2 -= self.lr * db2
  44. self.W1 -= self.lr * dW1
  45. self.b1 -= self.lr * db1
  46.  
  47. def train(self, X, y, epochs=10000):
  48. losses = []
  49. for epoch in range(epochs):
  50. output = self.forward(X)
  51. loss = np.mean((output - y) ** 2)
  52. losses.append(loss)
  53. self.backward(X, y, output)
  54.  
  55. if epoch % 1000 == 0:
  56. print(f"Epoch {epoch}, Loss: {loss:.6f}")
  57. return losses
  58.  
  59. # Данные для обучения
  60. X = np.array([[0, 0], [0, 1], [1, 0], [1, 1]])
  61. y = np.array([[1], [0], [0], [1]]) # XNOR
  62.  
  63. # Обучение и тестирование
  64. network = TrainableXNOR(learning_rate=0.5)
  65. losses = network.train(X, y, epochs=10000)
  66.  
  67. print("\nРезультаты после обучения:")
  68. print("Input Target Output Predicted")
  69. for i in range(len(X)):
  70. output = network.forward(X[i].reshape(1, -1))
  71. predicted = 1 if output > 0.5 else 0
  72. print(f"{X[i]} {y[i][0]} {output[0][0]:.4f} {predicted}")
Success #stdin #stdout 2.11s 42132KB
stdin
Standard input is empty
stdout
Epoch 0, Loss: 0.250000
Epoch 1000, Loss: 0.250000
Epoch 2000, Loss: 0.250000
Epoch 3000, Loss: 0.250000
Epoch 4000, Loss: 0.250000
Epoch 5000, Loss: 0.250000
Epoch 6000, Loss: 0.250000
Epoch 7000, Loss: 0.250000
Epoch 8000, Loss: 0.250000
Epoch 9000, Loss: 0.250000

Результаты после обучения:
Input  Target  Output    Predicted
[0 0]   1      0.5000    1
[0 1]   0      0.5000    0
[1 0]   0      0.5000    1
[1 1]   1      0.5000    0