【问题标题】:Single neuron in neural network using c++使用c ++的神经网络中的单个神经元
【发布时间】:2016-12-15 11:42:32
【问题描述】:

我正在尝试用 C++ 编写一个类似于此图像的简单神经元函数。我使用 sigmoid 函数作为激活函数。

这是我的 c++ 神经元函数

#include<math.h>

double neuron(double layer_inputs[],int iter)
{

  // Feed forwarding single neuron
    double network=0;
    double bias=1;
    double activation;

    //get number of elements in the layer
    const int num=sizeof(layer_inputs)/sizeof(layer_inputs[0]);
    double weight[num];

    for ( int i = 0; i < num; i++ )
    {
        if(iter==0)
        {
        //first time assigning random weights
            weight[i]=rand();
        }

        //feed forwarding summation
        network=network+(layer_inputs[i]*weight[i]+bias);


    }

    activation= 1.0 / (1.0 + exp(-network)); //sigmoid activation function

return activation;
}

问题是我不知道我的代码是否有任何逻辑错误。 iter 是检查神经元是否第一次激活的迭代变量。我在神经网络中写的神经元正确吗?

编辑:

尽管我不是编程或量化背景,但我对编程、神经网络和人工智能很着迷。我在caret R 中使用了内置函数,但为了进一步了解,我想从头开始创建一个简单的神经网络。我从互联网上学到了大部分基础知识,我在这里发布我的代码,因为我确信我做了一些不合逻辑但正在执行的脚本。

#include<iostream>
#include <math.h>//pow, exp
#include "sqrtnn.h" //neuron()


int main()
{

    double input[]= {1,4,9,16,25,36,49,64,81,100};
    double output[]= {1,2,3,4,5,6,7,8,9,10};
    //number of layers
    double layer=3;
    double output_network[10];
    double error[10];
    double learning_rate=0.02;
    //number of iterations
    int iter=10;
    int input_num=sizeof(input)/sizeof(input[0]);
    std::cout<<"Simple  neural network for solving square root\n \nINPUT -> OUTPUT\n\n";
    for ( int i = 0; i < iter; i++ )
    {
        for ( int j = 0; j < input_num; j++ )
        {
            for ( int k = 0; k < layer; k++ )
            {
                //feed forwarding
                output_network[j] =neuron(input,i) ; //sigmoid activation function

                //back propogation
                error[j]=1/2*pow(output[j]-output_network[j],2);//error function
                std::cout<<input[j]<<" -> "<< output[j]<<"= "<< error[j] <<"\n";


            }
        }
    }


    return 0;
}

【问题讨论】:

  • 你写过单元测试吗?定义一些输入和预期输出并编写单元测试来针对这些输入测试您的功能。
  • 您需要在此处发布之前进行自己的逻辑测试
  • 理论上看起来没问题——只要你在某处随机播种。你为什么问?你有什么特别关心的事情吗?正如 cmets 所说,尝试编写一些测试。
  • sizeof(layer_inputs) 等于 sizeof(double *)。也许问题就在这里?
  • iter==0 测试效率不高。您可能想在别处初始化权重。

标签: c++ neural-network


【解决方案1】:

您正在编写 C 代码,而不是 C++。 C 数组不知道自己的大小。使用std::vector&lt;double&gt; layer_inputs,以便您可以拨打layer_inputs.size()

代码中的其他 C 位:在需要之前不要声明变量;你声明activation 太早了。事实上,我根本不会定义它 - 只是 return 1.0 / (1.0 + exp(-network));

【讨论】:

  • 从技术上讲,新的 C 规范还允许在需要时声明变量,对吧?
【解决方案2】:

这里的问题只是将double input[10] 转换为double input[],因为它是 c++ 而不是 c 在输出数组上也这样做,它不是训练神经网络模型,因为提供了实际的(准备好的女仆输入/输出)和 @ 987654323@ 声明不在任何地方使用。

【讨论】:

  • 我认为你获取随机或用户数据并用你的神经网络找到 sqrt 然后你会得到错误,否则不会发生错误。这是非常好的代码。修改这个你会得到很好的结果。我感谢你的工作。
猜你喜欢
  • 1970-01-01
  • 2016-09-02
  • 2017-09-11
  • 1970-01-01
  • 2016-09-08
  • 1970-01-01
  • 2017-05-21
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多