Upload MLP.py
Browse files
MLP.py
ADDED
|
@@ -0,0 +1,69 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
import numpy as np
|
| 2 |
+
|
| 3 |
+
# ํ์ดํผํ๋ผ๋ฏธํฐ ์ค์
|
| 4 |
+
input_size = 2 # ์
๋ ฅ์ธต ๋
ธ๋ ์
|
| 5 |
+
hidden_size = 3 # ์๋์ธต ๋
ธ๋ ์
|
| 6 |
+
output_size = 1 # ์ถ๋ ฅ์ธต ๋
ธ๋ ์
|
| 7 |
+
learning_rate = 0.5 # ํ์ต๋ฅ
|
| 8 |
+
epochs = 10000 # ํ์ต ๋ฐ๋ณต ํ์
|
| 9 |
+
|
| 10 |
+
# 1. ๋ฐ์ดํฐ์
์ ์ (XOR ๋ฌธ์ )
|
| 11 |
+
# ์
๋ ฅ ๋ฐ์ดํฐ: [0,0], [0,1], [1,0], [1,1]
|
| 12 |
+
X = np.array([[0, 0], [0, 1], [1, 0], [1, 1]])
|
| 13 |
+
# ์ ๋ต ๋ ์ด๋ธ: [0], [1], [1], [0]
|
| 14 |
+
y = np.array([[0], [1], [1], [0]])
|
| 15 |
+
|
| 16 |
+
# 2. ๊ฐ์ค์น(W)์ ํธํฅ(b) ์ด๊ธฐํ
|
| 17 |
+
W1 = np.random.randn(input_size, hidden_size)
|
| 18 |
+
b1 = np.random.randn(hidden_size)
|
| 19 |
+
W2 = np.random.randn(hidden_size, output_size)
|
| 20 |
+
b2 = np.random.randn(output_size)
|
| 21 |
+
|
| 22 |
+
# 3. ํ์ฑํ ํจ์์ ๊ทธ ๋ฏธ๋ถ ํจ์ ์ ์
|
| 23 |
+
def sigmoid(x):
|
| 24 |
+
return 1 / (1 + np.exp(-x))
|
| 25 |
+
|
| 26 |
+
def sigmoid_derivative(x):
|
| 27 |
+
return x * (1 - x)
|
| 28 |
+
|
| 29 |
+
# 4. ํ์ต ์์
|
| 30 |
+
for epoch in range(epochs):
|
| 31 |
+
# ์์ ํ (Forward Propagation)
|
| 32 |
+
# ์๋์ธต
|
| 33 |
+
hidden_output = np.dot(X, W1) + b1
|
| 34 |
+
hidden_activation = sigmoid(hidden_output)
|
| 35 |
+
|
| 36 |
+
# ์ถ๋ ฅ์ธต
|
| 37 |
+
output_output = np.dot(hidden_activation, W2) + b2
|
| 38 |
+
predicted_output = sigmoid(output_output)
|
| 39 |
+
|
| 40 |
+
# ์ญ์ ํ (Backpropagation)
|
| 41 |
+
# 1๋จ๊ณ: ์ถ๋ ฅ์ธต์ ์ค์ฐจ์ ๊ธฐ์ธ๊ธฐ ๊ณ์ฐ
|
| 42 |
+
error_output = y - predicted_output
|
| 43 |
+
delta_output = error_output * sigmoid_derivative(predicted_output)
|
| 44 |
+
|
| 45 |
+
# 2๋จ๊ณ: ์๋์ธต์ ์ค์ฐจ์ ๊ธฐ์ธ๊ธฐ ๊ณ์ฐ
|
| 46 |
+
error_hidden = np.dot(delta_output, W2.T)
|
| 47 |
+
delta_hidden = error_hidden * sigmoid_derivative(hidden_activation)
|
| 48 |
+
|
| 49 |
+
# 3๋จ๊ณ: ๊ฐ์ค์น์ ํธํฅ ์
๋ฐ์ดํธ
|
| 50 |
+
W2 += np.dot(hidden_activation.T, delta_output) * learning_rate
|
| 51 |
+
b2 += np.sum(delta_output, axis=0) * learning_rate
|
| 52 |
+
W1 += np.dot(X.T, delta_hidden) * learning_rate
|
| 53 |
+
b1 += np.sum(delta_hidden, axis=0) * learning_rate
|
| 54 |
+
|
| 55 |
+
# ๋งค 1000๋ฒ์งธ epoch๋ง๋ค ์ค์ฐจ ์ถ๋ ฅ
|
| 56 |
+
if epoch % 1000 == 0:
|
| 57 |
+
loss = np.mean(np.abs(error_output))
|
| 58 |
+
print(f"Epoch: {epoch}, Loss: {loss:.4f}")
|
| 59 |
+
|
| 60 |
+
print("\n--- ํ์ต ์๋ฃ ---")
|
| 61 |
+
|
| 62 |
+
# 5. ํ์ต๋ ๋ชจ๋ธ๋ก ์์ธก (๊ฒฐ๊ณผ ํ์ธ)
|
| 63 |
+
hidden_output_final = np.dot(X, W1) + b1
|
| 64 |
+
hidden_activation_final = sigmoid(hidden_output_final)
|
| 65 |
+
predicted_final = sigmoid(np.dot(hidden_activation_final, W2) + b2)
|
| 66 |
+
|
| 67 |
+
print("์
๋ ฅ ๋ฐ์ดํฐ:\n", X)
|
| 68 |
+
print("์์ธก ๊ฒฐ๊ณผ:\n", predicted_final.round())
|
| 69 |
+
print("์ ๋ต ๋ ์ด๋ธ:\n", y)
|