machine learning ANN perlu bantuan

Dependencies:   mbed

Committer:
asyrofi
Date:
Sat Apr 14 04:32:05 2018 +0000
Revision:
0:482cc6c25690
perlu bantuan;

Who changed what in which revision?

UserRevisionLine numberNew 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