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); }
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); }
/* * 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); }
}//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); }