Skip to content

Commit 822a61b

Browse files
committed
Add sigmoid derivative function
1 parent 23f56dc commit 822a61b

File tree

4 files changed

+29
-9
lines changed

4 files changed

+29
-9
lines changed

learning.py

Lines changed: 13 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,8 @@
33
from 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

910
import 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+
507512
def 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

tests/test_learning.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -113,3 +113,5 @@ def test_random_weights():
113113

114114
for weight in test_weights:
115115
assert weight >= min_value and weight <= max_value
116+
117+

tests/test_utils.py

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -146,6 +146,16 @@ def test_sigmoid():
146146
assert isclose(0.2689414213699951, sigmoid(-1))
147147

148148

149+
def test_sigmoid_derivative():
150+
value = 1
151+
152+
assert sigmoid_derivative(value) == 0
153+
154+
value = 3
155+
156+
assert sigmoid_derivative(value) == -6
157+
158+
149159
def test_step():
150160
assert step(1) == step(0.5) == 1
151161
assert step(0) == 1

utils.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -249,6 +249,10 @@ def clip(x, lowest, highest):
249249
return max(lowest, min(x, highest))
250250

251251

252+
def sigmoid_derivative(value):
253+
return value * (1 - value)
254+
255+
252256
def sigmoid(x):
253257
"""Return activation value of x with sigmoid function"""
254258
return 1/(1 + math.exp(-x))

0 commit comments

Comments
 (0)