将 JavaScript 移植到 C#(存储在数组中的函数)
Porting JavaScript to C# (functions stored in array)
你好,我一直在将 Karpathy's ReinforceJs 移植到 C# 并且在我 运行 进入这个
之前我做得很好
backward: function() {
for(var i=this.backprop.length-1;i>=0;i--) {
this.backprop[i](); // tick!
}
backprop 是 Graph 中的一个数组,从上面可以看出,该数组包含函数,这里是如何存储它们的:
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 为真时运行,但在测试后我的函数每次都产生相同的动作 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# 中的等价物,我不介意对存储库本身的贡献
您也可以在 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();
}
你好,我一直在将 Karpathy's ReinforceJs 移植到 C# 并且在我 运行 进入这个
之前我做得很好 backward: function() {
for(var i=this.backprop.length-1;i>=0;i--) {
this.backprop[i](); // tick!
}
backprop 是 Graph 中的一个数组,从上面可以看出,该数组包含函数,这里是如何存储它们的:
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 为真时运行,但在测试后我的函数每次都产生相同的动作 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# 中的等价物,我不介意对存储库本身的贡献
您也可以在 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();
}