The inputs must be the same length This is only supposed to separate linearly-separable data sets. Based on this code: import numpy as np def sigmoid(x): return 1 / (1 + np.exp(-x)) def sigmoid_derilative(x): return x * (1-x) training_inputs = np.array([[0,0,1], [1,1,1], [1,0,1], [0,1,1]]) training_outputs = np.array([[0,1,1,0]]).T np.random.seed(1) synaptic_weights = 2*np.random.random((3,1))-1 print(f'Random starting synaptic weights:') print(synaptic_weights) for iteration in range(120000): input_layer = training_inputs outputs = sigmoid(np.dot(input_layer, synaptic_weights)) error = training_outputs - outputs adjustments = error * sigmoid_derilative(outputs) synaptic_weights += np.dot(input_layer.T,adjustments) print('Synaptic weights after training') print(synaptic_weights) print('Outputs after training') print(outputs)