int trainNet(NeuralNetwork* net, Sample* samples, unsigned int numberOfSamples, unsigned int epochs, unsigned int batchSize, double learningRate) { unsigned int epoch = 0, startIndex, i, currentBatchSize; if(!samples || epochs < 1 || batchSize < 1 || batchSize > numberOfSamples || learningRate <= 0.0 || !isValidNet(net)) { return -2; } while(epoch < epochs) { shuffleSamples(samples, numberOfSamples); startIndex = 0; //while there are still mini batches while(startIndex < numberOfSamples) { currentBatchSize = fmin(numberOfSamples - startIndex, batchSize); printf("epoch: %d, currentBatchSize: %d\n", epoch, currentBatchSize); initializeDeltas(net); for(i = 0; i < currentBatchSize; i++) { //feedForward feedForward(net, samples[startIndex + i].inputs); //update deltas updateDeltas(net, samples[startIndex + i].outputs); } updateWeights(net, learningRate/(double)currentBatchSize); startIndex += currentBatchSize; } epoch++; } return 0; }
float FCNetwork::trainEpochs(const Samples &samples, unsigned int epochs) { for (int i = 0; i < epochs - 1; ++i) { // Without calculating error for (const Sample& sample : samples) { activate(sample.getInputs()); updateDeltas(sample); updateWeights(); } } // Calculating error float sum = 0; for (const Sample& sample : samples) { activate(sample.getInputs()); updateDeltas(sample); updateWeights(); sum = squaredError(sample.getOutputs()); } return sum / samples.size(); }