【问题标题】:Continuous Perceptron Weights Change Zero连续感知器权重变化为零
【发布时间】:2021-03-18 08:12:18
【问题描述】:

我正在研究 2 类简单的感知器问题。我的项目工作是让用户从 GUI 面板单击鼠标并进行分类。 1 类预期输出:1 和 2 类预期输出 -1。我的问题是离散感知器工作正常,但在一点停止减少错误后连续感知器。我不知道我做错了什么。我看了这么多代码和源码。

我的公式;

  • E=1/2 Σ(d-o)^2
  • f(net)=(2/(1+ⅇ^(-net)))-1
  • ΔW=n(d-o)(1-o^2)y

像这样。

d:预期输出,

net: 权重*输入总和,

y:输入矩阵([x1 x2 -1])和

o:实际输出。

下面是连续感知器的代码;

while (totalError > Emax)
{
   totalError = 0;
   for(i=0; i<point.Count; i++)
   {
       double x1 = point[i].X1;
       double x2 = point[i].X2;
       double net = (x1 * w0) + (x2 * w1) + (x0 * w2);
       double o = (2 / (1 + Math.Exp(-net))) - 1;
       double error = Math.Pow(point[i].Class - o, 2);
       w0 += (x1 * c * (point[i].Class - o) * (1 - Math.Pow(o, 2))) / 2;
       w1 += (x2 * c * (point[i].Class - o) * (1 - Math.Pow(o, 2))) / 2;
       w2 += (x0 * c * (point[i].Class - o) * (1 - Math.Pow(o, 2))) / 2;
       totalError += error;
   }
   totalError = totalError / 2;
   ErrorShow(cycle, totalError);
   objGraphic.Clear(Color.White);
   DrawSeperationLine();
   cycle++;
}

Emax=0.001 已选择。项目像这样工作。您可以看到它不正确的行位置。 1 类为蓝色,2 类为红色。

我认为 for 循环有问题。

代码的控制台输出:

编辑: 在与@TaW 讨论后(感谢您提供道路),我在输出(激活功能)中发现了我的问题。它总是返回 1 或 -1。之后在重量变化函数 [1-Math.Pow(o,2)] 部分返回 0 并使重量变化等于 0。所以我的问题是如何解决这个问题。类型转换不起作用。

【问题讨论】:

  • 停止减少错误 运行什么? wrng 结果的错误消息?您是否尝试过调试器来查看哪里出了问题?你测试你的DrawSeperationLine 函数了吗?
  • @TaW 感谢您的评论。离散感知器使用相同的功能和不同的学习功能。 DrawSeperationLine() 函数在离散感知器中工作正常,所以我认为这不是问题。如果你愿意,我可以添加 DrawSeperationLine 函数来提问。我只有运行超时错误消息,因为我的迭代一直持续到 totalError
  • 好的,不需要显示功能 imo。 - 如果 Console.WriteLine 还不够,请使用实际的 debugger,你在编码世界中最好的朋友。
  • @TaW 我认为问题在于激活函数的 Math.Exp 值。当除以 Exp 激活函数值很小时,对权重变化没有任何影响。但我无法更改公式,所以我被卡住了。
  • @TaW 首先感谢您的建议。我使用调试器,就像我在上面的评论中所说的 Exp 值如此之大,输出(激活函数)值如此之小,这使得我的体重变化几乎为零。我的输出值 -1 或 1 因此重量变化(1-Math.Pow(o,2))部分等于 0。这使得重量变化等于 0。现在我的问题是如何解决这个问题?

标签: c# neural-network perceptron


【解决方案1】:

我的问题的解决方案是使用标准化。对于标准化,我使用标准偏差。标准偏差代码如下;

for(i=0;i<point.Count;i++){
   x1 += point[i].X1;
   x2 += point[i].X2;
}
meanx1 = x1 / point.Count;
meanx2 = x2 / point.Count;
for(i=0;i<point.Count;i++){
   totalX1 += Math.Pow(point[i].X1 - meanx1, 2);
   totalX2 += Math.Pow(point[i].X2 - meanx2, 2);
}
normX1 = totalX1 / (point.Count - 1);
normX2 = totalX2 / (point.Count - 1);

normX1 = normX1 / 100;
normX2 = normX2 / 100;

最后一个除法用于减小值。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-08-02
    • 2021-08-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-01
    • 1970-01-01
    相关资源
    最近更新 更多