import numpy as np
def activation(x):
return 1.0 / (1.0 + np.exp(-x))
def initialise(no_nodes, mean=0.0, std=1.0):
return np.array([np.random.normal(mean, std, [no_nodes[i], no_nodes[i-1] + 1]) for i in range(1, len(no_nodes))])
def forward(nn, inputs):
outputs = inputs.transpose()
for w in nn:
outputs = np.vstack([outputs, np.ones(outputs.shape[1])])
outputs = np.matmul(w, outputs)
outputs = activation(outputs)
outputs = outputs.transpose()
return outputs
# Two inputs, five hidden, three hidden, two outputs
nn = initialise([2, 5, 3, 2])
# Show the weights
for i in nn:
print(i)
p = forward(nn, np.array([[1, 2],[3,4]]))
# Show the output
print(p)
inputs = np.random.uniform(0, 1, [1000, 2])
actuals = np.column_stack([inputs[:, 0] <= inputs[:, 1], inputs[:, 0] > inputs[:, 1]]).astype(float)
import matplotlib.pyplot as pl
pl.rcParams['figure.figsize'] = (16, 10)
blue = inputs[inputs[:, 0] <= inputs[:, 1]]
yell = inputs[inputs[:, 0] > inputs[:, 1]]
pl.plot(blue[:,0], blue[:,1], 'b.')
pl.plot(yell[:,0], yell[:,1], 'y.')
pl.show()
preds = forward(nn, inputs)
def cost(actuals, preds):
return 0.5 * (actuals - preds)**2
cost(actuals, preds)
preds * (1.0 - preds) * -(actuals - preds)
def back(nn, inputs, outputs):
for w in nn[]
return nn
# Do 1 training example first
def all_oij(nn, x):
oij = []
outputs = x.transpose()
for w in nn:
outputs = np.vstack([outputs, np.ones(outputs.shape[1])])
outputs = np.matmul(w, outputs)
outputs = activation(outputs)
oij.append(outputs.transpose())
return oij
oij = all_oij(nn, np.array([inputs[0]]))
oij
# For output layer
d_j_fin = (oij[-1] - actuals[0]) * oij[-1] * (1.0 - oij[-1])
deltas = np.tile(np.hstack([oij[-2], np.ones([1,1])]), [2,1]) * np.tile(d_j_fin.transpose(), [1,4])
eta = 0.001
# These are the new weights for last layer
nn[-1] - eta * deltas
d_j_fin.shape, nn[-1].shape
np.matmul(d_j_fin, nn[-1]) * np.hstack([oij[-2], np.ones([1,1])]) * (1.0 - np.hstack([oij[-2], np.ones([1,1])]))