rakha asyrofi
/
ANN_Coba
machine learning ANN perlu bantuan
main.cpp@0:482cc6c25690, 2018-04-14 (annotated)
- Committer:
- asyrofi
- Date:
- Sat Apr 14 04:32:05 2018 +0000
- Revision:
- 0:482cc6c25690
perlu bantuan;
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
asyrofi | 0:482cc6c25690 | 1 | #include <math.h> |
asyrofi | 0:482cc6c25690 | 2 | #include <mbed.h> |
asyrofi | 0:482cc6c25690 | 3 | Serial pc(USBTX, USBRX); |
asyrofi | 0:482cc6c25690 | 4 | const int PatternCount = 10; |
asyrofi | 0:482cc6c25690 | 5 | const int InputNodes = 7; |
asyrofi | 0:482cc6c25690 | 6 | const int HiddenNodes = 8; |
asyrofi | 0:482cc6c25690 | 7 | const int OutputNodes = 4; |
asyrofi | 0:482cc6c25690 | 8 | const float LearningRate = 0.3; |
asyrofi | 0:482cc6c25690 | 9 | const float Momentum = 0.9; |
asyrofi | 0:482cc6c25690 | 10 | const float InitialWeightMax = 0.5; |
asyrofi | 0:482cc6c25690 | 11 | const float Success = 0.0004; |
asyrofi | 0:482cc6c25690 | 12 | |
asyrofi | 0:482cc6c25690 | 13 | const byte Input[PatternCount][InputNodes] = { |
asyrofi | 0:482cc6c25690 | 14 | { 1, 1, 1, 1, 1, 1, 0 }, // 0 |
asyrofi | 0:482cc6c25690 | 15 | { 0, 1, 1, 0, 0, 0, 0 }, // 1 |
asyrofi | 0:482cc6c25690 | 16 | { 1, 1, 0, 1, 1, 0, 1 }, // 2 |
asyrofi | 0:482cc6c25690 | 17 | { 1, 1, 1, 1, 0, 0, 1 }, // 3 |
asyrofi | 0:482cc6c25690 | 18 | { 0, 1, 1, 0, 0, 1, 1 }, // 4 |
asyrofi | 0:482cc6c25690 | 19 | { 1, 0, 1, 1, 0, 1, 1 }, // 5 |
asyrofi | 0:482cc6c25690 | 20 | { 0, 0, 1, 1, 1, 1, 1 }, // 6 |
asyrofi | 0:482cc6c25690 | 21 | { 1, 1, 1, 0, 0, 0, 0 }, // 7 |
asyrofi | 0:482cc6c25690 | 22 | { 1, 1, 1, 1, 1, 1, 1 }, // 8 |
asyrofi | 0:482cc6c25690 | 23 | { 1, 1, 1, 0, 0, 1, 1 } // 9 |
asyrofi | 0:482cc6c25690 | 24 | }; |
asyrofi | 0:482cc6c25690 | 25 | |
asyrofi | 0:482cc6c25690 | 26 | const byte Target[PatternCount][OutputNodes] = { |
asyrofi | 0:482cc6c25690 | 27 | { 0, 0, 0, 0 }, |
asyrofi | 0:482cc6c25690 | 28 | { 0, 0, 0, 1 }, |
asyrofi | 0:482cc6c25690 | 29 | { 0, 0, 1, 0 }, |
asyrofi | 0:482cc6c25690 | 30 | { 0, 0, 1, 1 }, |
asyrofi | 0:482cc6c25690 | 31 | { 0, 1, 0, 0 }, |
asyrofi | 0:482cc6c25690 | 32 | { 0, 1, 0, 1 }, |
asyrofi | 0:482cc6c25690 | 33 | { 0, 1, 1, 0 }, |
asyrofi | 0:482cc6c25690 | 34 | { 0, 1, 1, 1 }, |
asyrofi | 0:482cc6c25690 | 35 | { 1, 0, 0, 0 }, |
asyrofi | 0:482cc6c25690 | 36 | { 1, 0, 0, 1 } |
asyrofi | 0:482cc6c25690 | 37 | }; |
asyrofi | 0:482cc6c25690 | 38 | |
asyrofi | 0:482cc6c25690 | 39 | int i, j, p, q, r; |
asyrofi | 0:482cc6c25690 | 40 | int ReportEvery1000; |
asyrofi | 0:482cc6c25690 | 41 | int RandomizedIndex[PatternCount]; |
asyrofi | 0:482cc6c25690 | 42 | long TrainingCycle; |
asyrofi | 0:482cc6c25690 | 43 | float Rando; |
asyrofi | 0:482cc6c25690 | 44 | float Error; |
asyrofi | 0:482cc6c25690 | 45 | float Accum; |
asyrofi | 0:482cc6c25690 | 46 | |
asyrofi | 0:482cc6c25690 | 47 | |
asyrofi | 0:482cc6c25690 | 48 | float Hidden[HiddenNodes]; |
asyrofi | 0:482cc6c25690 | 49 | float Output[OutputNodes]; |
asyrofi | 0:482cc6c25690 | 50 | float HiddenWeights[InputNodes+1][HiddenNodes]; |
asyrofi | 0:482cc6c25690 | 51 | float OutputWeights[HiddenNodes+1][OutputNodes]; |
asyrofi | 0:482cc6c25690 | 52 | float HiddenDelta[HiddenNodes]; |
asyrofi | 0:482cc6c25690 | 53 | float OutputDelta[OutputNodes]; |
asyrofi | 0:482cc6c25690 | 54 | float ChangeHiddenWeights[InputNodes+1][HiddenNodes]; |
asyrofi | 0:482cc6c25690 | 55 | float ChangeOutputWeights[HiddenNodes+1][OutputNodes]; |
asyrofi | 0:482cc6c25690 | 56 | |
asyrofi | 0:482cc6c25690 | 57 | int main() |
asyrofi | 0:482cc6c25690 | 58 | { |
asyrofi | 0:482cc6c25690 | 59 | pc.baud(9600); |
asyrofi | 0:482cc6c25690 | 60 | randomSeed(analogRead(3)); |
asyrofi | 0:482cc6c25690 | 61 | ReportEvery1000 = 1; |
asyrofi | 0:482cc6c25690 | 62 | for( p = 0 ; p < PatternCount ; p++ ) |
asyrofi | 0:482cc6c25690 | 63 | { |
asyrofi | 0:482cc6c25690 | 64 | RandomizedIndex[p] = p ; |
asyrofi | 0:482cc6c25690 | 65 | } |
asyrofi | 0:482cc6c25690 | 66 | |
asyrofi | 0:482cc6c25690 | 67 | void loop () |
asyrofi | 0:482cc6c25690 | 68 | { |
asyrofi | 0:482cc6c25690 | 69 | |
asyrofi | 0:482cc6c25690 | 70 | |
asyrofi | 0:482cc6c25690 | 71 | |
asyrofi | 0:482cc6c25690 | 72 | for( i = 0 ; i < HiddenNodes ; i++ ) |
asyrofi | 0:482cc6c25690 | 73 | { |
asyrofi | 0:482cc6c25690 | 74 | for( j = 0 ; j <= InputNodes ; j++ ) |
asyrofi | 0:482cc6c25690 | 75 | { |
asyrofi | 0:482cc6c25690 | 76 | ChangeHiddenWeights[j][i] = 0.0 ; |
asyrofi | 0:482cc6c25690 | 77 | Rando = float(random(100))/100; |
asyrofi | 0:482cc6c25690 | 78 | HiddenWeights[j][i] = 2.0 * ( Rando - 0.5 ) * InitialWeightMax ; |
asyrofi | 0:482cc6c25690 | 79 | } |
asyrofi | 0:482cc6c25690 | 80 | } |
asyrofi | 0:482cc6c25690 | 81 | |
asyrofi | 0:482cc6c25690 | 82 | for( i = 0 ; i < OutputNodes ; i ++ ) |
asyrofi | 0:482cc6c25690 | 83 | { |
asyrofi | 0:482cc6c25690 | 84 | for( j = 0 ; j <= HiddenNodes ; j++ ) |
asyrofi | 0:482cc6c25690 | 85 | { |
asyrofi | 0:482cc6c25690 | 86 | ChangeOutputWeights[j][i] = 0.0 ; |
asyrofi | 0:482cc6c25690 | 87 | Rando = float(random(100))/100; |
asyrofi | 0:482cc6c25690 | 88 | OutputWeights[j][i] = 2.0 * ( Rando - 0.5 ) * InitialWeightMax ; |
asyrofi | 0:482cc6c25690 | 89 | } |
asyrofi | 0:482cc6c25690 | 90 | } |
asyrofi | 0:482cc6c25690 | 91 | pc.printf("Initial/Untrained Outputs: \n"); |
asyrofi | 0:482cc6c25690 | 92 | toTerminal(); |
asyrofi | 0:482cc6c25690 | 93 | |
asyrofi | 0:482cc6c25690 | 94 | for( TrainingCycle = 1 ; TrainingCycle < 2147483647 ; TrainingCycle++) |
asyrofi | 0:482cc6c25690 | 95 | { |
asyrofi | 0:482cc6c25690 | 96 | |
asyrofi | 0:482cc6c25690 | 97 | for( p = 0 ; p < PatternCount ; p++) |
asyrofi | 0:482cc6c25690 | 98 | { |
asyrofi | 0:482cc6c25690 | 99 | q = random(PatternCount); |
asyrofi | 0:482cc6c25690 | 100 | r = RandomizedIndex[p] ; |
asyrofi | 0:482cc6c25690 | 101 | RandomizedIndex[p] = RandomizedIndex[q] ; |
asyrofi | 0:482cc6c25690 | 102 | RandomizedIndex[q] = r ; |
asyrofi | 0:482cc6c25690 | 103 | } |
asyrofi | 0:482cc6c25690 | 104 | Error = 0.0 ; |
asyrofi | 0:482cc6c25690 | 105 | |
asyrofi | 0:482cc6c25690 | 106 | for( q = 0 ; q < PatternCount ; q++ ) |
asyrofi | 0:482cc6c25690 | 107 | { |
asyrofi | 0:482cc6c25690 | 108 | p = RandomizedIndex[q]; |
asyrofi | 0:482cc6c25690 | 109 | |
asyrofi | 0:482cc6c25690 | 110 | for( i = 0 ; i < HiddenNodes ; i++ ) |
asyrofi | 0:482cc6c25690 | 111 | { |
asyrofi | 0:482cc6c25690 | 112 | Accum = HiddenWeights[InputNodes][i] ; |
asyrofi | 0:482cc6c25690 | 113 | for( j = 0 ; j < InputNodes ; j++ ) |
asyrofi | 0:482cc6c25690 | 114 | { |
asyrofi | 0:482cc6c25690 | 115 | Accum += Input[p][j] * HiddenWeights[j][i] ; |
asyrofi | 0:482cc6c25690 | 116 | } |
asyrofi | 0:482cc6c25690 | 117 | Hidden[i] = 1.0/(1.0 + exp(-Accum)) ; |
asyrofi | 0:482cc6c25690 | 118 | } |
asyrofi | 0:482cc6c25690 | 119 | |
asyrofi | 0:482cc6c25690 | 120 | |
asyrofi | 0:482cc6c25690 | 121 | for( i = 0 ; i < OutputNodes ; i++ ) |
asyrofi | 0:482cc6c25690 | 122 | { |
asyrofi | 0:482cc6c25690 | 123 | Accum = OutputWeights[HiddenNodes][i] ; |
asyrofi | 0:482cc6c25690 | 124 | for( j = 0 ; j < HiddenNodes ; j++ ) |
asyrofi | 0:482cc6c25690 | 125 | { |
asyrofi | 0:482cc6c25690 | 126 | Accum += Hidden[j] * OutputWeights[j][i] ; |
asyrofi | 0:482cc6c25690 | 127 | } |
asyrofi | 0:482cc6c25690 | 128 | Output[i] = 1.0/(1.0 + exp(-Accum)) ; |
asyrofi | 0:482cc6c25690 | 129 | OutputDelta[i] = (Target[p][i] - Output[i]) * Output[i] * (1.0 - Output[i]) ; |
asyrofi | 0:482cc6c25690 | 130 | Error += 0.5 * (Target[p][i] - Output[i]) * (Target[p][i] - Output[i]) ; |
asyrofi | 0:482cc6c25690 | 131 | } |
asyrofi | 0:482cc6c25690 | 132 | |
asyrofi | 0:482cc6c25690 | 133 | |
asyrofi | 0:482cc6c25690 | 134 | for( i = 0 ; i < HiddenNodes ; i++ ) |
asyrofi | 0:482cc6c25690 | 135 | { |
asyrofi | 0:482cc6c25690 | 136 | Accum = 0.0 ; |
asyrofi | 0:482cc6c25690 | 137 | for( j = 0 ; j < OutputNodes ; j++ ) |
asyrofi | 0:482cc6c25690 | 138 | { |
asyrofi | 0:482cc6c25690 | 139 | Accum += OutputWeights[i][j] * OutputDelta[j] ; |
asyrofi | 0:482cc6c25690 | 140 | } |
asyrofi | 0:482cc6c25690 | 141 | HiddenDelta[i] = Accum * Hidden[i] * (1.0 - Hidden[i]) ; |
asyrofi | 0:482cc6c25690 | 142 | } |
asyrofi | 0:482cc6c25690 | 143 | |
asyrofi | 0:482cc6c25690 | 144 | |
asyrofi | 0:482cc6c25690 | 145 | |
asyrofi | 0:482cc6c25690 | 146 | |
asyrofi | 0:482cc6c25690 | 147 | for( i = 0 ; i < HiddenNodes ; i++ ) |
asyrofi | 0:482cc6c25690 | 148 | { |
asyrofi | 0:482cc6c25690 | 149 | ChangeHiddenWeights[InputNodes][i] = LearningRate * HiddenDelta[i] + Momentum * ChangeHiddenWeights[InputNodes][i] ; |
asyrofi | 0:482cc6c25690 | 150 | HiddenWeights[InputNodes][i] += ChangeHiddenWeights[InputNodes][i] ; |
asyrofi | 0:482cc6c25690 | 151 | for( j = 0 ; j < InputNodes ; j++ ) |
asyrofi | 0:482cc6c25690 | 152 | { |
asyrofi | 0:482cc6c25690 | 153 | ChangeHiddenWeights[j][i] = LearningRate * Input[p][j] * HiddenDelta[i] + Momentum * ChangeHiddenWeights[j][i]; |
asyrofi | 0:482cc6c25690 | 154 | HiddenWeights[j][i] += ChangeHiddenWeights[j][i] ; |
asyrofi | 0:482cc6c25690 | 155 | } |
asyrofi | 0:482cc6c25690 | 156 | } |
asyrofi | 0:482cc6c25690 | 157 | |
asyrofi | 0:482cc6c25690 | 158 | |
asyrofi | 0:482cc6c25690 | 159 | for( i = 0 ; i < OutputNodes ; i ++ ) |
asyrofi | 0:482cc6c25690 | 160 | { |
asyrofi | 0:482cc6c25690 | 161 | ChangeOutputWeights[HiddenNodes][i] = LearningRate * OutputDelta[i] + Momentum * ChangeOutputWeights[HiddenNodes][i] ; |
asyrofi | 0:482cc6c25690 | 162 | OutputWeights[HiddenNodes][i] += ChangeOutputWeights[HiddenNodes][i] ; |
asyrofi | 0:482cc6c25690 | 163 | for( j = 0 ; j < HiddenNodes ; j++ ) |
asyrofi | 0:482cc6c25690 | 164 | { |
asyrofi | 0:482cc6c25690 | 165 | ChangeOutputWeights[j][i] = LearningRate * Hidden[j] * OutputDelta[i] + Momentum * ChangeOutputWeights[j][i] ; |
asyrofi | 0:482cc6c25690 | 166 | OutputWeights[j][i] += ChangeOutputWeights[j][i] ; |
asyrofi | 0:482cc6c25690 | 167 | } |
asyrofi | 0:482cc6c25690 | 168 | } |
asyrofi | 0:482cc6c25690 | 169 | } |
asyrofi | 0:482cc6c25690 | 170 | |
asyrofi | 0:482cc6c25690 | 171 | |
asyrofi | 0:482cc6c25690 | 172 | ReportEvery1000 = ReportEvery1000 - 1; |
asyrofi | 0:482cc6c25690 | 173 | if (ReportEvery1000 == 0) |
asyrofi | 0:482cc6c25690 | 174 | { |
asyrofi | 0:482cc6c25690 | 175 | pc.printf ("TrainingCycle: "); |
asyrofi | 0:482cc6c25690 | 176 | pc.printf ("%i",(int16_t)TrainingCycle); |
asyrofi | 0:482cc6c25690 | 177 | pc.printf (" Error = "); |
asyrofi | 0:482cc6c25690 | 178 | pc.printf ("%i\n",(int16_t)Error, 5); |
asyrofi | 0:482cc6c25690 | 179 | |
asyrofi | 0:482cc6c25690 | 180 | toTerminal(); |
asyrofi | 0:482cc6c25690 | 181 | |
asyrofi | 0:482cc6c25690 | 182 | if (TrainingCycle==1) |
asyrofi | 0:482cc6c25690 | 183 | { |
asyrofi | 0:482cc6c25690 | 184 | ReportEvery1000 = 999; |
asyrofi | 0:482cc6c25690 | 185 | } |
asyrofi | 0:482cc6c25690 | 186 | else |
asyrofi | 0:482cc6c25690 | 187 | { |
asyrofi | 0:482cc6c25690 | 188 | ReportEvery1000 = 1000; |
asyrofi | 0:482cc6c25690 | 189 | } |
asyrofi | 0:482cc6c25690 | 190 | } |
asyrofi | 0:482cc6c25690 | 191 | |
asyrofi | 0:482cc6c25690 | 192 | if( Error < Success ) break ; |
asyrofi | 0:482cc6c25690 | 193 | } |
asyrofi | 0:482cc6c25690 | 194 | pc.printf ("TrainingCycle: "); |
asyrofi | 0:482cc6c25690 | 195 | pc.printf ("%i",(int16_t)TrainingCycle); |
asyrofi | 0:482cc6c25690 | 196 | pc.printf (" Error = "); |
asyrofi | 0:482cc6c25690 | 197 | pc.printf ("%i\n",(int16_t)Error, 5); |
asyrofi | 0:482cc6c25690 | 198 | |
asyrofi | 0:482cc6c25690 | 199 | toTerminal(); |
asyrofi | 0:482cc6c25690 | 200 | |
asyrofi | 0:482cc6c25690 | 201 | pc.printf ("Training Set Solved!\n"); |
asyrofi | 0:482cc6c25690 | 202 | pc.printf ("--------\n"); |
asyrofi | 0:482cc6c25690 | 203 | ReportEvery1000 = 1; |
asyrofi | 0:482cc6c25690 | 204 | } |
asyrofi | 0:482cc6c25690 | 205 | } |
asyrofi | 0:482cc6c25690 | 206 | |
asyrofi | 0:482cc6c25690 | 207 | void toTerminal() |
asyrofi | 0:482cc6c25690 | 208 | { |
asyrofi | 0:482cc6c25690 | 209 | |
asyrofi | 0:482cc6c25690 | 210 | for( p = 0 ; p < PatternCount ; p++ ) { |
asyrofi | 0:482cc6c25690 | 211 | pc.printf (" Training Pattern: "); |
asyrofi | 0:482cc6c25690 | 212 | pc.printf ("%i\n",(int16_t)p); |
asyrofi | 0:482cc6c25690 | 213 | pc.printf (" Input "); |
asyrofi | 0:482cc6c25690 | 214 | for( i = 0 ; i < InputNodes ; i++ ) { |
asyrofi | 0:482cc6c25690 | 215 | pc.printf ("%i,%i",(int16_t)Input[p][i],(int16_t)DEC); |
asyrofi | 0:482cc6c25690 | 216 | pc.printft (" "); |
asyrofi | 0:482cc6c25690 | 217 | } |
asyrofi | 0:482cc6c25690 | 218 | pc.printf (" Target "); |
asyrofi | 0:482cc6c25690 | 219 | for( i = 0 ; i < OutputNodes ; i++ ) { |
asyrofi | 0:482cc6c25690 | 220 | pc.printf ("%i,%i",(int16_t)Input[p][i],(int16_t)DEC); |
asyrofi | 0:482cc6c25690 | 221 | Serial.print (" "); |
asyrofi | 0:482cc6c25690 | 222 | } |
asyrofi | 0:482cc6c25690 | 223 | /****************************************************************** |
asyrofi | 0:482cc6c25690 | 224 | * Compute hidden layer activations |
asyrofi | 0:482cc6c25690 | 225 | ******************************************************************/ |
asyrofi | 0:482cc6c25690 | 226 | |
asyrofi | 0:482cc6c25690 | 227 | for( i = 0 ; i < HiddenNodes ; i++ ) { |
asyrofi | 0:482cc6c25690 | 228 | Accum = HiddenWeights[InputNodes][i] ; |
asyrofi | 0:482cc6c25690 | 229 | for( j = 0 ; j < InputNodes ; j++ ) { |
asyrofi | 0:482cc6c25690 | 230 | Accum += Input[p][j] * HiddenWeights[j][i] ; |
asyrofi | 0:482cc6c25690 | 231 | } |
asyrofi | 0:482cc6c25690 | 232 | Hidden[i] = 1.0/(1.0 + exp(-Accum)) ; |
asyrofi | 0:482cc6c25690 | 233 | } |
asyrofi | 0:482cc6c25690 | 234 | |
asyrofi | 0:482cc6c25690 | 235 | /****************************************************************** |
asyrofi | 0:482cc6c25690 | 236 | * Compute output layer activations and calculate errors |
asyrofi | 0:482cc6c25690 | 237 | ******************************************************************/ |
asyrofi | 0:482cc6c25690 | 238 | |
asyrofi | 0:482cc6c25690 | 239 | for( i = 0 ; i < OutputNodes ; i++ ) { |
asyrofi | 0:482cc6c25690 | 240 | Accum = OutputWeights[HiddenNodes][i] ; |
asyrofi | 0:482cc6c25690 | 241 | for( j = 0 ; j < HiddenNodes ; j++ ) { |
asyrofi | 0:482cc6c25690 | 242 | Accum += Hidden[j] * OutputWeights[j][i] ; |
asyrofi | 0:482cc6c25690 | 243 | } |
asyrofi | 0:482cc6c25690 | 244 | Output[i] = 1.0/(1.0 + exp(-Accum)) ; |
asyrofi | 0:482cc6c25690 | 245 | } |
asyrofi | 0:482cc6c25690 | 246 | pc.printf (" Output "); |
asyrofi | 0:482cc6c25690 | 247 | for( i = 0 ; i < OutputNodes ; i++ ) { |
asyrofi | 0:482cc6c25690 | 248 | pc.printf ("%i",Output[i], 5); |
asyrofi | 0:482cc6c25690 | 249 | pc.printf (" "); |
asyrofi | 0:482cc6c25690 | 250 | } |
asyrofi | 0:482cc6c25690 | 251 | } |
asyrofi | 0:482cc6c25690 | 252 | |
asyrofi | 0:482cc6c25690 | 253 | |
asyrofi | 0:482cc6c25690 | 254 | } |
asyrofi | 0:482cc6c25690 | 255 |