コード例 #1
0
ファイル: ReadoutLayer.cs プロジェクト: okozelsk/NET
 /// <summary>
 /// Computes the readout units.
 /// </summary>
 private CompositeResult[] ComputeReadoutUnits(double[] predictors, out double[] outputVector)
 {
     CompositeResult[] unitsResults = new CompositeResult[_readoutUnitCollection.Length];
     outputVector = new double[_readoutUnitCollection.Length];
     for (int unitIdx = 0; unitIdx < _readoutUnitCollection.Length; unitIdx++)
     {
         double[]        readoutUnitInputVector = _predictorsMapper.CreateVector(ReadoutLayerCfg.ReadoutUnitsCfg.ReadoutUnitCfgCollection[unitIdx].Name, predictors);
         CompositeResult unitResult             = _readoutUnitCollection[unitIdx].Compute(readoutUnitInputVector);
         outputVector[unitIdx] = unitResult.Result[0];
         unitsResults[unitIdx] = unitResult;
     }
     return(unitsResults);
 }
コード例 #2
0
        /// <summary>
        /// Computes the "One Takes All" group.
        /// </summary>
        /// <param name="allReadoutUnitResults">The collection of all readout units composite results.</param>
        /// <param name="groupResult">The composite result of the group's probabilistic cluster chain.</param>
        /// <param name="outputVector">The output vector.</param>
        /// <returns>An index of the winning unit within the "One Takes All" group.</returns>
        public int Compute(CompositeResult[] allReadoutUnitResults, out CompositeResult groupResult, out double[] outputVector)
        {
            int winnerIdx;

            groupResult  = new CompositeResult();
            outputVector = new double[MemberReadoutUnitIndexCollection.Count];
            if (DecisionMethod == OneTakesAllDecisionMethod.Basic)
            {
                for (int i = 0; i < MemberReadoutUnitIndexCollection.Count; i++)
                {
                    //Store rescaled member units results
                    outputVector[i] = Interval.IntZP1.Rescale(allReadoutUnitResults[MemberReadoutUnitIndexCollection[i]].Result[0], Interval.IntN1P1);
                }
                //Make the sum equal to 1
                outputVector.ScaleToNewSum(1d);
                groupResult.Result = new double[outputVector.Length];
                outputVector.CopyTo(groupResult.Result, 0);
                //Rescale output vector back to -1 and 1
                for (int i = 0; i < MemberReadoutUnitIndexCollection.Count; i++)
                {
                    outputVector[i] = Interval.IntN1P1.Rescale(outputVector[i], Interval.IntZP1);
                }
                winnerIdx = outputVector.MaxIdx();
            }
            else
            {
                double[] inputVector = CreateInputVector(allReadoutUnitResults);
                outputVector       = ProbabilisticClusterChain.Compute(inputVector, out List <Tuple <int, double[]> > memberNetOuputs);
                groupResult.Result = new double[outputVector.Length];
                outputVector.CopyTo(groupResult.Result, 0);
                groupResult.SubResults = new List <double[]>();
                foreach (Tuple <int, double[]> tuple in memberNetOuputs)
                {
                    groupResult.SubResults.Add(tuple.Item2);
                }
                //Rescale output to -1 and 1
                for (int i = 0; i < MemberReadoutUnitIndexCollection.Count; i++)
                {
                    outputVector[i] = Interval.IntN1P1.Rescale(outputVector[i], Interval.IntZP1);
                }
                winnerIdx = outputVector.MaxIdx();
            }

            return(winnerIdx);
        }