void TrainNet(NET* Net) { INT n,t; POLE Pole; REAL wOld, wNew, ScoreOld, ScoreNew, dScore, dScoreMean, StepSize; REAL Input[N]; REAL Output[M]; REAL Target[M]; n = 0; while (n<TRAIN_STEPS) { t = 0; InitializePole(&Pole); fprintf(f, " Time Angle Force\n"); fprintf(f, "%4.1fs %5.1f° %5.1fN\n", t * T, Pole.w, Pole.F); wOld = Pole.w; ScoreOld = ScoreOfPole(&Pole); SimulatePole(&Pole); wNew = Pole.w; ScoreNew = ScoreOfPole(&Pole); while (PoleStillBalanced(&Pole) AND (t<BALANCED)) { n++; t++; Net->Alpha = 0.5 * pow(0.01, (REAL) n / TRAIN_STEPS); Net->Alpha_ = 0.5 * pow(0.01, (REAL) n / TRAIN_STEPS); Net->Alpha__ = 0.005; Net->Gamma = 0.05; Net->Sigma = 6.0 * pow(0.2, (REAL) n / TRAIN_STEPS); Input[0] = wOld; Input[1] = wNew; SetInput(Net, Input); PropagateNet(Net); GetOutput(Net, Output); Pole.F = Output[0]; StepSize = Net->KohonenLayer->StepSize[Net->Winner]; Pole.F += StepSize * RandomNormalREAL(0, 10); fprintf(f, "%4.1fs %5.1f° %5.1fN\n", t * T, Pole.w, Pole.F); wOld = Pole.w; ScoreOld = ScoreOfPole(&Pole); SimulatePole(&Pole); wNew = Pole.w; ScoreNew = ScoreOfPole(&Pole); dScore = ScoreNew - ScoreOld; dScoreMean = Net->KohonenLayer->dScoreMean[Net->Winner]; if (dScore > dScoreMean) { Target[0] = Pole.F; TrainUnits(Net, Input, Target); } Net->KohonenLayer->dScoreMean[Net->Winner] += Net->Gamma * (dScore - dScoreMean); } if (PoleStillBalanced(&Pole)) fprintf(f, "Pole still balanced after %0.1fs ...\n\n", t * T); else fprintf(f, "Pole fallen after %0.1fs ...\n\n", (t+1) * T); } }
void SimulateNet(NET* Net, INT* Input, INT* Target, BOOL Training, BOOL Protocoling) { INT Output[M]; SetInput(Net, Input, Protocoling); PropagateNet(Net); GetOutput(Net, Output, Protocoling); ComputeOutputError(Net, Target); if (Training) AdjustWeights(Net); }
void SimulateNet(NET* Net, REAL* Input, REAL* Output, REAL* Target, BOOL Training) { SetInput(Net, Input); PropagateNet(Net); GetOutput(Net, Output); ComputeOutputError(Net, Target); if (Training) { BackpropagateNet(Net); AdjustWeights(Net); } }