2017-10-15 95 views
2

试图在C中实现感知器,无法训练它。 输出总是会变成零,我不知道什么是错的。 虽然我怀疑它可能是三角函数,或者我错误地实现了感知器。C中的感知器未能训练

在此先感谢大家帮助!

#include<stdio.h> 
#define arrayLength(x) (sizeof(x)/sizeof((x)[0])) 
typedef int bool; 
enum { false, true }; 

int main(){ 
    float trainInputs [2][2] = {{0.0f, 1.0f}, {0.0f, 0.0f}}; 
    float trainOutputs [2][1] = {{1.0f}, {0.0f}}; 
    int amontOfTrainData = 1; 

    float inputs [] = {0.0f, 1.1f}; 
    float outputs [] = {0.0f}; 
    float wights [(arrayLength(inputs) * arrayLength(outputs))] = {0.5f, 0.5f, 0.5f, 0.5f}; 
    float learningRate = 0.01f; 

    float delta(float actual, float want, float wight){ 
     float error = want - actual; 
     float out = error * learningRate * wight; 
     printf(":%.6f:\n", out); 
     return out; 
    } 

    // Run perceptron 

    void run(bool train){ 
     int outputInc = 0; 
     int wightInc = 0; 
     while(outputInc < arrayLength(outputs)){ 
      int inputInc = 0; 

      while(inputInc < arrayLength(inputs)){ 
       if(train){ 
        int x = 0; 
        while(x < amontOfTrainData){ 
         outputs[outputInc] = trainInputs[x][inputInc] * wights[wightInc]; 
         wights[wightInc] = delta(outputs[outputInc], trainOutputs[x][outputInc], wights[wightInc]); 
         x++; 
        } 
       }else{ 
        outputs[outputInc] = inputs[inputInc] * wights[wightInc]; 
       } 
       inputInc++; 
       wightInc++; 
      } 
      //printf("out[%i]: %.5f\n", outputInc, outputs[outputInc]); 
      outputInc++; 
     } 
    } 

    int b = 0; 
    while(b < 100){ 
     run(true); 
     b++; 
    } 
    printf("-----------[ 100 LOOPS DONE ]-----------\n"); 
    run(false); 

    return 0; 
} 
+1

'的typedef整数BOOL;'=>请使用标准的,包括'' – Stargateur

+0

此数组的长度是2,但你提供4个初始化:'浮尸妖[(arrayLength(输入)* arrayLength(输出))] = {0.5f,0.5f,0.5f,0.5f};' – MondKin

+1

请注意,C中不允许嵌套函数定义,尽管有一个gcc扩展允许它.... –

回答

1

error如,learningRatewight小于0,表达式error * learningRate * wight将趋于0太。

delta不应该为重的新的价值,它是变化的量,所以不是:

wights[wightInc] = delta(...); 

尝试:

wights[wightInc] += delta(...); 

(您正在使用哪个源你感知式公式?)

1

我已经应用了所有的更改,这是最终的工作代码。 感谢大家帮助我!

#include<stdio.h> 
#include<stdbool.h> 
#define arrayLength(x) (sizeof(x)/sizeof((x)[0])) 

float trainInputs [2][2] = {{0.0f, 1.0f}, {0.0f, 0.0f}}; 
float trainOutputs [2][1] = {{1.0f}, {0.0f}}; 
int amontOfTrainData = 1; 

float inputs [] = {1.0f, 1.0f}; 
float outputs [] = {0.0f}; 
float wights [(arrayLength(inputs) * arrayLength(outputs))] = {0.001f, 0.001f}; 
float learningRate = 0.1f; 


float delta(float actual, float want, float wight) 
{ 
    float error = want - actual; 
    float out = error * learningRate * wight; 
    return out; 
} 

void run(bool train) 
{ 
    int outputInc = 0; 
    int wightInc = 0; 
    while(outputInc < arrayLength(outputs)) 
    { 
     int inputInc = 0; 

     while(inputInc < arrayLength(inputs)) 
     { 
      if(train) 
      { 
       int x = 0; 
       while(x < amontOfTrainData) 
       { 
        outputs[outputInc] = trainInputs[x][inputInc] * wights[wightInc]; 
        wights[wightInc] += delta(outputs[outputInc], trainOutputs[x][outputInc], wights[wightInc]); 
        x++; 
       } 
      } 
      else 
      { 
       outputs[outputInc] = inputs[inputInc] * wights[wightInc]; 
      } 
      inputInc++; 
      wightInc++; 
     } 
     printf("out[%i]: %.5f\n", outputInc, outputs[outputInc]); 
     outputInc++; 
    } 
} 

int main() 
{ 
    // Run neural network 
    int b = 0; 
    int loops = 500; 
    while(b < loops) 
    { 
     run(true); 
     b++; 
    } 
    printf("-----------[ %i LOOPS DONE ]-----------\n", loops); 
    run(false); 

    return 0; 
}