Changeset 40319 for trunk/Ohana/src/opihi/lib.data/nnet.c
- Timestamp:
- Jan 23, 2018, 10:11:50 AM (9 years ago)
- File:
-
- 1 edited
-
trunk/Ohana/src/opihi/lib.data/nnet.c (modified) (15 diffs)
Legend:
- Unmodified
- Added
- Removed
-
trunk/Ohana/src/opihi/lib.data/nnet.c
r40317 r40319 1 1 # include "data.h" 2 3 typedef struct {4 char *name;5 int Nlayers; // Nlayers = input layer + output layer + hidden layers6 int *Nnodes; // number of nodes per layer7 float **weights; // a matrix between each layer8 float **biases; // a vector for each layer9 10 float **zvalue; // a vector of z values for each layer (= w*input + b)11 float **svalue; // a vector of s values for each layer (= sigmoid(z))12 float **sprime; //13 float **delta; //14 15 float ** Nabla_b; // a vector of Nabla_b values for each layer16 float **dNabla_b; // a vector of Nabla_b values for each layer17 18 float ** Nabla_w; // a matrix of Nabla_w values for each layer19 float **dNabla_w; // a matrix of Nabla_w values for each layer20 } NNet;21 2 22 3 static Nnet **nnets = NULL; /* nnet to store the list of all nnets */ … … 34 15 int i; 35 16 36 for (i = 0; i < Nnnets; i++) { 37 FreeNnet (nnets[i]); 17 if (!nnets) InitNnets(); 18 19 for (i = 0; i < Nnnets; i++) { 20 FreeNnetData (nnets[i]); 21 free (nnets[i]); 38 22 } 39 23 free (nnets); … … 46 30 nnet[0].name = strcreate (name); 47 31 48 nnet[0].Nlayer s= 0;32 nnet[0].Nlayer = 0; 49 33 nnet[0].Nnodes = NULL; 50 nnet[0].weight s= NULL;34 nnet[0].weight = NULL; 51 35 nnet[0].biases = NULL; 52 nnet[0]. avalue = NULL;36 nnet[0].svalue = NULL; 53 37 nnet[0].zvalue = NULL; 38 nnet[0].sprime = NULL; 39 nnet[0].delta = NULL; 54 40 55 41 nnet[0]. Nabla_b = NULL; … … 64 50 65 51 free (nnet[0].name); 66 for (i = 0; i < nnet[0].Nlayer s; i++) {67 free (nnet[0].weight s[i]);52 for (i = 0; i < nnet[0].Nlayer; i++) { 53 free (nnet[0].weight[i]); 68 54 free (nnet[0].biases[i]); 69 55 free (nnet[0].svalue[i]); … … 78 64 } 79 65 free (nnet[0].Nnodes); 80 free (nnet[0].weight s);66 free (nnet[0].weight); 81 67 free (nnet[0].biases); 82 68 free (nnet[0].svalue); … … 94 80 Nnet *GetNnet (int where) { 95 81 82 if (!nnets) InitNnets(); 83 96 84 if (where < 0) where += Nnnets; 97 85 if (where < 0) return NULL; … … 105 93 int i; 106 94 95 if (!nnets) InitNnets(); 96 107 97 for (i = 0; i < Nnnets; i++) { 108 98 if (!strcmp (nnets[i][0].name, name)) { … … 113 103 } 114 104 115 /* make a new named nnet with Nlayer s*/105 /* make a new named nnet with Nlayer */ 116 106 Nnet *CreateNnet (char *name, int Nlayer) { 117 107 118 108 int N; 119 109 Nnet *nnet; 110 111 if (!nnets) InitNnets(); 120 112 121 113 nnet = FindNnet (name); 122 114 if (nnet != NULL) { 123 115 FreeNnetData (nnet); 124 InitNnetData (nnet );116 InitNnetData (nnet, name); 125 117 return (nnet); 126 118 } … … 134 126 nnet[0].Nlayer = Nlayer; 135 127 ALLOCATE (nnet[0].Nnodes, int, Nlayer); 136 ALLOCATE (nnet[0].weight s, float *, Nlayer);128 ALLOCATE (nnet[0].weight, float *, Nlayer); 137 129 ALLOCATE (nnet[0].biases, float *, Nlayer); 138 130 ALLOCATE (nnet[0].svalue, float *, Nlayer); … … 155 147 ohana_gaussdev_init (); 156 148 157 for (int i = 1; i < Nlayer; i++) { 149 // NOTE : none of these elements are used for the first layer (the input layer) 150 // EXCEPT svalue[0] 151 152 nnet[0].weight[0] = NULL; 153 nnet[0].biases[0] = NULL; 154 nnet[0].zvalue[0] = NULL; 155 nnet[0].sprime[0] = NULL; 156 nnet[0].delta [0] = NULL; 157 nnet[0]. Nabla_b[0] = NULL; 158 nnet[0].dNabla_b[0] = NULL; 159 nnet[0]. Nabla_w[0] = NULL; 160 nnet[0].dNabla_w[0] = NULL; 161 162 ALLOCATE (nnet[0].svalue[0], float, nnet[0].Nnodes[0]); 163 164 for (int i = 1; i < nnet[0].Nlayer; i++) { 158 165 ALLOCATE (nnet[0].biases[i], float, nnet[0].Nnodes[i]); // biases for each node in the hidden and output layers only 159 166 for (int j = 0; j < nnet[0].Nnodes[i]; j++) { … … 161 168 } 162 169 163 ALLOCATE (nnet[0].weight s[i], float, nnet[0].Nnodes[i-1]*nnet[0].Nnodes[i]); // weightsconnected each node in the previous layer to the current layer (excludes input layer)170 ALLOCATE (nnet[0].weight[i], float, nnet[0].Nnodes[i-1]*nnet[0].Nnodes[i]); // weight connected each node in the previous layer to the current layer (excludes input layer) 164 171 for (int j = 0; j < nnet[0].Nnodes[i-1]*nnet[0].Nnodes[i]; j++) { 165 nnet[0].weight s[i][j] = ohana_gaussdev_rnd (0.0, 1.0);172 nnet[0].weight[i][j] = ohana_gaussdev_rnd (0.0, 1.0); 166 173 } 167 174 … … 171 178 ALLOCATE (nnet[0].delta [i], float, nnet[0].Nnodes[i]); // vectors for holding results / values for each node in the input, hidden, output layers 172 179 173 ALLOCATE (nnet[0]. Nabla_b, float, nnet[0].Nnodes[i]); 174 ALLOCATE (nnet[0].dNabla_b, float, nnet[0].Nnodes[i]); 175 176 ALLOCATE (nnet[0]. Nabla_w, float, nnet[0].Nnodes[i-1]*nnet[0].Nnodes[i]); 177 ALLOCATE (nnet[0].dNabla_w, float, nnet[0].Nnodes[i-1]*nnet[0].Nnodes[i]); 180 ALLOCATE (nnet[0]. Nabla_b[i], float, nnet[0].Nnodes[i]); 181 ALLOCATE (nnet[0].dNabla_b[i], float, nnet[0].Nnodes[i]); 182 ALLOCATE (nnet[0]. Nabla_w[i], float, nnet[0].Nnodes[i-1]*nnet[0].Nnodes[i]); 183 ALLOCATE (nnet[0].dNabla_w[i], float, nnet[0].Nnodes[i-1]*nnet[0].Nnodes[i]); 178 184 } 179 185 } … … 183 189 184 190 int i, N, NNNETS_2; 191 192 if (!nnets) InitNnets(); 185 193 186 194 /* find nnet in nnet list */ … … 204 212 } 205 213 206 FreeNnet (nnet); 214 FreeNnetData (nnet); 215 free (nnet); 207 216 return (TRUE); 208 217 } … … 213 222 int i, j; 214 223 224 if (!nnets) InitNnets(); 225 215 226 for (i = 0; i < Nnnets; i++) { 216 227 gprint (GP_ERR, "%-15s :", nnets[i][0].name); 217 for (j = 0; j < nnets[i][0].Nlayer s; i++) {228 for (j = 0; j < nnets[i][0].Nlayer; j++) { 218 229 gprint (GP_ERR, " %3d", nnets[i][0].Nnodes[j]); 219 230 }
Note:
See TracChangeset
for help on using the changeset viewer.
