def train_network(X, y, epochs=1000, learning_rate=1.0): """Train the neural network""" # Initialize weights np.random.seed(42) W1 = np.random.randn(2, 4) * 0.5 b1 = np.zeros((1, 4)) W2 = np.random.randn(4, 1) * 0.5 b2 = np.zeros((1, 1)) losses = [] for epoch in range(epochs): # Forward pass z1, a1, z2, predictions = forward_pass(X, W1, b1, W2, b2) # Compute loss loss = compute_loss(predictions, y) losses.append(loss) # Backward pass dW1, db1, dW2, db2 = backward_pass(X, y, z1, a1, z2, predictions, W1, b1, W2, b2) # Update weights W1 -= learning_rate * dW1 b1 -= learning_rate * db1 W2 -= learning_rate * dW2 b2 -= learning_rate * db2 # Print progress if epoch % 100 == 0: print(f"Epoch {epoch:4d}: Loss = {loss:.6f}") return W1, b1, W2, b2, losses # Train the network W1_trained, b1_trained, W2_trained, b2_trained, loss_history = train_network(X, y)