Beispiel #1
0
        private void run()
        {
            FPA t1 = PA.Add(PA.InnerProduct(dinput, diwt), theta);             // summation and theta

            FPA ohidden = PA.Reciprocal(PA.Add(PA.Pow2(PA.Negate(t1)), 1.0f)); //applying sigmoid function

            FPA t2 = PA.Add(PA.InnerProduct(ohidden, dowt), tau);              // summation and tau

            FPA ooutput = PA.Reciprocal(PA.Add(PA.Pow2(PA.Negate(t2)), 1.0f));

            FPA oerror = PA.Subtract(doutput, ooutput);                                                                     //numpat no

            FPA herror = PA.Transpose(PA.InnerProduct(dowt, PA.Transpose(oerror, new int[] { 1, 0 })), new int[] { 1, 0 }); // doubtful transpose

            herror = PA.Multiply(PA.Multiply(PA.Subtract(1.0f, t1), t1), herror);

            FPA _owt = PA.Add(dowt, PA.Multiply(PA.InnerProduct(PA.Transpose(t1, new int[] { 1, 0 }), oerror), betao)); // orig no transpose


            FPA _iwt = PA.Multiply(PA.InnerProduct(PA.Transpose(dinput, new int[] { 1, 0 }), herror), betah); //original dinput herror and no transpose

            dtau = PA.Add(PA.Multiply(betao, oerror), dtau);

            dtheta = PA.Add(PA.Multiply(betah, herror), dtheta); //orig oerror

            PA.ToArray(_owt, out owt);
            PA.ToArray(_iwt, out iwt);

            cleanup();
            diwt = new DFPA(iwt);
            dowt = new DFPA(owt);
        }
Beispiel #2
0
        private void run()
        {
            FPA t1 = PA.Add(PA.InnerProduct(dinput, diwt), theta);

            FPA ohidden = PA.Reciprocal(PA.Add(PA.Pow2(PA.Negate(t1)), 1.0f));

            FPA t2 = PA.Add(PA.InnerProduct(ohidden, dowt), tau);

            FPA ooutput = PA.Reciprocal(PA.Add(PA.Pow2(PA.Negate(t2)), 1.0f));

            FPA oerror = PA.Subtract(doutput, ooutput);



            FPA herror = PA.InnerProduct(dowt, PA.Transpose(oerror, new int[] { 1, 0 }));

            herror = PA.InnerProduct(PA.Multiply(PA.Subtract(1.0f, t1), t1), herror);

            FPA _owt = PA.Add(dowt, PA.Multiply(PA.InnerProduct(t1, oerror), betao));

            FPA _iwt = PA.Multiply(PA.InnerProduct(herror, dinput), betah); //original dinput herror

            dtau = PA.Add(PA.Multiply(betao, oerror), dtau);

            dtheta = PA.Add(PA.Multiply(betah, herror), dtheta); //orig herror

            PA.ToArray(_owt, out owt);
            PA.ToArray(_iwt, out iwt);

            diwt = new DFPA(owt);
            dowt = new DFPA(iwt);
        }
