【问题标题】:Perceptron doesn't find the right line even with a bias (Processing)即使有偏差,感知器也找不到正确的线(处理)
【发布时间】:2019-01-03 11:24:40
【问题描述】:

即使我添加了偏差,我的感知器也找不到正确的 y 轴截距。斜率是正确的。这是我第二次尝试从头开始编写感知器,我两次遇到相同的错误。 感知器评估画布上的点是高于还是低于截线。输入是 x 坐标、y 坐标和 1 表示偏差。

感知器类:

class Perceptron
{
  float[] weights;

  Perceptron(int layerSize)
  {
    weights = new float[layerSize];
    for (int i = 0; i < layerSize; i++)
    {
      weights[i] = random(-1.0,1.0);
    }
  }

  float Evaluate(float[] input)
  {
    float sum = 0;
    for (int i = 0; i < weights.length; i++)
    {
      sum += weights[i] * input[i];
    }
    return sum;
  }

  float Learn(float[] input, int expected)
  {
    float guess = Evaluate(input);
    float error = expected - guess;

    for (int i = 0; i < weights.length; i++)
    {
      weights[i] += error * input[i] * 0.01;
    }

    return guess;
  }
}

这是测试代码:

PVector[] points;

float m = 1; // y = mx+q  (in canvas space)
float q = 0; //

Perceptron brain;

void setup()
{
  size(600,600);

  points = new PVector[100];
  for (int i = 0; i < points.length; i++)
  {
    points[i] = new PVector(random(0,width),random(0,height));
  }

  brain = new Perceptron(3);
}

void draw()
{
  background(255);
  DrawGraph();
  DrawPoints();
  //noLoop();
}

void DrawPoints()
{
  for (int i = 0; i < points.length; i++)
  {
    float[] input = new float[] {points[i].x / width, points[i].y / height, 1};

    int expected = ((m * points[i].x + q) < points[i].y) ? 1 : 0; // is point above line

    float output = brain.Learn(input, expected);

    fill(sign(output) * 255);

    stroke(expected*255,100,100);
    strokeWeight(3);
    ellipse(points[i].x, points[i].y, 20, 20);
  }
}

int sign(float x)
{
  return x >= 0 ? 1 : 0;
}

void DrawGraph()
{
  float y1 = 0 * m + q;
  float y2 = width * m + q;

  stroke(255,100,100);
  strokeWeight(3);

  line(0,y1,width,y2);
}

【问题讨论】:

  • 您将不得不做一些debugging 来确定您的代码行为与您预期的不同之处。尝试break your problem down into smaller steps 并发布仅一步的minimal reproducible example。祝你好运。
  • @KevinWorkman 感谢您的回复。我测试了一下,发现问题是我必须在计算错误之前对结果“签名”。
  • 不客气。您要发布答案,还是希望我将评论扩展为答案?
  • 我可以发布答案

标签: java neural-network processing perceptron


【解决方案1】:

我发现了问题

float guess = Evaluate(input);
float error = expected - guess;

应该是

float guess = sign(Evaluate(input));
float error = expected - guess;

即使答案是正确的,输出也绝不会是一或零。因此,即使是正确的点也会产生一个小错误,从而阻止感知器找到正确的答案。通过首先计算答案的符号,如果答案正确,则错误为 0。

【讨论】:

  • 解释一下为什么这个解决方案对你有用可能会让你受益,这样阅读本文的其他人就可以理解你做了什么
猜你喜欢
  • 2017-03-15
  • 2014-12-09
  • 2011-08-13
  • 2014-12-11
  • 2023-03-11
  • 1970-01-01
  • 2020-01-28
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多