/// <summary> /// Creates a new layer /// </summary> /// <param name="neuronCount"> /// Number of neurons in the layer /// </param> /// <exception cref="ArgumentException"> /// If <c>neuronCount</c> is not positive /// </exception> protected Layer(int neuronCount) { Helper.ValidatePositive(neuronCount, "neuronCount"); this.neurons = new TNeuron[neuronCount]; this.learningRateFunction = new LinearFunction(0.3d, 0.05d); }
/// <summary> /// Trains the neural network for the given training set (Batch Training) /// </summary> /// <param name="trainingSet"> /// The training set to use /// </param> /// <param name="trainingEpochs"> /// Number of training epochs. (All samples are trained in some random order, in every /// training epoch) /// </param> /// <exception cref="ArgumentNullException"> /// if <c>trainingSet</c> is <c>null</c> /// </exception> /// <exception cref="ArgumentException"> /// if <c>trainingEpochs</c> is zero or negative /// </exception> public virtual void Learn(Ajusteentrenamiento trainingSet, int trainingEpochs) { // Validate Helper.ValidateNotNull(trainingSet, "trainingSet"); Helper.ValidatePositive(trainingEpochs, "trainingEpochs"); if ((trainingSet.InputVectorLength != inputLayer.NeuronCount) || (trainingMethod == TrainingMethod.Supervised && trainingSet.OutputVectorLength != outputLayer.NeuronCount) || (trainingMethod == TrainingMethod.Unsupervised && trainingSet.OutputVectorLength != 0)) { throw new ArgumentException("Invalid training set"); } // Reset isStopping isStopping = false; // Re-Initialize the network Initialize(); for (int currentIteration = 0; currentIteration < trainingEpochs; currentIteration++) { int[] randomOrder = Helper.GetRandomOrder(trainingSet.TrainingSampleCount); // Beginning a new training epoch OnBeginEpoch(currentIteration, trainingSet); // Check for Jitter Epoch if (jitterEpoch > 0 && currentIteration % jitterEpoch == 0) { for (int i = 0; i < connectors.Count; i++) { connectors[i].Jitter(jitterNoiseLimit); } } for (int index = 0; index < trainingSet.TrainingSampleCount; index++) { Entrenamiento randomSample = trainingSet[randomOrder[index]]; // Learn a random training sample OnBeginSample(currentIteration, randomSample); LearnSample(trainingSet[randomOrder[index]], currentIteration, trainingEpochs); OnEndSample(currentIteration, randomSample); // Check if we need to stop if (isStopping) { isStopping = false; return; } } // Training Epoch successfully complete OnEndEpoch(currentIteration, trainingSet); // Check if we need to stop if (isStopping) { isStopping = false; return; } } }
/// <summary> /// Trains the network for the given training sample (Online training mode). Note that this /// method trains the sample only once, irrespective of what current epoch is. The arguments /// are just used to find out training progress and adjust parameters depending on it. /// </summary> /// <param name="trainingSample"> /// Training sample to use /// </param> /// <param name="currentIteration"> /// Current training iteration /// </param> /// <param name="trainingEpochs"> /// Number of training epochs /// </param> /// <exception cref="ArgumentNullException"> /// If <c>trainingSample</c> is <c>null</c> /// </exception> /// <exception cref="ArgumentException"> /// If <c>trainingEpochs</c> is not positive /// </exception> /// <exception cref="ArgumentOutOfRangeException"> /// If <c>currentIteration</c> is negative or, if it is not less than <c>trainingEpochs</c> /// </exception> public virtual void Learn(Entrenamiento trainingSample, int currentIteration, int trainingEpochs) { Helper.ValidateNotNull(trainingSample, "trainingSample"); Helper.ValidatePositive(trainingEpochs, "trainingEpochs"); Helper.ValidateWithinRange(currentIteration, 0, trainingEpochs - 1, "currentIteration"); OnBeginSample(currentIteration, trainingSample); LearnSample(trainingSample, currentIteration, trainingEpochs); OnEndSample(currentIteration, trainingSample); }
public Ajusteentrenamiento(int inputVectorLength, int outputVectorLength) { // Validation Helper.ValidatePositive(inputVectorLength, "inputVectorLength"); Helper.ValidateNotNegative(outputVectorLength, "outputVectorLength"); // Initialize instance variables this.inputVectorLength = inputVectorLength; this.outputVectorLength = outputVectorLength; this.trainingSamples = new List <Entrenamiento>(); }