代码之家  ›  专栏  ›  技术社区  ›  Ed The ''Pro'' Simon Klee

我不知道如何引用这个神经网络训练方法中的权值。

  •  0
  • Ed The ''Pro'' Simon Klee  · 技术社区  · 6 年前

    我在写我的 拥有 A的实现 神经网络 C++中的类。我不知道如何引用这个声明的权重:

    in = in + (inputs [l] * calcWeights [l]) ;
    

    原因是 更多 权重大于输入。这是我的代码:

    void Train (int numInputs, int numOutputs, double inputs [], double outputs []) {
        // Set the Random Seed:
        srand (time (0)) ;
    
        // Weights (n input(s) * n output(s) = n weight branch(es)):
        double calcWeights [numInputs * numOutputs] ;
    
        // Errors (n input(s) * n output(s) = n error branch(es)):
        double errors [numInputs * numOutputs] ;
    
        // Set the Weights to random:
        for (int j = 0 ; j < numInputs ; j = j + 1) {
            calcWeights [j] = ((-1 * numInputs) + (((double) rand ()) % (1 * numInputs))) ;
        }
    
        // Train:
        int i = 0 ;
        double in = 0 ;
        double out [numOutputs] ;
        while (i < 14999) {
            // Get the estimated output:
            for (int k = 0 ; k < numOutputs ; k = k + 1) {
                for (int l = 0 ; l < numInputs ; l = l + 1) {
                    in = in + (inputs [l] * calcWeights [l]) ;
                }
    
                out [k] = in + GetBias () ;
            }
    
            for (int m = 0 ; m < numOutputs ; m = m + 1) {
                error [m] = outputs [m] - out [m]
            }
    
            // Increment the iterator:
            i = i + 1 ;
        }
    }
    
    1 回复  |  直到 6 年前
        1
  •  1
  •   super    6 年前

    从你在评论中的澄清来看,我相信稍微修改一下你的循环就能得到你想要的。

    for (int k = 0 ; k < numOutputs ; k = k + 1) {
        in = 0; //Reset in to 0 at the beginning of each output loop
    
        for (int l = 0 ; l < numInputs ; l = l + 1) {
            in = in + (inputs [l] * calcWeights [l + k*numInputs]) ;
        }
    
        out [k] = in + GetBias () ;
    }
    

    您还应该确保初始化上面所有的权重。

    for (int j = 0 ; j < (numInputs * numOutputs) ; j = j + 1) {
        calcWeights [j] = ((-1 * numInputs) + (((double) rand ()) % (1 * numInputs))) ;
    }
    

    对于一些样式的选择,我只想指出您可以替换 k = k + 1 简单地 ++k 是的。同样地,你可以替换 in = in + ...; 具有 in += ...;