11from Classification .InstanceList .InstanceList import InstanceList
22from Classification .Model .NeuralNetworkModel import NeuralNetworkModel
3+ from Classification .Parameter .ActivationFunction import ActivationFunction
34from Classification .Parameter .DeepNetworkParameter import DeepNetworkParameter
45from Math .Matrix import Matrix
6+ from Math .Vector import Vector
57import copy
68
79from Classification .Performance .ClassificationPerformance import ClassificationPerformance
@@ -11,6 +13,7 @@ class DeepNetworkModel(NeuralNetworkModel):
1113
1214 __weights : list
1315 __hiddenLayerSize : int
16+ __activationFunction : ActivationFunction
1417
1518 def __init__ (self , trainSet : InstanceList , validationSet : InstanceList , parameters : DeepNetworkParameter ):
1619 """
@@ -36,6 +39,7 @@ def __init__(self, trainSet: InstanceList, validationSet: InstanceList, paramete
3639 deltaWeights = []
3740 hidden = []
3841 hiddenBiased = []
42+ self .__activationFunction = parameters .getActivationFunction ()
3943 self .__allocateWeights (parameters )
4044 bestWeights = self .__setBestWeights ()
4145 bestClassificationPerformance = ClassificationPerformance (0.0 )
@@ -50,18 +54,30 @@ def __init__(self, trainSet: InstanceList, validationSet: InstanceList, paramete
5054 deltaWeights .clear ()
5155 for k in range (self .__hiddenLayerSize ):
5256 if k == 0 :
53- hidden .append (self .calculateHidden (self .x , self .__weights [k ]))
57+ hidden .append (self .calculateHidden (self .x , self .__weights [k ], self . __activationFunction ))
5458 else :
55- hidden .append (self .calculateHidden (hiddenBiased [k - 1 ], self .__weights [k ]))
59+ hidden .append (self .calculateHidden (hiddenBiased [k - 1 ], self .__weights [k ], self . __activationFunction ))
5660 hiddenBiased .append (hidden [k ].biased ())
5761 rMinusY = self .calculateRMinusY (trainSet .get (j ), hiddenBiased [self .__hiddenLayerSize - 1 ],
5862 self .__weights [len (self .__weights ) - 1 ])
5963 deltaWeights .insert (0 , Matrix (rMinusY , hiddenBiased [self .__hiddenLayerSize - 1 ]))
6064 for k in range (len (self .__weights ) - 2 , - 1 , - 1 ):
61- oneMinusHidden = self .calculateOneMinusHidden (hidden [k ])
62- tmph = deltaWeights [0 ].elementProduct (self .__weights [k + 1 ]).sumOfRows ()
65+ if k == len (self .__weights ) - 2 :
66+ tmph = self .__weights [k + 1 ].multiplyWithVectorFromLeft (rMinusY )
67+ else :
68+ tmph = self .__weights [k + 1 ].multiplyWithVectorFromLeft (tmpHidden )
6369 tmph .remove (0 )
64- tmpHidden = oneMinusHidden .elementProduct (tmph )
70+ if self .__activationFunction == ActivationFunction .SIGMOID :
71+ oneMinusHidden = self .calculateOneMinusHidden (hidden [k ])
72+ activationDerivative = oneMinusHidden .elementProduct (hidden [k ])
73+ elif self .__activationFunction == ActivationFunction .TANH :
74+ one = Vector (hidden [k ].size (), 1.0 )
75+ hidden [k ].tanh ()
76+ activationDerivative = one .difference (hidden [k ].elementProduct (hidden [k ]))
77+ elif self .__activationFunction == ActivationFunction .RELU :
78+ hidden [k ].reluDerivative ()
79+ activationDerivative = hidden
80+ tmpHidden = tmph .elementProduct (activationDerivative )
6581 if k == 0 :
6682 deltaWeights .insert (0 , Matrix (tmpHidden , self .x ))
6783 else :
@@ -121,8 +137,8 @@ def calculateOutput(self):
121137 hiddenBiased = None
122138 for i in range (len (self .__weights ) - 1 ):
123139 if i == 0 :
124- hidden = self .calculateHidden (self .x , self .__weights [i ])
140+ hidden = self .calculateHidden (self .x , self .__weights [i ], self . __activationFunction )
125141 else :
126- hidden = self .calculateHidden (hiddenBiased , self .__weights [i ])
142+ hidden = self .calculateHidden (hiddenBiased , self .__weights [i ], self . __activationFunction )
127143 hiddenBiased = hidden .biased ()
128144 self .y = self .__weights [len (self .__weights ) - 1 ].multiplyWithVectorFromRight (hiddenBiased )
0 commit comments