import numpy as np from keras.models import Sequential from keras.layers import Dense from keras.utils.vis_utils import plot_model # binary representation of the number def binary_encode(i, num_digits): s = "{0:b}".format(i).zfill(num_digits) return np.array([int(x) for x in s]) # one hot encoding for even and odd labels def one_hot_encode(i): if i % 2 == 0: return np.array([1, 0]) # even label else: return np.array([0, 1]) # odd label NUM_DIGITS = 10 train_X = np.array([binary_encode(i, NUM_DIGITS) for i in range(101, 2 ** NUM_DIGITS)]) train_Y = np.array([one_hot_encode(i) for i in range(101, 2 ** NUM_DIGITS)]) # model model = Sequential() model.add(Dense(10, input_dim=10, activation="relu")) model.add(Dense(5, activation="relu")) model.add(Dense(2, activation="softmax")) plot_model(model, to_file='model_plot.png', show_shapes=True, show_layer_names=True) model.compile(loss='categorical_crossentropy', optimizer='adagrad', metrics=["accuracy"]) model.fit(train_X, train_Y, nb_epoch=20, verbose=1) # one hot prediction to text def prediction_to_text(i, prediction): return ["even", "odd"][prediction] # try to predict even or odd for numbers from 1 to 100 numbers = np.arange(1, 101) test_X = np.array([binary_encode(i, NUM_DIGITS) for i in numbers]) test_Y = model.predict_classes(test_X) output = np.vectorize(prediction_to_text)(numbers, test_Y) #print('predicted', output) # correct answer answer = np.array([]) for i in numbers: if i % 2 == 0: answer = np.append(answer, "even") else: answer = np.append(answer, "odd") #print('correct', answer) # evaluate evaluate = np.array(answer == output) print(np.count_nonzero(evaluate == True) / len(output))