Example #1
0
        /// <inheritdoc />
        public override void ComputeGradient(GradientCalc calc)
        {
            var prev          = Owner.GetPreviousLayer(this);
            var fromLayerSize = prev.TotalCount;
            var toLayerSize   = Count;

            ComputeGradient(calc, 0, 0, fromLayerSize, toLayerSize);
        }
Example #2
0
        /// <inheritdoc />
        public override void ComputeGradient(GradientCalc calc)
        {
            var prev          = Owner.GetPreviousLayer(this);
            var fromLayerSize = prev.TotalCount;
            var toLayerSize   = Count;

            // Calculate the output for each filter (depth).
            for (var dOutput = 0; dOutput < _numFilters; dOutput++)
            {
                for (var dInput = 0; dInput < _inDepth; dInput++)
                {
                    ComputeGradient(calc, 0, 0, fromLayerSize, toLayerSize);
                }
            }
        }
Example #3
0
        /// <summary>
        ///     Compute gradients for this layer.
        /// </summary>
        /// <param name="calc">The gradient calculator.</param>
        /// <param name="inputOffset">The input offset.</param>
        /// <param name="outputOffset">The output offset.</param>
        /// <param name="fromLayerSize">The from layer size.</param>
        /// <param name="toLayerSize">The to layer size.</param>
        public void ComputeGradient(GradientCalc calc, int inputOffset, int outputOffset, int fromLayerSize,
                                    int toLayerSize)
        {
            var prev           = Owner.GetPreviousLayer(this);
            var fromLayerIndex = prev.NeuronIndex;
            var toLayerIndex   = NeuronIndex;
            var weightSize     = WeightDepthUnit;
            var outputSize     = NeuronDepthUnit;


            var index      = WeightIndex + weightSize * inputOffset; // this.weightIndex[currentLevel];
            var activation = Activation;

            // handle weights
            // array references are made method local to avoid one indirection
            var layerDelta  = calc.LayerDelta;
            var weights     = Owner.Weights;
            var layerOutput = Owner.LayerOutput;
            var layerSums   = Owner.LayerSums;
            var y           = fromLayerIndex;

            for (var yi = 0; yi < fromLayerSize; yi++)
            {
                var    output = layerOutput[y];
                double sum    = 0;

                var wi = index + yi;

                for (var xi = 0; xi < toLayerSize; xi++, wi += fromLayerSize)
                {
                    var x = xi + toLayerIndex;

                    if (prev.IsActive(yi) && IsActive(xi))
                    {
                        calc.Gradients[wi] += -(output * layerDelta[x]);
                    }
                    sum += weights[wi] * layerDelta[x];
                }
                layerDelta[y] = sum
                                * activation.DerivativeFunction(layerSums[y], layerOutput[y]);

                y++;
            }
        }
Example #4
0
 /// <inheritdoc />
 public abstract void ComputeGradient(GradientCalc calc);
Example #5
0
 /// <inheritdoc />
 public void ComputeGradient(GradientCalc calc)
 {
     throw new NotImplementedException();
 }