Files
neural-network/main.py

61 lines
1.9 KiB
Python

from network import *
def data(size:int, max_val: int):
def int_to_bits(n: int):
return [(n >> i) & 1
for i in reversed(range(size))
]
return [(int_to_bits(i),[i / max_val])
for i in range(max_val + 1)
]
def binatodeci(binary: list[int]):
return sum(val*(2**idx) for idx, val in enumerate(reversed(binary)))
def train_network(network: NeuralNetwork, epochs=10000, learning_rate=0.1,
verbose: bool = False, size_data: int = 8, max_val: int = 255):
train_data = data(size_data, max_val)
for epoch in range(epochs):
for bits, target in train_data:
network.backward(bits, target, learning_rate)
if verbose and epoch % 100 == 0:
output = network.forward(bits)[0]
loss = (output - target[0]) ** 2
print(f"Epoch: {epoch}, Loss: {loss:.6f} {(loss*100):.6f}%")
def main():
size = 4
max_val = (1 << size) - 1
epoch_size = 6_500
network = NeuralNetwork([size, 16, 1])
print("Start training...")
train_network(network, verbose=True, size_data=size, epochs=epoch_size, max_val=max_val)
print("End training...")
while True:
string = input(f"Enter {size} bit number (ex: {''.join([str(random.randint(0, 1)) for i in range(size)])}) or 'quit' to close: ") \
.strip().lower()
if (string == 'quit'): break
if (len(string) != size or any (char not in '01' for char in string)):
print(f"Error: please enter exactly {size} bits (only 0 or 1).")
continue
bits_input = [int(char) for char in string]
output = network.forward(bits_input)[0] * max_val
print("\n===== Estimated value =====")
print(f"{output} (approx: {round(output)})")
print("\n===== Real value =====")
print(f"{binatodeci(bits_input)}\n")
if __name__ == "__main__":
main()