# Let's break down the output layer gradient calculation print("Output layer gradient breakdown:") print("dz2 = 2 * (a2 - y) * sigmoid_derivative(z2)") # Step by step error = a2 - y # How far off our predictions are print(f"Error (a2 - y) shape: {error.shape}") print(f"Error values:\n{error.flatten()}") mse_gradient = 2 * error # Derivative of MSE print(f"\nMSE gradient (2 * error) shape: {mse_gradient.shape}") sigmoid_grad = sigmoid_derivative(z2) # Derivative of sigmoid print(f"Sigmoid gradient shape: {sigmoid_grad.shape}") dz2_step = mse_gradient * sigmoid_grad # Chain rule print(f"Combined gradient (dz2) shape: {dz2_step.shape}")