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); }
public FPA LearningRate(FPA t) //Epsilon(t) { FPA exponent = -t / m_Theta; FPA Epsilont = m_EpsilonInitial * PA.Pow2(PA.Log2(LogBase) * exponent); return(Epsilont); }
public FPA NeighborhoodRatio(FPA t) //Sigma(t) { FPA exponent = -t / m_Theta; FPA Sigmat = m_SigmaInitial * PA.Pow2(PA.Log2(LogBase) * exponent); return(Sigmat); }
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); }
public float[] Test(float[] iinput) { float[,] tinput = new float[1, ni]; for (int i = 0; i < ni; i++) { tinput[0, i] = iinput[i]; } dinput = new DFPA(tinput); diwt = new DFPA(iwt); dowt = new DFPA(owt); dtheta = PA.Section(dtheta, new Slice(0, 1), new Slice(0, nh)); dtau = PA.Section(dtau, new Slice(0, 1), new Slice(0, no)); FPA t1 = PA.Add(PA.InnerProduct(dinput, diwt), dtheta); FPA ohidden = PA.Reciprocal(PA.Add(PA.Pow2(PA.Negate(t1)), 1.0f)); FPA t2 = PA.Add(PA.InnerProduct(ohidden, dowt), dtau); FPA ooutput = PA.Reciprocal(PA.Add(PA.Pow2(PA.Negate(t2)), 1.0f)); float[,] output; float[] routput = new float[no]; PA.ToArray(ooutput, out output); for (int i = 0; i < no; i++) { routput[i] = output[0, i]; } /*Disposable Floating arrays need to be explicitly "disposed" */ dinput.Dispose(); diwt.Dispose(); dowt.Dispose(); doutput.Dispose(); /*Releasing all GPU Resources*/ PA.UnInit(); return(routput); }
public void DoEpoch(int nb) { int alen = m_Width * m_Height; for (int i = 0; i < nb; ++i) { //Neighborhood Function FPA sbmuc = PA.AddDimension(m_BMUCoord, 1); sbmuc = PA.Stretch(sbmuc, 1, alen); sbmuc = sbmuc - m_Shape; sbmuc = PA.Pow2(sbmuc); FPA sqdist = PA.Sum(sbmuc, 0); sqdist = PA.AddDimension(sqdist, 0); sqdist = PA.Stretch(sqdist, m_PatternLength, 1); //PA.Evaluate(sqdist); // //Learning Rate FPA lrate = new FPA((float)_CPU_LearningRate(m_time_val), m_PatternLength, alen); /*FPA sLearningRate = PA.AddDimension(LearningRate(m_Time), 1); * sLearningRate = PA.Stretch(sLearningRate, m_PatternLength, alen);*/ //Difference between units and current pattern FPA a = PA.AddDimension(m_CurrentPatternGPU, 1); FPA x = PA.Stretch(a, 1, alen); FPA pol = x - m_Weights; //Calcul des deltas FPA deltaW = lrate * pol; //Mise à jour des poids m_Weights = m_Weights + deltaW; //Incrémente le compteur de temps //m_Time = PA.Add(m_Time, 1.0f); m_time_val += 1; } }