# your code goes here
import numpy as np
class TrainableXNOR:
def __init__(self, learning_rate=0.5):
# Увеличиваем начальные веса для лучшей сходимости
np.random.seed(42)
self.W1 = np.random.randn(2, 3) * 0.5 # 3 нейрона в скрытом слое
self.b1 = np.zeros((1, 3))
self.W2 = np.random.randn(3, 1) * 0.5
self.b2 = np.zeros((1, 1))
self.lr = learning_rate
def sigmoid(self, x):
# Защита от переполнения
x = np.clip(x, -500, 500)
return 1 / (1 + np.exp(-x))
def sigmoid_derivative(self, x):
return x * (1 - x)
def forward(self, X):
self.z1 = np.dot(X, self.W1) + self.b1
self.a1 = self.sigmoid(self.z1)
self.z2 = np.dot(self.a1, self.W2) + self.b2
self.a2 = self.sigmoid(self.z2)
return self.a2
def backward(self, X, y, output):
m = X.shape[0]
# Ошибка выходного слоя
error_output = output - y
# Градиент выходного слоя
delta2 = error_output * self.sigmoid_derivative(output)
dW2 = np.dot(self.a1.T, delta2) / m
db2 = np.sum(delta2, axis=0, keepdims=True) / m
# Ошибка скрытого слоя
error_hidden = np.dot(delta2, self.W2.T)
# Градиент скрытого слоя
delta1 = error_hidden * self.sigmoid_derivative(self.a1)
dW1 = np.dot(X.T, delta1) / m
db1 = np.sum(delta1, axis=0, keepdims=True) / m
# Обновление весов
self.W2 -= self.lr * dW2
self.b2 -= self.lr * db2
self.W1 -= self.lr * dW1
self.b1 -= self.lr * db1
def train(self, X, y, epochs=10000):
losses = []
for epoch in range(epochs):
# Прямой проход
output = self.forward(X)
# Вычисление ошибки
loss = np.mean((output - y) ** 2)
losses.append(loss)
# Обратный проход
self.backward(X, y, output)
# Вывод прогресса
if epoch % 2000 == 0:
predictions = output.flatten()
print(f"\nEpoch {epoch}, Loss: {loss:.6f}")
print("Predictions:", predictions)
print("Binary:", [1 if p > 0.5 else 0 for p in predictions])
return losses
# Данные
X = np.array([[0, 0], [0, 1], [1, 0], [1, 1]], dtype=np.float64)
y = np.array([[1], [0], [0], [1]], dtype=np.float64) # XNOR
# Создание и обучение сети
print("Обучение XNOR нейросети...")
network = TrainableXNOR(learning_rate=0.8)
losses = network.train(X, y, epochs=10000)
# Финальное тестирование
print("\n" + "="*50)
print("Финальные результаты:")
print("Input Target Output Predicted")
print("-"*50)
for i in range(len(X)):
output = network.forward(X[i:i+1])
predicted = 1 if output[0][0] > 0.5 else 0
status = "✓" if predicted == y[i][0] else "✗"
print(f"{X[i]} {int(y[i][0])} {output[0][0]:.6f} {predicted} {status}")
# Проверка точности
correct = 0
for i in range(len(X)):
output = network.forward(X[i:i+1])
predicted = 1 if output[0][0] > 0.5 else 0
if predicted == y[i][0]:
correct += 1
print(f"\nТочность: {correct}/{len(X)} ({(correct/len(X))*100:.1f}%)")
IyB5b3VyIGNvZGUgZ29lcyBoZXJlCmltcG9ydCBudW1weSBhcyBucAoKY2xhc3MgVHJhaW5hYmxlWE5PUjoKICAgIGRlZiBfX2luaXRfXyhzZWxmLCBsZWFybmluZ19yYXRlPTAuNSk6CiAgICAgICAgIyDQo9Cy0LXQu9C40YfQuNCy0LDQtdC8INC90LDRh9Cw0LvRjNC90YvQtSDQstC10YHQsCDQtNC70Y8g0LvRg9GH0YjQtdC5INGB0YXQvtC00LjQvNC+0YHRgtC4CiAgICAgICAgbnAucmFuZG9tLnNlZWQoNDIpCiAgICAgICAgc2VsZi5XMSA9IG5wLnJhbmRvbS5yYW5kbigyLCAzKSAqIDAuNSAgIyAzINC90LXQudGA0L7QvdCwINCyINGB0LrRgNGL0YLQvtC8INGB0LvQvtC1CiAgICAgICAgc2VsZi5iMSA9IG5wLnplcm9zKCgxLCAzKSkKICAgICAgICBzZWxmLlcyID0gbnAucmFuZG9tLnJhbmRuKDMsIDEpICogMC41CiAgICAgICAgc2VsZi5iMiA9IG5wLnplcm9zKCgxLCAxKSkKICAgICAgICBzZWxmLmxyID0gbGVhcm5pbmdfcmF0ZQogICAgCiAgICBkZWYgc2lnbW9pZChzZWxmLCB4KToKICAgICAgICAjINCX0LDRidC40YLQsCDQvtGCINC/0LXRgNC10L/QvtC70L3QtdC90LjRjwogICAgICAgIHggPSBucC5jbGlwKHgsIC01MDAsIDUwMCkKICAgICAgICByZXR1cm4gMSAvICgxICsgbnAuZXhwKC14KSkKICAgIAogICAgZGVmIHNpZ21vaWRfZGVyaXZhdGl2ZShzZWxmLCB4KToKICAgICAgICByZXR1cm4geCAqICgxIC0geCkKICAgIAogICAgZGVmIGZvcndhcmQoc2VsZiwgWCk6CiAgICAgICAgc2VsZi56MSA9IG5wLmRvdChYLCBzZWxmLlcxKSArIHNlbGYuYjEKICAgICAgICBzZWxmLmExID0gc2VsZi5zaWdtb2lkKHNlbGYuejEpCiAgICAgICAgc2VsZi56MiA9IG5wLmRvdChzZWxmLmExLCBzZWxmLlcyKSArIHNlbGYuYjIKICAgICAgICBzZWxmLmEyID0gc2VsZi5zaWdtb2lkKHNlbGYuejIpCiAgICAgICAgcmV0dXJuIHNlbGYuYTIKICAgIAogICAgZGVmIGJhY2t3YXJkKHNlbGYsIFgsIHksIG91dHB1dCk6CiAgICAgICAgbSA9IFguc2hhcGVbMF0KICAgICAgICAKICAgICAgICAjINCe0YjQuNCx0LrQsCDQstGL0YXQvtC00L3QvtCz0L4g0YHQu9C+0Y8KICAgICAgICBlcnJvcl9vdXRwdXQgPSBvdXRwdXQgLSB5CiAgICAgICAgCiAgICAgICAgIyDQk9GA0LDQtNC40LXQvdGCINCy0YvRhdC+0LTQvdC+0LPQviDRgdC70L7RjwogICAgICAgIGRlbHRhMiA9IGVycm9yX291dHB1dCAqIHNlbGYuc2lnbW9pZF9kZXJpdmF0aXZlKG91dHB1dCkKICAgICAgICBkVzIgPSBucC5kb3Qoc2VsZi5hMS5ULCBkZWx0YTIpIC8gbQogICAgICAgIGRiMiA9IG5wLnN1bShkZWx0YTIsIGF4aXM9MCwga2VlcGRpbXM9VHJ1ZSkgLyBtCiAgICAgICAgCiAgICAgICAgIyDQntGI0LjQsdC60LAg0YHQutGA0YvRgtC+0LPQviDRgdC70L7RjwogICAgICAgIGVycm9yX2hpZGRlbiA9IG5wLmRvdChkZWx0YTIsIHNlbGYuVzIuVCkKICAgICAgICAKICAgICAgICAjINCT0YDQsNC00LjQtdC90YIg0YHQutGA0YvRgtC+0LPQviDRgdC70L7RjwogICAgICAgIGRlbHRhMSA9IGVycm9yX2hpZGRlbiAqIHNlbGYuc2lnbW9pZF9kZXJpdmF0aXZlKHNlbGYuYTEpCiAgICAgICAgZFcxID0gbnAuZG90KFguVCwgZGVsdGExKSAvIG0KICAgICAgICBkYjEgPSBucC5zdW0oZGVsdGExLCBheGlzPTAsIGtlZXBkaW1zPVRydWUpIC8gbQogICAgICAgIAogICAgICAgICMg0J7QsdC90L7QstC70LXQvdC40LUg0LLQtdGB0L7QsgogICAgICAgIHNlbGYuVzIgLT0gc2VsZi5sciAqIGRXMgogICAgICAgIHNlbGYuYjIgLT0gc2VsZi5sciAqIGRiMgogICAgICAgIHNlbGYuVzEgLT0gc2VsZi5sciAqIGRXMQogICAgICAgIHNlbGYuYjEgLT0gc2VsZi5sciAqIGRiMQogICAgCiAgICBkZWYgdHJhaW4oc2VsZiwgWCwgeSwgZXBvY2hzPTEwMDAwKToKICAgICAgICBsb3NzZXMgPSBbXQogICAgICAgIGZvciBlcG9jaCBpbiByYW5nZShlcG9jaHMpOgogICAgICAgICAgICAjINCf0YDRj9C80L7QuSDQv9GA0L7RhdC+0LQKICAgICAgICAgICAgb3V0cHV0ID0gc2VsZi5mb3J3YXJkKFgpCiAgICAgICAgICAgIAogICAgICAgICAgICAjINCS0YvRh9C40YHQu9C10L3QuNC1INC+0YjQuNCx0LrQuAogICAgICAgICAgICBsb3NzID0gbnAubWVhbigob3V0cHV0IC0geSkgKiogMikKICAgICAgICAgICAgbG9zc2VzLmFwcGVuZChsb3NzKQogICAgICAgICAgICAKICAgICAgICAgICAgIyDQntCx0YDQsNGC0L3Ri9C5INC/0YDQvtGF0L7QtAogICAgICAgICAgICBzZWxmLmJhY2t3YXJkKFgsIHksIG91dHB1dCkKICAgICAgICAgICAgCiAgICAgICAgICAgICMg0JLRi9Cy0L7QtCDQv9GA0L7Qs9GA0LXRgdGB0LAKICAgICAgICAgICAgaWYgZXBvY2ggJSAyMDAwID09IDA6CiAgICAgICAgICAgICAgICBwcmVkaWN0aW9ucyA9IG91dHB1dC5mbGF0dGVuKCkKICAgICAgICAgICAgICAgIHByaW50KGYiXG5FcG9jaCB7ZXBvY2h9LCBMb3NzOiB7bG9zczouNmZ9IikKICAgICAgICAgICAgICAgIHByaW50KCJQcmVkaWN0aW9uczoiLCBwcmVkaWN0aW9ucykKICAgICAgICAgICAgICAgIHByaW50KCJCaW5hcnk6IiwgWzEgaWYgcCA+IDAuNSBlbHNlIDAgZm9yIHAgaW4gcHJlZGljdGlvbnNdKQogICAgICAgIAogICAgICAgIHJldHVybiBsb3NzZXMKCiMg0JTQsNC90L3Ri9C1ClggPSBucC5hcnJheShbWzAsIDBdLCBbMCwgMV0sIFsxLCAwXSwgWzEsIDFdXSwgZHR5cGU9bnAuZmxvYXQ2NCkKeSA9IG5wLmFycmF5KFtbMV0sIFswXSwgWzBdLCBbMV1dLCBkdHlwZT1ucC5mbG9hdDY0KSAgIyBYTk9SCgojINCh0L7Qt9C00LDQvdC40LUg0Lgg0L7QsdGD0YfQtdC90LjQtSDRgdC10YLQuApwcmludCgi0J7QsdGD0YfQtdC90LjQtSBYTk9SINC90LXQudGA0L7RgdC10YLQuC4uLiIpCm5ldHdvcmsgPSBUcmFpbmFibGVYTk9SKGxlYXJuaW5nX3JhdGU9MC44KQpsb3NzZXMgPSBuZXR3b3JrLnRyYWluKFgsIHksIGVwb2Nocz0xMDAwMCkKCiMg0KTQuNC90LDQu9GM0L3QvtC1INGC0LXRgdGC0LjRgNC+0LLQsNC90LjQtQpwcmludCgiXG4iICsgIj0iKjUwKQpwcmludCgi0KTQuNC90LDQu9GM0L3Ri9C1INGA0LXQt9GD0LvRjNGC0LDRgtGLOiIpCnByaW50KCJJbnB1dCAgVGFyZ2V0ICBPdXRwdXQgICAgIFByZWRpY3RlZCIpCnByaW50KCItIio1MCkKCmZvciBpIGluIHJhbmdlKGxlbihYKSk6CiAgICBvdXRwdXQgPSBuZXR3b3JrLmZvcndhcmQoWFtpOmkrMV0pCiAgICBwcmVkaWN0ZWQgPSAxIGlmIG91dHB1dFswXVswXSA+IDAuNSBlbHNlIDAKICAgIHN0YXR1cyA9ICLinJMiIGlmIHByZWRpY3RlZCA9PSB5W2ldWzBdIGVsc2UgIuKclyIKICAgIHByaW50KGYie1hbaV19ICAge2ludCh5W2ldWzBdKX0gICAgICB7b3V0cHV0WzBdWzBdOi42Zn0gICB7cHJlZGljdGVkfSB7c3RhdHVzfSIpCgojINCf0YDQvtCy0LXRgNC60LAg0YLQvtGH0L3QvtGB0YLQuApjb3JyZWN0ID0gMApmb3IgaSBpbiByYW5nZShsZW4oWCkpOgogICAgb3V0cHV0ID0gbmV0d29yay5mb3J3YXJkKFhbaTppKzFdKQogICAgcHJlZGljdGVkID0gMSBpZiBvdXRwdXRbMF1bMF0gPiAwLjUgZWxzZSAwCiAgICBpZiBwcmVkaWN0ZWQgPT0geVtpXVswXToKICAgICAgICBjb3JyZWN0ICs9IDEKCnByaW50KGYiXG7QotC+0YfQvdC+0YHRgtGMOiB7Y29ycmVjdH0ve2xlbihYKX0gKHsoY29ycmVjdC9sZW4oWCkpKjEwMDouMWZ9JSkiKQ==
Обучение XNOR нейросети...
Epoch 0, Loss: 0.268629
Predictions: [0.61521647 0.64757458 0.62071863 0.65098344]
Binary: [1, 1, 1, 1]
Epoch 2000, Loss: 0.249974
Predictions: [0.50153169 0.50817327 0.49181139 0.49869388]
Binary: [1, 1, 0, 0]
Epoch 4000, Loss: 0.248670
Predictions: [0.51964867 0.51047043 0.48709161 0.48414718]
Binary: [1, 1, 0, 0]
Epoch 6000, Loss: 0.077557
Predictions: [0.84046218 0.30756496 0.23545339 0.63292944]
Binary: [1, 0, 0, 1]
Epoch 8000, Loss: 0.006901
Predictions: [0.94409542 0.08542116 0.0858291 0.90093414]
Binary: [1, 0, 0, 1]
==================================================
Финальные результаты:
Input Target Output Predicted
--------------------------------------------------
[0. 0.] 1 0.963266 1 ✓
[0. 1.] 0 0.056341 0 ✓
[1. 0.] 0 0.056822 0 ✓
[1. 1.] 1 0.935191 1 ✓
Точность: 4/4 (100.0%)