float MultilayerNN::trainOne(vector<float> tuple) { float error; // Set up topography & randomize weights if first run if (!topoSet) { setTopo(tuple); } // Set previous weights if size = 0 //if (previousWeights.size() == 0) previousWeights = weights; // Set input nodes to training tuple values for (int i = 0; i < inputNodes.size(); i++) { inputNodes.at(i) = tuple.at(i); } // FIRST PASS: Feed forward through network feedForward(); // SECOND PASS: Calculate error, propagate deltas back through network given desired output error = addErrorForIteration(tuple.back()); backProp(tuple.back()); // THIRD PASS: Update weights updateWeights(); return error; }
void NeuralNetworkSimpleInternal::train(NeuralPatternArray const& patterns, const int count) throw() { const NeuralPattern *patternPtr = patterns.getArray(); if(patternPtr != 0) { for(int iteration = 0; iteration < count; iteration++) { const int numPatterns = patterns.size(); for(int patternIndex = 0; patternIndex < numPatterns; patternIndex++) { const NeuralPattern& pattern = patternPtr[patternIndex]; if(pattern.getInternal() != 0) backProp(pattern.getInputVector(), pattern.getOutputVector()); } } } }