/// <summary> /// 一个受保护的帮助函数,用于训练单个学习样本 /// </summary> /// <param name="trainingSample"> /// 使用的训练样本 /// </param> /// <param name="currentIteration"> /// 当前训练时期(假设为正且小于<c> trainingEpochs </ c>) /// </param> /// <param name="trainingEpochs"> /// 训练时期数(假定为正) /// </param> protected override void LearnSample(TrainingSample trainingSample, int currentIteration, int trainingEpochs) { // 这里没有验证 int layerCount = layers.Count; // 设置输入向量 inputLayer.SetInput(trainingSample.InputVector); for (int i = 0; i < layerCount; i++) { layers[i].Run(); } // 设置错误 meanSquaredError += (outputLayer as ActivationLayer).SetErrors(trainingSample.OutputVector); // 反向传播错误 for (int i = layerCount; i > 0;) { ActivationLayer layer = layers[--i] as ActivationLayer; if (layer != null) { layer.EvaluateErrors(); } } // 优化突触权重和神经元偏差值 for (int i = 0; i < layerCount; i++) { layers[i].Learn(currentIteration, trainingEpochs); } }
/// <summary> /// A protected helper function used to train single learning sample /// </summary> /// <param name="trainingSample"> /// Training sample to use /// </param> /// <param name="currentIteration"> /// Current training epoch (Assumed to be positive and less than <c>trainingEpochs</c>) /// </param> /// <param name="trainingEpochs"> /// Number of training epochs (Assumed to be positive) /// </param> protected override void LearnSample(TrainingSample trainingSample, int currentIteration, int trainingEpochs) { // No validation here int layerCount = layers.Count; // Set input vector inputLayer.SetInput(trainingSample.InputVector); for (int i = 0; i < layerCount; i++) { layers[i].Run(); } // Set Errors meanSquaredError += (outputLayer as ActivationLayer).SetErrors(trainingSample.OutputVector); // Backpropagate errors for (int i = layerCount; i > 0;) { ActivationLayer layer = layers[--i] as ActivationLayer; if (layer != null) { layer.EvaluateErrors(); } } // Optimize synapse weights and neuron bias values for (int i = 0; i < layerCount; i++) { layers[i].Learn(currentIteration, trainingEpochs); } }
/// <summary> /// 创建一个新的激活神经元 /// </summary> /// <param name="parent"> /// 包含此神经元的父层 /// </param> /// <exception cref="System.ArgumentNullException"> /// 如果<c>父</ c>是<c> null </ c> /// </exception> public ActivationNeuron(ActivationLayer parent) { Helper.ValidateNotNull(parent, "parent"); this.input = 0d; this.output = 0d; this.error = 0d; this.bias = 0d; this.parent = parent; }
/// <summary> /// 创建新的反向传播网络,具有指定的输入和输出层。 (在使用构造函数之前,您需要使用适当的突触来连接所有层。对网络结构创建后所做的任何更改都可能导致完全故障) /// </summary> /// <param name="inputLayer"> /// 输入层 /// </param> /// <param name="outputLayer"> /// 输出层 /// </param> /// <exception cref="ArgumentNullException"> /// 如果<c> inputLayer </ c>或<c> outputLayer </ c>为<c> null </ c> /// </exception> public BackpropagationNetwork(ActivationLayer inputLayer, ActivationLayer outputLayer) : base(inputLayer, outputLayer, TrainingMethod.Supervised) { this.meanSquaredError = 0d; this.isValidMSE = false; }