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