【问题标题】:Neural network output in c++c++中的神经网络输出
【发布时间】:2012-09-05 02:36:16
【问题描述】:

我想创建一个计算神经网络输出的函数。我的神经网络的元素 是一个 19D 输入向量和一个 19D 输出向量。我选择了一个有 50 个神经元的隐藏层。我的代码如下,但我不太确定它是否正常工作。

double *BuildPlanner::neural_tactics(){


    norm();  //normalize input vector
    ReadFromFile();   // load weights W1 W2 b1

    double hiddenLayer [50][1];


    for(int h=0; h<50; h++){
            hiddenLayer[h][0] =0;
            for(int f = 0; f < 19; f++){

                    hiddenLayer[h][0] = hiddenLayer[h][0] + W1[h][f]*input1[f][0];
            }
    }

    double HiddenLayer[50][1];

    for(int h=0; h<50; h++){
            HiddenLayer[h][0] = tanh(hiddenLayer[h][0] + b1[h][0]);
    }

    double outputLayer[50][1];

    for(int h=0; h<19; h++){
            for(int k=0; k<50; k++){
                    outputLayer[h][0] = outputLayer[h][0] + W2[h][k]*HiddenLayer[k][0];
            }
    }

    double Output[19];

    for(int h=0; h<19; h++){

            Output[h] = tanh(outputLayer[h][0]);
    }

    return Output;
}

实际上我不太确定矩阵乘法。 W1*input+b1 其中大小 矩阵是 50x19 * 19x1 + 50x1 和 W2*outHiddenLayer 19x50*50x1!

【问题讨论】:

  • 您可以从不对所有这些尺寸进行硬编码开始,这样您就可以轻松插入一些小数字并手动查看结果。
  • 是的,这是一个好的开始。但实际上我的问题是乘法是否按我想要的方式工作!

标签: c++ neural-network


【解决方案1】:

你的矩阵乘法对我来说看起来不错,但还有其他问题——`outputLayer 是 50x1,但是 a) 你只遍历前 19 个元素,b) 你在方程的 RHS 上有它

outputLayer[h][0] = outputLayer[h][0] + W2[h][k]...

在该元素被定义之前。这可能会导致你所有的问题。此外,虽然我假设您正在制作 outputLayer 二维以使它们看起来像矩阵,但当第二维的大小为 1 时,它完全是无偿的并且会减慢速度——只需将其声明为,其他维度为

double outputLayer[50];

因为它是一个向量并且它们总是一维的,所以它实际上会让你的代码更清晰。

【讨论】:

  • outputLayer NN 的输出大小为 19x1。定义错误!只是忘记把 50 改成 19 了!!
  • @FereRes 好的。但当然 b) 确实是主要问题,它可以解释为什么你的结果是“奇怪的”——在这种情况下,使用未定义的值不会产生编译或运行时错误,而只会导致未定义的行为。
猜你喜欢
  • 2015-02-23
  • 2020-03-15
  • 2017-11-21
  • 2012-01-16
  • 2014-07-05
  • 2021-09-22
  • 2014-03-26
相关资源
最近更新 更多