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