# Feed Forward Implementations

import numpy as np

np.random.seed(42)


### Helper Function

def print_array(array):
print(array.shape)
print('\r')
print(array)


### Activation Function

def sigmoid(x):
"""
Calculate sigmoid
"""
return 1/(1+np.exp(-x))


### Network size

N_input = 4
N_hidden = 3
N_output = 2


### Data for Inputs

X = np.random.randn(N_input)
print_array(X)

(4,)

[ 0.49671415 -0.1382643   0.64768854  1.52302986]


### Weights

weights_input_to_hidden = np.random.normal(0,
scale=1,
size=(N_input, N_hidden))
weights_hidden_to_output = np.random.normal(0,
scale=1,
size=(N_hidden, N_output))

print_array(weights_input_to_hidden)

(4, 3)

[[-0.23415337 -0.23413696  1.57921282]
[ 0.76743473 -0.46947439  0.54256004]
[-0.46341769 -0.46572975  0.24196227]
[-1.91328024 -1.72491783 -0.56228753]]

print_array(weights_hidden_to_output)

(3, 2)

[[-1.01283112  0.31424733]
[-0.90802408 -1.4123037 ]
[ 1.46564877 -0.2257763 ]]


### Hidden Layer Calculations

hidden_layer_in = np.dot(X, weights_input_to_hidden)
hidden_layer_out = sigmoid(hidden_layer_in)

print_array(hidden_layer_in)

(3,)

[-3.43654939 -2.98013677  0.00973617]

print_array(hidden_layer_out)

(3,)

[0.03117253 0.04833134 0.50243402]


### Output Layer Calculations

output_layer_in = np.dot(hidden_layer_out, weights_hidden_to_output)
output_layer_out = sigmoid(output_layer_in)

print_array(output_layer_in)

(2,)

[ 0.66093328 -0.17190034]

print_array(output_layer_out)

(2,)

[0.65947001 0.45713043]