49 |
open InitVisitor |
open InitVisitor |
50 |
open DefaultVisitor |
open DefaultVisitor |
51 |
open TdNN |
open TdNN |
|
|
|
52 |
|
|
53 |
|
|
54 |
(** |
(** |
55 |
Initializes the output activation. |
Initializes a Time Delay Neural Network. |
|
*) |
|
|
let initOutputActivation network = |
|
|
let outputActivation = Array.make network#getLayerNb [|[||]|] in |
|
|
for i = 0 to network#getLayerNb - 1 do |
|
|
outputActivation.(i) <- Array.make (network#getFeaturesNb i) [||]; |
|
|
for j = 0 to (network#getFeaturesNb i) - 1 do |
|
|
outputActivation.(i).(j) <- Array.make (network#getTimeNb i) 0.0 |
|
|
done |
|
|
done; |
|
|
network#setOutputActivation outputActivation |
|
|
|
|
|
(** |
|
|
Initializes the the input sum. |
|
|
*) |
|
|
let initInputSum network = |
|
|
let inputSum = Array.make network#getLayerNb [|[||]|] in |
|
|
for i = 0 to network#getLayerNb - 1 do |
|
|
inputSum.(i) <- Array.create (network#getFeaturesNb i) [||]; |
|
|
for j = 0 to (network#getFeaturesNb i) - 1 do |
|
|
inputSum.(i).(j) <- Array.create (network#getTimeNb i) 0.0 |
|
|
done |
|
|
done; |
|
|
network#setInputSum inputSum |
|
|
|
|
|
(** |
|
|
Initializes the error. |
|
|
*) |
|
|
let initError network = |
|
|
let error = Array.make network#getLayerNb [|[||]|] in |
|
|
for i = 0 to network#getLayerNb - 1 do |
|
|
error.(i) <- Array.make (network#getFeaturesNb i) [||]; |
|
|
for j = 0 to (network#getFeaturesNb i) - 1 do |
|
|
error.(i).(j) <- Array.make (network#getTimeNb i) 0.0 |
|
|
done |
|
|
done; |
|
|
network#setError error |
|
|
|
|
|
(** |
|
|
Initializes the weights (using random numbers). |
|
56 |
*) |
*) |
|
let initWeights network = |
|
|
let weights = Array.make (network#getLayerNb - 1) [|[|[||]|]|] in |
|
|
for i = 0 to network#getLayerNb - 2 do |
|
|
weights.(i) <- Array.make (network#getFeaturesNb i) [|[||]|]; |
|
|
for j = 0 to (network#getFeaturesNb i) - 1 do |
|
|
weights.(i).(j) <- Array.make (network#getFeaturesNb (i + 1)) [||]; |
|
|
for k = 0 to (network#getFeaturesNb (i + 1)) - 1 do |
|
|
weights.(i).(j).(k) <- Array.make (network#getTimeNb i) (Random.float (Env.getEnv())#getRandLimit) |
|
|
done |
|
|
done |
|
|
done; |
|
|
network#setWeights weights |
|
|
|
|
|
(** |
|
|
Initializes the gradients. |
|
|
*) |
|
|
let initGradients network = |
|
|
let gradients = Array.make (network#getLayerNb - 1) [|[|[||]|]|] in |
|
|
for i = 0 to network#getLayerNb - 2 do |
|
|
gradients.(i) <- Array.make (network#getFeaturesNb i) [|[||]|]; |
|
|
for j = 0 to (network#getFeaturesNb i) - 1 do |
|
|
gradients.(i).(j) <- Array.make (network#getFeaturesNb (i + 1)) [||]; |
|
|
for k = 0 to (network#getFeaturesNb (i + 1)) - 1 do |
|
|
gradients.(i).(j).(k) <- Array.make (network#getTimeNb i) (Random.float (Env.getEnv())#getRandLimit) |
|
|
done |
|
|
done |
|
|
done; |
|
|
network#setGradients gradients |
|
|
|
|
57 |
class initTdnnVisitor = |
class initTdnnVisitor = |
58 |
object |
object |
59 |
inherit [tdNN] initVisitor |
inherit [tdNN] initVisitor |
60 |
|
|
61 |
|
initializer |
62 |
|
_moduleName <- "TDNN initialization" |
63 |
|
|
64 |
(** |
(** |
65 |
The method which initializes the networks. |
The method which initializes the network. |
66 |
It uses the Random module to initialize the weights. |
It uses the Random module to initialize the weights. |
67 |
@see |
@see |
68 |
<http://caml.inria.fr/oreilly-book/html/book-ora076.html> |
<http://caml.inria.fr/oreilly-book/html/book-ora076.html> |
73 |
*) |
*) |
74 |
method visit (network : tdNN) = |
method visit (network : tdNN) = |
75 |
|
|
76 |
(** Initialize the random number generator. *) |
(** |
77 |
Random.self_init(); |
First, define a bunch of functions which initializes the different |
78 |
|
stuffs. |
79 |
(** Initialize everything *) |
*) |
|
initOutputActivation network; |
|
|
initInputSum network; |
|
|
initError network; |
|
|
initGradients network; |
|
|
initWeights network |
|
80 |
|
|
81 |
|
let featuresNb = network#getFeaturesNb and |
82 |
|
timeNb = network#getTimeNb in |
83 |
|
|
84 |
|
(** |
85 |
|
Initializes the output activation. |
86 |
|
*) |
87 |
|
let initOutputActivation network = |
88 |
|
let outputActivation = |
89 |
|
Array.make network#getLayerNb [|[||]|] in |
90 |
|
for i = 0 to network#getLayerNb - 1 do |
91 |
|
outputActivation.(i) <- Array.make (featuresNb.(i)) [||]; |
92 |
|
for j = 0 to (featuresNb.(i)) - 1 do |
93 |
|
outputActivation.(i).(j) <- Array.make (timeNb.(i)) 0.0 |
94 |
|
done |
95 |
|
done; |
96 |
|
network#setOutputActivation outputActivation |
97 |
|
and |
98 |
|
|
99 |
|
(** |
100 |
|
Initializes the the input sum. |
101 |
|
*) |
102 |
|
initInputSum (network : tdNN) = |
103 |
|
let inputSum = Array.make network#getLayerNb [|[||]|] in |
104 |
|
for i = 0 to network#getLayerNb - 1 do |
105 |
|
inputSum.(i) <- Array.create (featuresNb.(i)) [||]; |
106 |
|
for j = 0 to (featuresNb.(i)) - 1 do |
107 |
|
inputSum.(i).(j) <- Array.create (timeNb.(i)) 0.0 |
108 |
|
done |
109 |
|
done; |
110 |
|
network#setInputSum inputSum |
111 |
|
and |
112 |
|
|
113 |
|
(** |
114 |
|
Initializes the error. |
115 |
|
*) |
116 |
|
initError (network : tdNN) = |
117 |
|
let error = Array.make network#getLayerNb [|[||]|] in |
118 |
|
for i = 0 to network#getLayerNb - 1 do |
119 |
|
error.(i) <- Array.make (featuresNb.(i)) [||]; |
120 |
|
for j = 0 to (featuresNb.(i)) - 1 do |
121 |
|
error.(i).(j) <- Array.make (timeNb.(i)) 0.0 |
122 |
|
done |
123 |
|
done; |
124 |
|
network#setError error |
125 |
|
and |
126 |
|
|
127 |
|
(** |
128 |
|
Initializes the weights (using random numbers). |
129 |
|
*) |
130 |
|
initWeights (network : tdNN) = |
131 |
|
let weights = Array.make (network#getLayerNb - 1) [|[|[||]|]|] in |
132 |
|
for i = 0 to network#getLayerNb - 2 do |
133 |
|
weights.(i) <- Array.make (featuresNb.(i)) [|[||]|]; |
134 |
|
for j = 0 to (featuresNb.(i)) - 1 do |
135 |
|
weights.(i).(j) |
136 |
|
<- Array.make (featuresNb.(i + 1)) [||]; |
137 |
|
for k = 0 to (featuresNb.(i + 1)) - 1 do |
138 |
|
weights.(i).(j).(k) |
139 |
|
<- Array.make (timeNb.(i)) |
140 |
|
(Random.float (Env.getEnv())#getRandLimit) |
141 |
|
done |
142 |
|
done |
143 |
|
done; |
144 |
|
network#setWeights weights |
145 |
|
and |
146 |
|
|
147 |
|
(** |
148 |
|
Initializes the gradients. |
149 |
|
*) |
150 |
|
initGradients (network : tdNN) = |
151 |
|
let gradients = Array.make (network#getLayerNb - 1) [|[|[||]|]|] in |
152 |
|
for i = 0 to network#getLayerNb - 2 do |
153 |
|
gradients.(i) <- Array.make (featuresNb.(i)) [|[||]|]; |
154 |
|
for j = 0 to (featuresNb.(i)) - 1 do |
155 |
|
gradients.(i).(j) |
156 |
|
<- Array.make (featuresNb.(i + 1)) [||]; |
157 |
|
for k = 0 to (featuresNb.(i + 1)) - 1 do |
158 |
|
gradients.(i).(j).(k) |
159 |
|
<- Array.make (timeNb.(i)) |
160 |
|
(Random.float (Env.getEnv())#getRandLimit) |
161 |
|
done |
162 |
|
done |
163 |
|
done; |
164 |
|
network#setGradients gradients |
165 |
|
in |
166 |
|
|
167 |
|
(** Initialize the random number generator. *) |
168 |
|
Random.self_init(); |
169 |
|
|
170 |
|
(** Initialize everything *) |
171 |
|
initOutputActivation network; |
172 |
|
initInputSum network; |
173 |
|
initError network; |
174 |
|
initGradients network; |
175 |
|
initWeights network |
176 |
|
|
177 |
end |
end |