0
 public double Sigmoid(double x)
        {
            return 2 / (1 + Math.Exp(-2 * x)) - 1;
        }
        public double Derivative(double x)
        {
            double s = Sigmoid(x) - (Sigmoid(x)* Sigmoid(x));
            return s;
        }   

当我训练网络时,它会给出输出:

  • 0,0 = 0 它总是 0 //我不知道
  • 0,1 = 0,67,它正在上升//很好,但在 1000 次重复后,它达到 0.20,它正在下降
  • 1,0 = 0.50,它正在上升//很好,但在 1000 次重复后,它达到 0.20,它正在下降
  • 1,1 = 0.80 并且它正在上升//错误它应该下降。

错误在哪里?

神经网络(XOR 和反向传播)

int pw = Convert.ToInt32(textBox1.Text);
        for (int i12 = 0; i12 < pw; i12++)
        {

            //i1 = Convert.ToDouble(textBox2.Text);
            // i2 = Convert.ToDouble(textBox3.Text);
            // desired = Convert.ToDouble(textBox1.Text);


            for (int i = 0; i < 4; i++)
            {
                if (i == 0)
                {
                    i1 = 1;
                    i2 = 1;
                    desired = 0;
                }
                else if (i == 1)
                {
                    i1 = 1;
                    i2 = 0;
                    desired = 1;
                }
                else if (i == 2)
                {
                    i1 = 0;
                    i2 = 1;
                    desired = 1;
                }
                else if (i == 3)
                {
                    i1 = 0;
                    i2 = 0;
                    desired = 0;
                }


                // double[] questions = new double[2];
                //  questions[0] = 1;
                //  questions[1] = 0;
                // Random rnd = new Random();
                //   double s = questions[rnd.Next(0, 2)];
                //  double s1 = questions[rnd.Next(0, 2)];
                // i1 = s;
                // i2 = s1;

                //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 * 0.05; //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;

为什么训练后它给出:

  • 1.0 ==接近0,应该接近1
  • 1.1 ==接近1,应该是0

  • 0.0 == 很好,接近 0

  • 0.1 ==接近0,应该接近1

这是训练后使用的代码(i1 和 i1 是输入 1 或 0 )

i1 = Convert.ToDouble(textBox4.Text);
            i2 = Convert.ToDouble(textBox5.Text);
            //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);
            MessageBox.Show(outputS.ToString());

w1-w10 是权重。h1v 是隐藏层的价值。h1 是隐藏层的权重

4

0 回答 0