# Exam $$ \frac{\partial E}{\partial w_{jk}}= -e_j\cdot \sigma\left(\sum_i w_{ij} o\_i\right) \left(1-\sigma\left(\sum\_i w\_{ij} o\_i\right) \right) o\_i $$ $$w_{New} = w_{old}-\alpha \frac{\partial E}{\partial w} $$ ## Doing step by step ``` def af(x): sigmoid = 1/(1+np.exp(-x)) return sigmoid import numpy as np inN = 3 hiN= 4 outN=3 lr= 0.4 #weight W11 W21 W31 # W12 W22 W32 # ..... np.random.seed(53) wih=np.random.rand(hiN, inN)-0.5 who=np.random.rand(outN, hiN)-0.5 print("Wih: ", wih) print("Who: ", who) Wih: [[ 0.34666241 0.06116554 -0.0451246 ] [-0.14782509 0.08585138 0.03574974] [ 0.32745628 -0.2354578 -0.02162094] [-0.15221498 -0.36552168 -0.24002265]] Who: [[-0.45236532 -0.1057067 -0.12838381 0.05673292] [ 0.39749455 -0.33265411 -0.09279358 0.15235334] [ 0.06774908 0.06651886 0.0243551 0.10758002]] ``` ## Feedforward ``` inputList = [0.32, 0.27, 0.18] inputs = np.array(inputList, ndmin=2).T Xh = np.dot(wih, inputs) print('Xh: ', Xh) Oh = af(Xh) print('Oh:', Oh) # computing output Xo = np.dot(who, Oh) print('Xo: ', Xo) Oo = af(Xo) print('Oo: ', Oo) Xh: [[ 0.11932424] [-0.0176892 ] [ 0.03732063] [-0.19060372]] Oh: [[0.52979571] [0.49557782] [0.50932908] [0.45249281]] Xo: [[-0.33176547] [ 0.06741123] [ 0.12994239]] Oo: [[0.41781112] [0.51684643] [0.53243996]] ``` ## Backpropagation ``` inputList = [0.32, 0.27, 0.18] targetList = [0.82, 0.25, 0.44] inputs = np.array(inputList, ndmin=2).T target = np.array(targetList, ndmin=2).T #computting hidden layer Xh = np.dot(wih, inputs) Oh = af(Xh) # computing output Xo = np.dot(who, Oh) Oo = af(Xo) # Output error oe = target-Oo # E propagation hiddenE = np.dot(who.T, oe) # updating weights #who+=lr*np.dot(oe*Oo*(1-Oo), Oh.T) #wih+=lr*np.dot(hiddenE*Oh*(1-Oh), inputs.T) #print('New wih: ', wih) #print('New who: ', who) NewW=who-lr*np.dot(-oe*Oo*(1-Oo),Oh.T) NewW array([[-0.43163327, -0.08631366, -0.10845266, 0.07443995], [ 0.38337319, -0.34586342, -0.10636942, 0.14029244], [ 0.06287227, 0.06195702, 0.01966668, 0.10341479]]) newWho=who-lr*np.dot(-oe*Oo*(1-Oo), Oh.T) newWho array([[-0.43163327, -0.08631366, -0.10845266, 0.07443995], [ 0.38337319, -0.34586342, -0.10636942, 0.14029244], [ 0.06287227, 0.06195702, 0.01966668, 0.10341479]]) ``` ## Using class ``` import numpy as np class NeuralNetwork: # init method def __init__(self, inputN,hiddenN, outputN, lr): # creates a NN with three layers (input, hidden, output) # inputN - Number of input nodes # hiddenN - Number of hidden nodes self.inN=inputN self.hiN=hiddenN self.outN=outputN self.lr=lr #weight W11 W21 W31 # W12 W22 W32 # ..... np.random.seed(53) self.wih=np.random.rand(self.hiN, self.inN)-0.5 self.who=np.random.rand(self.outN,self.hiN)-0.5 print("Wih: ", self.wih) print("Who: ", self.who) pass # NN computing method def feedforward(self, inputList): # computing hidden output inputs = np.array(inputList, ndmin=2).T self.Xh = np.dot(self.wih, inputs) print('Xh: ', self.Xh) self.af = lambda x:1/(1+np.exp(-x)) self.Oh = self.af(self.Xh) print('Oh:', self.Oh) # computing output self.Xo = np.dot(self.who, self.Oh) print('Xo: ', self.Xo) self.Oo = self.af(self.Xo) print('Oo: ', self.Oo) pass # NN trainning method def backpropagation(self, inputList, targetList): # data lr = self.lr inputs = np.array(inputList, ndmin=2).T target = np.array(targetList, ndmin=2).T #computting hidden layer Xh = np.dot(self.wih, inputs) af = lambda x:1/(1+np.exp(-x)) Oh = af(Xh) # computing output Xo = np.dot(self.who, Oh) Oo = af(Xo) # Output error oe = target-Oo # E propagation hiddenE = np.dot(self.who.T, oe) # updating weights self.who+=lr*np.dot(oe*Oo*(1-Oo), Oh.T) self.wih+=lr*np.dot(hiddenE*Oh*(1-Oh), inputs.T) return self.wih, self.who ``` ``` NN = NeuralNetwork(3,4,3,0.4) Wih: [[ 0.34666241 0.06116554 -0.0451246 ] [-0.14782509 0.08585138 0.03574974] [ 0.32745628 -0.2354578 -0.02162094] [-0.15221498 -0.36552168 -0.24002265]] Who: [[-0.45236532 -0.1057067 -0.12838381 0.05673292] [ 0.39749455 -0.33265411 -0.09279358 0.15235334] [ 0.06774908 0.06651886 0.0243551 0.10758002]] ``` ``` NN.feedforward([0.32, 0.27, 0.18]) Xh: [[ 0.11932424] [-0.0176892 ] [ 0.03732063] [-0.19060372]] Oh: [[0.52979571] [0.49557782] [0.50932908] [0.45249281]] Xo: [[-0.33176547] [ 0.06741123] [ 0.12994239]] Oo: [[0.41781112] [0.51684643] [0.53243996]] ``` ``` NN.backpropagation([0.32, 0.27, 0.18], [0.82, 0.25, 0.44]) (array([[ 0.33727924, 0.05324849, -0.05040263], [-0.14654184, 0.08693412, 0.03647157], [ 0.32652462, -0.23624388, -0.02214499], [-0.15309598, -0.36626503, -0.24051822]]), array([[-0.43163327, -0.08631366, -0.10845266, 0.07443995], [ 0.38337319, -0.34586342, -0.10636942, 0.14029244], [ 0.06287227, 0.06195702, 0.01966668, 0.10341479]])) ```