Beispiel #3
0
        /*
         * Function which performs all the GPU operations
         */
        private void run()
        {
            /* Note : Inner product --- Matrix multiplication
             *        Multiply -- Element by element multiplication */

            FPA t1 = PA.Add(PA.InnerProduct(dinput, diwt), dtheta);

            /* ohidden is the output of hidden layer
             * Only Sigmoid function is used for timebeing */
            FPA ohidden = PA.Reciprocal(PA.Add(PA.Pow(new FPA(2.71828f, new int[] { numpat, nh }), PA.Negate(t1)), 1.0f));

            FPA t2 = PA.Add(PA.InnerProduct(ohidden, dowt), dtau);

            /* ooutput is the "actual" output of hidden layer
             * Only Sigmoid function is used for timebeing */
            FPA ooutput = PA.Reciprocal(PA.Add(PA.Pow(new FPA(2.71828f, new int[] { numpat, no }), PA.Negate(t2)), 1.0f));

            /* Error between expected and actual */
            FPA oerror = PA.Subtract(doutput, ooutput);

            /* Checking if error has fallen below 1% if so terminatinf further cycles */
            BoolParallelArray b = PA.All(PA.CompareGreater(derror, PA.Abs(oerror)), 1);

            b = PA.All(b);
            bool[] bt;
            PA.ToArray(b, out bt);
            if (bt[0] == true)
            {
                traincycles = 0;
            }

            /* herror is the error in the hidden layer */
            FPA herror = PA.Transpose(PA.InnerProduct(dowt, PA.Transpose(oerror, new int[] { 1, 0 })), new int[] { 1, 0 });

            herror = PA.Multiply(PA.Multiply(PA.Subtract(1.0f, ohidden), ohidden), herror);

            /* Weights between hidden  and output layer being updated */
            FPA _owt = PA.Add(PA.Multiply(PA.InnerProduct(PA.Transpose(ohidden, new int[] { 1, 0 }), oerror), betao), dowt);

            /* Weights between input  and hidden layer being updated */
            FPA _iwt = PA.Add(PA.Multiply(PA.InnerProduct(PA.Transpose(dinput, new int[] { 1, 0 }), herror), betah), diwt);

            /*Updating threshold for output layer */
            dtau = PA.Add(PA.Multiply(betao, oerror), dtau);

            /*Updating threshold for hidden layer */
            dtheta = PA.Add(PA.Multiply(betah, herror), dtheta);

            /* Casting the Parallel arrays to normal arrays */
            PA.ToArray(_owt, out owt);
            PA.ToArray(_iwt, out iwt);

            /* Rebuilding the disposable arrays from newly formed arrays */
            diwt = new DFPA(iwt);
            dowt = new DFPA(owt);
        }
Beispiel #4
0
        }//Init

        public void FindBMU()
        {
            //Useful locals
            int alen = m_Height * m_Width;

            //Compute the distances from pattern to code vectors
            FPA a    = PA.AddDimension(m_CurrentPatternGPU, 1);
            FPA x    = PA.Stretch(a, 1, alen);
            FPA pol  = PA.Subtract(m_Weights, x);
            FPA pol2 = PA.Multiply(pol, pol);
            FPA pol3 = PA.Sum(pol2, 0);

            m_Distances = PA.Sqrt(pol3);

            //Find the minimal distance
            FPA dist2  = PA.AddDimension(m_Distances, 1);
            FPA minval = PA.MinVal(dist2, 0);

            FPA xxx = PA.Stretch(minval, alen);

            //Prepare trigger array
            BPA trigger = PA.CompareEqual(xxx, m_Distances);

            //BMU Coord ZEROS
            BPA trigger2 = PA.AddDimension(trigger, 0);
            BPA trigger3 = PA.Stretch(trigger2, 2, 1);

            //Extract BMU Coord
            FPA lol = PA.Cond(trigger3, m_Shape, zeros);

            m_BMUCoord = PA.Sum(lol, 1);
            //m_BMUCoord = PA.Evaluate(m_BMUCoord);

            //BMU Code Vector ZEROS
            BPA triggercv2 = PA.AddDimension(trigger, 0);
            BPA triggercv3 = PA.Stretch(triggercv2, m_PatternLength, 1);

            //Extract BMU code vector
            FPA mdr = PA.Cond(triggercv3, m_Weights, zeroscv);

            m_BMUCodeVector = PA.Sum(mdr, 1);
            //m_BMUCodeVector = PA.Evaluate(m_BMUCodeVector);


            //Begin computation ! ^^ AND OUTPUT
            PA.Evaluate(m_BMUCodeVector);
            PA.Evaluate(m_BMUCoord);
        }
Beispiel #5
0
        /*
         * Entry Function
         */
        public void start()
        {
            /* Initialisation of all layers*/
            init();

            /*Normalisation of weights */
            normali();
            normalo();

            /*Initialisation of GPU*/
            PA.InitGPU();

            /*Measurement starts*/
            QueryPerformanceCounter(ref timbeg);

            diwt = new DFPA(iwt);
            dowt = new DFPA(owt);

            dinput  = new DFPA(input);
            doutput = new DFPA(output);

            /* Minimum permissible error */
            derror = PA.Abs(PA.Multiply(doutput, 0.01f));

            while (traincycles > 0)
            {
                traincycles--;
                numcycles++;
                run();
            }

            long freq = 0;

            /*Measurement ends */
            QueryPerformanceCounter(ref timend);
            QueryPerformanceFrequency(ref freq);
            _timtaken = (timend - timbeg) * 1.0 / freq;
        }