【发布时间】: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