Пример #1
0
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;
}
Пример #2
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();
}