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