Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/kotlin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Neural network 创建用于评估逻辑函数的神经网络_Neural Network - Fatal编程技术网

Neural network 创建用于评估逻辑函数的神经网络

Neural network 创建用于评估逻辑函数的神经网络,neural-network,Neural Network,我一直在努力学习神经网络,我在互联网上看到的所有例子都给出了模拟逻辑门的例子,比如XOR门。但我想做的是创建一个网络,可以训练它模拟函数,比如x^2或e^x。这可能吗?我需要对网络进行哪些更改? 这是我的神经网络代码,由1个输入节点组成,一个隐藏层由3个节点组成,还有一个输出节点 #include <iostream.h> #include <fstream.h> #include <math.h> #include <t

我一直在努力学习神经网络,我在互联网上看到的所有例子都给出了模拟逻辑门的例子,比如XOR门。但我想做的是创建一个网络,可以训练它模拟函数,比如
x^2
e^x
。这可能吗?我需要对网络进行哪些更改? 这是我的神经网络代码,由1个输入节点组成,一个隐藏层由3个节点组成,还有一个输出节点

    #include <iostream.h>
    #include <fstream.h>
    #include <math.h>
    #include <time.h>
    const double eeta=0.9;
    const int n=5;
    struct Net_elem
    {
       double weights1[3];
       double weights2[3];
       double bias1,bias2;
    };//structure to store network paramenters
     Net_elem net_elem;
     double sigma(double input)
     {
      return 1/(1+exp(-input));
      }
     void show_net_elem()
     {
                cout.precision(15);
               for(int i=0;i<3;i++)
               {
                       cout<<"weights1["<<i<<"]="<<net_elem.weights1[i];
                       cout<<endl;
               }
               for(int i=0;i<3;i++)
               {
                       cout<<"weights2["<<i<<"]="<<net_elem.weights2[i];
                       cout<<endl;
               }
               cout<<"bias1="<<net_elem.bias1<<" bias2="<<net_elem.bias2<<endl;
               system("pause");
               system("cls");
    }
     //function to train the network
    void train(double input,double expected)
    {
     double Output,output[3],Delta,delta[3],delta_bias1,delta_bias2;

     //Propogate forward
     double sum=0;
     for(int i=0;i<3;i++)
       output[i]=sigma(input*net_elem.weights1[i]+net_elem.bias1);
     sum=0;
     for(int i=0;i<3;i++)
       sum=sum+output[i]*net_elem.weights2[i];
     Output=sigma(sum+net_elem.bias2);
     cout<<"Output="<<Output<<endl;

     //Backpropogate

     Delta=expected-Output;
     for(int i=0;i<3;i++)
        delta[i]=net_elem.weights2[i]*Delta;
        delta_bias2=net_elem.bias2*Delta;

     //Update weights

     for(int i=0;i<3;i++)
       net_elem.weights1[i]=net_elem.weights1[i]+eeta*delta[i]*output[i]*(1-output[i])*input;
     for(int i=0;i<3;i++)
       net_elem.weights2[i]=net_elem.weights2[i]+eeta*Delta*Output*(1-Output)*output[i];
     net_elem.bias2=net_elem.bias2+eeta*delta_bias2;
     double sum1=0;
     for(int i=0;i<3;i++)
        sum1=sum1+net_elem.weights1[i]*delta[i];
     net_elem.bias1=net_elem.bias1+eeta*sum1;
     show_net_elem();
}
void test()
{
     cout.precision(15);
     double input,Output,output[3];
     cout<<"Enter Input:";
     cin>>input;
     //Propogate forward
     double sum=0;
     for(int i=0;i<3;i++)
       output[i]=sigma(input*net_elem.weights1[i]+net_elem.bias1);
     for(int i=0;i<3;i++)
       sum=sum+output[i]*net_elem.weights2[i];
     Output=sigma(sum+net_elem.bias2);
     cout<<"Output="<<Output<<endl;    
}
#包括
#包括
#包括
#包括
常数双eeta=0.9;
常数int n=5;
结构网络元素
{
双重权重1[3];
双权重2[3];
双偏置1,偏置2;
};//存储网络参数的结构
净要素净要素;
双西格玛(双输入)
{
返回1/(1+exp(-input));
}
无效显示网络元素()
{
计算精度(15);

对于(int i=0;i我认为你没有抓住使用神经网络的要点。神经网络不模仿已知函数。它们在未知向量空间中分离区域。XOR问题通常作为一个例子给出,因为它是一个最小的非线性可分离问题:一个简单的感知器只是一条线,将你的问题中的两个区域分开

在这种情况下,可以使用一条简单的线将蓝色圆点与红色圆点分开(问题是线性可分的)。但是,在XOR问题中,圆点的位置如下所示:

在这里,单行(感知器)是不够的。然而,多层感知器(很可能是您正在使用的神经网络类型)可以使用多个感知器(在本例中为两个)来分离蓝点和红点。类似地,神经网络可以分离任何空间

然而,XOR问题产生两种类型的输出,我们使用神经网络将它们分开。另一方面,x^2产生连续的点线,因此没有什么可以分开。另外,请记住,模拟XOR函数是此类问题的一个例子。在实践中,从来没有人使用神经网络来代替t如果你想使用一个函数,只需要使用它,而不是建立一个近似的函数


PS:如果你仍然想模拟x^2函数进行练习,你需要回归。你所做的是分类(因为你在输出中使用了sigma函数)但是,练习时,你最好还是坚持分类问题。他们更常见。对于这样的问题,尝试MATLAB,或者,如果你想用C++写一些线性代数库(如特征3)。无需1000个for循环就可以更轻松地编写。

要知道需要进行哪些更改,我们需要知道我们正在更改什么。您能给我们展示一个您尝试过的示例吗?您可以教您的网络sqrt(100)=10,对吗?首先
输入[i]
应该取决于
i
或一个随机值。第二,我会尝试大量训练它。至少要进行数千次训练。然后你可以问自己为什么它什么都学不到。第三,我看到一些格式问题。
delta_bias2=net_elem.bias2*delta;
应该在
for
循环中吗?第四。。。这是一个非常明显的调试问题,“神经网络不模仿已知的函数。”抱歉,但我不得不强烈反对,大约25年来已经证明,2层感知器是任意连续函数的通用近似器。@Dolma:这是正确的。但是,这种能力允许网络本身创建一个广义函数,用于未知问题空间中的分类或回归。这是正确的从未在实践中用于模拟用户已知的函数。OP似乎在问为什么XOR函数经常被引用为示例,我想说明如何结合线性分类器对非线性可分离数据集进行分类,这是神经网络新手的起点。是的,你是绝对正确的是的!虽然有时我们确实希望使用已知函数。例如,为了测试网络架构和/或学习算法的泛化能力,我们可以使用已知函数,应用一些随机扰动,然后使用扰动输出来训练网络,希望它适合原始的未扰动函数。除了我同意你的看法,在实践中,这并不是你经常做的事情;)
int main()
{
    net_elem.weights1[0]=(double)(rand()%100+0)/10;
    net_elem.weights1[1]=(double)(rand()%100+0)/10;
    net_elem.weights1[2]=(double)(rand()%100+0)/10;
    net_elem.weights2[0]=(double)(rand()%100+0)/10;
    net_elem.weights2[1]=(double)(rand()%100+0)/10;
    net_elem.weights2[2]=(double)(rand()%100+0)/10;;
    net_elem.bias1=(double)(rand()%100+0)/10;
    net_elem.bias2=(double)(rand()%100+0)/10;
    double output[n],input[n];
    int ch;
    for(int i=1;i<n;i++)
    {
            input[i]=100;
            output[i]=sqrt(input[i]);
    }
    do
    {
            cout<<endl<<"1. Train"<<endl;
            cout<<"2. Test"<<endl;
            cout<<"3. Exit"<<endl;
            cin>>ch;
            switch(ch)
            {
                      case 1:for(int i=1;i<n;i++)
                      {
                            train(input[i],output[i]);
                      }
                            break;
                      case 2:test();break;
                      case 3:break;
                      default:cout<<"Enter Proper Choice"<<endl;
            }
     }while(ch!=3);
}