2017-12-18 133 views
0

你好,我已經移植Karpathy's ReinforceJs到C#和我做的不錯,直到我遇到了這個移植JavaScript以C#(存儲在陣列功能)

backward: function() { 
     for(var i=this.backprop.length-1;i>=0;i--) { 
     this.backprop[i](); // tick! 
    } 

backprop是圖一個數組,因爲你可以告訴上面的數組包含這裏fuctions它們是如何存儲:

if(this.needs_backprop) { 
    var backward = function() { 
    for(var i=0,n=d;i<n;i++){ m.dw[d * ix + i] += out.dw[i]; } 
    } 
    this.backprop.push(backward); 
    } 

我剛剛轉換這個(向後)成時needs_backprop是真正運行的功能,但在測試我的fuctions後每次只產生相同的作用C# code in repo摘要:

if (NeedsBackPropagation) 
    { 
     Backward(m, outt, n); 
    } 

和落後:

public void Backward(Matrix m, Matrix outt,int n) 
    { 
     for (var i = 0; i < n; i++) 
     { 
      // grad for z = tanh(x) is (1 - z^2) 
      var mwi = outt.Weights[i]; 
      m.BackPropWeights[i] += (1.0 - mwi * mwi)* outt.BackPropWeights[i]; 
     } 
    } 

我想知道A.直上在陣列中存儲的功能,如他後來打電話給他們或B.這在C#中的等價物,我不會介意庫本身

+1

可以存儲在'列表功能 _backprop =新名單()'。然後像這樣添加:'_backprop.Add(()=> {function here});'。並以與javascript相同的方式調用:'_backprop [i]()'。 – Evk

回答

1

可以存儲功能,在C#中也貢獻,這是一個使用你的代碼的例子:

public class Graph 
{ 

    public bool NeedsBackPropagation { get; } 
    public List<Action> BackProp { get; } 


    public Graph(bool backProp) 
    { 
     NeedsBackPropagation = backProp; 
     BackProp = new List<>(); 
    } 


    public Matrix RowPluck(Matrix m, int ix) 
    { 
     Util.Assert(ix >= 0 && ix < m.NumberOfRows); 
     var d = m.NumberOfColumns; 
     var outt = new Matrix(d, 1); 
     for (int i = 0, n = d; i < n; i++) 
     { 
      outt.Weights[i] = m.Weights[d * ix + i]; 
     } 

     if (NeedsBackPropagation) 
     { 
      BackProp.Add(new Action(() => { 
       for (int i = 0, n = d; i < n; i++) 
       { 
        m.BackPropWeights[d * ix + i] += outt.BackPropWeights[i]; 
       } 
      })); 
     } 

     return outt; 
    } 

} 

然後你需要做的,叫他們是

foreach (Action action in BackProp) 
{ 
    action(); 
} 
+0

我現在要試試這個 –