如何训练这个神经网络?
How to train this neural network?
我编写了一个简单的反向传播神经网络。这是代码片段:
for (int i = 0; i < 10000; i++)
{
/// i1 = Convert.ToDouble(textBox1.Text);
//i2 = Convert.ToDouble(textBox2.Text);
//desired = Convert.ToDouble(textBox3.Text);
Random rnd = new Random();
i1 = rnd.Next(0, 1);
Random rnd1 = new Random();
i2 = rnd1.Next(0, 1);
if(i1 == 1 && i2 == 1)
{
desired = 0;
}
else if(i1 == 0&&i2 == 0)
{
desired = 0;
}
else
{
desired = 1;
}
//hidden layer hidden values
h1 = i1 * w1 + i2 * w2; //i1*w1+i2*w2
h2 = i1 * w3 + i2 * w4;//i1*w3+i2*w4
h3 = i1 * w5 + i2 * w6;//i1*w5+i2*w6;
//hidden layer hidden values
//VALUE OF HIDDEN LAYER
h1v = Sigmoid(h1);
h2v = Sigmoid(h2);
h3v = Sigmoid(h3);
//VALUE OF HIDDEN LAYER
//output final
output = h1v * w7 + h2v * w8 + h3v * w9;
outputS = Sigmoid(output);
//output final
//BACKPROPAGATION
//MARGIN ERROR
Error = desired - outputS; //desired-cena jaka ma byc OutputS-zgadnienta cena
//Margin Error
//DElta output sum
deltaoutputsum = Derivative(output) * Error; //output bez sigmoida i error
//Delta output sum
//weight of w7,w8,w9.
w7b = w7; //0.3
w8b = w8; // 0.5
w9b = w9;// 0.9
w7 = w7 + deltaoutputsum * h1v; //waga w7
w8 = w8 + deltaoutputsum * h2v; //waga w8
w9 = w9 + deltaoutputsum * h3v; //waga w9
//weights of w7,w8,w9.
//DELTA HIDDEN SUm
h1 = deltaoutputsum * w7b * Derivative(h1);
h2 = deltaoutputsum * w8b * Derivative(h2);
h3 = deltaoutputsum * w9b * Derivative(h3);
//DELTA HIDDEN SUM
//weights 1,2,3,4,5,6
w1 = w1 - h1 * i1;
w2 = w2 - h1 * i2;
w3 = w3 - h2 * i1;
w4 = w4 - h2 * i2;
w5 = w5 - h3 * i1;
w6 = w6 - h3 * i2;
label1.Text = outputS.ToString();
label2.Text = w1.ToString();
label3.Text = w2.ToString();
label4.Text = w3.ToString();
label5.Text = w4.ToString();
label6.Text = w5.ToString();
label7.Text = w6.ToString();
label8.Text = w7.ToString();
label9.Text = w8.ToString();
label10.Text = w9.ToString();
//weights 1,2,3,4,5,6
}
解决异或问题非常简单。但我现在不知道如何预测输出。在这里我必须提供 answear 来设置权重,但是如何预测呢?
它训练 10,000 个随机训练数据。
现在当它被训练时如何预测答案?
请帮忙。
对不起我的英语,但我现在不太好。
h1-3是节点的权重
h1v 是节点的值
w1-10 是权重
我认为你的问题在于你的训练方式。
按照以下步骤,我相信你的程序会是正确的
尝试一个接一个地训练每个数据集,而不是随机训练,随机适用于连续的浮点值,但是当你使用 XOR 时,你可能 运行 遇到以下问题对一组或两组值进行过多训练(由于随机的性质)会导致问题将权重移回与其他输入 XOR 值一起使用的值。所以在 [1,1] 上训练,然后立即 [1,0] 然后 [0,1] 然后 [0, 0] 并一遍又一遍地重复。
确保微分函数正确; sigmoid 的导数应该是 sigmoid(x) - sigmoid(x)^2
将您的隐藏总和值命名为不同于 h1
、h2
等。如果您将其用于隐藏节点输入值。
如果你做了那些事情,看起来你应该拥有与 "how to build a neural-network" 拥有的东西在数学上完全等价的东西。
我还建议使用不持久的值 在循环内部 初始化,而不是 在外部 初始化。我可能是错的,但我认为除了你的 w1
w2
w3
等之外没有任何价值......价值需要在每次训练迭代中保持不变。不这样做会导致很难发现错误并使代码更难阅读,因为您无法保证变量不会在其他地方被修改。
我编写了一个简单的反向传播神经网络。这是代码片段:
for (int i = 0; i < 10000; i++)
{
/// i1 = Convert.ToDouble(textBox1.Text);
//i2 = Convert.ToDouble(textBox2.Text);
//desired = Convert.ToDouble(textBox3.Text);
Random rnd = new Random();
i1 = rnd.Next(0, 1);
Random rnd1 = new Random();
i2 = rnd1.Next(0, 1);
if(i1 == 1 && i2 == 1)
{
desired = 0;
}
else if(i1 == 0&&i2 == 0)
{
desired = 0;
}
else
{
desired = 1;
}
//hidden layer hidden values
h1 = i1 * w1 + i2 * w2; //i1*w1+i2*w2
h2 = i1 * w3 + i2 * w4;//i1*w3+i2*w4
h3 = i1 * w5 + i2 * w6;//i1*w5+i2*w6;
//hidden layer hidden values
//VALUE OF HIDDEN LAYER
h1v = Sigmoid(h1);
h2v = Sigmoid(h2);
h3v = Sigmoid(h3);
//VALUE OF HIDDEN LAYER
//output final
output = h1v * w7 + h2v * w8 + h3v * w9;
outputS = Sigmoid(output);
//output final
//BACKPROPAGATION
//MARGIN ERROR
Error = desired - outputS; //desired-cena jaka ma byc OutputS-zgadnienta cena
//Margin Error
//DElta output sum
deltaoutputsum = Derivative(output) * Error; //output bez sigmoida i error
//Delta output sum
//weight of w7,w8,w9.
w7b = w7; //0.3
w8b = w8; // 0.5
w9b = w9;// 0.9
w7 = w7 + deltaoutputsum * h1v; //waga w7
w8 = w8 + deltaoutputsum * h2v; //waga w8
w9 = w9 + deltaoutputsum * h3v; //waga w9
//weights of w7,w8,w9.
//DELTA HIDDEN SUm
h1 = deltaoutputsum * w7b * Derivative(h1);
h2 = deltaoutputsum * w8b * Derivative(h2);
h3 = deltaoutputsum * w9b * Derivative(h3);
//DELTA HIDDEN SUM
//weights 1,2,3,4,5,6
w1 = w1 - h1 * i1;
w2 = w2 - h1 * i2;
w3 = w3 - h2 * i1;
w4 = w4 - h2 * i2;
w5 = w5 - h3 * i1;
w6 = w6 - h3 * i2;
label1.Text = outputS.ToString();
label2.Text = w1.ToString();
label3.Text = w2.ToString();
label4.Text = w3.ToString();
label5.Text = w4.ToString();
label6.Text = w5.ToString();
label7.Text = w6.ToString();
label8.Text = w7.ToString();
label9.Text = w8.ToString();
label10.Text = w9.ToString();
//weights 1,2,3,4,5,6
}
解决异或问题非常简单。但我现在不知道如何预测输出。在这里我必须提供 answear 来设置权重,但是如何预测呢? 它训练 10,000 个随机训练数据。 现在当它被训练时如何预测答案? 请帮忙。 对不起我的英语,但我现在不太好。
h1-3是节点的权重 h1v 是节点的值 w1-10 是权重
我认为你的问题在于你的训练方式。
按照以下步骤,我相信你的程序会是正确的
尝试一个接一个地训练每个数据集,而不是随机训练,随机适用于连续的浮点值,但是当你使用 XOR 时,你可能 运行 遇到以下问题对一组或两组值进行过多训练(由于随机的性质)会导致问题将权重移回与其他输入 XOR 值一起使用的值。所以在 [1,1] 上训练,然后立即 [1,0] 然后 [0,1] 然后 [0, 0] 并一遍又一遍地重复。
确保微分函数正确; sigmoid 的导数应该是
sigmoid(x) - sigmoid(x)^2
将您的隐藏总和值命名为不同于
h1
、h2
等。如果您将其用于隐藏节点输入值。
如果你做了那些事情,看起来你应该拥有与 "how to build a neural-network" 拥有的东西在数学上完全等价的东西。
我还建议使用不持久的值 在循环内部 初始化,而不是 在外部 初始化。我可能是错的,但我认为除了你的 w1
w2
w3
等之外没有任何价值......价值需要在每次训练迭代中保持不变。不这样做会导致很难发现错误并使代码更难阅读,因为您无法保证变量不会在其他地方被修改。