33from utils import (
44 removeall , unique , product , mode , argmax , argmax_random_tie , isclose ,
55 dotproduct , vector_add , scalar_vector_product , weighted_sample_with_replacement ,
6- weighted_sampler , num_or_str , normalize , clip , sigmoid , print_table , DataFile
6+ weighted_sampler , num_or_str , normalize , clip , sigmoid , print_table ,
7+ DataFile , sigmoid_derivative
78)
89
910import copy
@@ -504,6 +505,10 @@ def random_weights(min_value, max_value, num_weights):
504505 return [random .uniform (min_value , max_value ) for i in range (num_weights )]
505506
506507
508+ def sigmoid_derivative_value (node ):
509+ return node .value * (1 - node .value )
510+
511+
507512def BackPropagationLearner (dataset , net , learning_rate , epochs ):
508513 """[Figure 18.23] The back-propagation algorithm for multilayer network"""
509514 # Initialise weights
@@ -548,10 +553,11 @@ def BackPropagationLearner(dataset, net, learning_rate, epochs):
548553 delta = [[] for i in range (n_layers )]
549554
550555 # Compute outer layer delta
551- err = [t_val [i ] - o_nodes [i ].value
552- for i in range (o_units )]
553- delta [- 1 ] = [(o_nodes [i ].value ) * (1 - o_nodes [i ].value ) *
554- (err [i ]) for i in range (o_units )]
556+
557+ # Error for the MSE cost function
558+ err = [t_val [i ] - o_nodes [i ].value for i in range (o_units )]
559+ # The activation function used is the sigmoid function
560+ delta [- 1 ] = [sigmoid_derivative (o_nodes [i ].value ) * err [i ] for i in range (o_units )]
555561
556562 # Backward pass
557563 h_layers = n_layers - 2
@@ -560,11 +566,9 @@ def BackPropagationLearner(dataset, net, learning_rate, epochs):
560566 h_units = len (layer )
561567 nx_layer = net [i + 1 ]
562568 # weights from each ith layer node to each i + 1th layer node
563- w = [[node .weights [k ] for node in nx_layer ]
564- for k in range (h_units )]
569+ w = [[node .weights [k ] for node in nx_layer ] for k in range (h_units )]
565570
566- delta [i ] = [(layer [j ].value ) * (1 - layer [j ].value ) *
567- dotproduct (w [j ], delta [i + 1 ])
571+ delta [i ] = [sigmoid_derivative (layer [j ].value ) * dotproduct (w [j ], delta [i + 1 ])
568572 for j in range (h_units )]
569573
570574 # Update weights
0 commit comments