예제 #1
0
        private void навчитиToolStripMenuItem_Click(object sender, EventArgs e)
        {
            dataGridView1.DataSource = errors;
            dataGridView2.DataSource = function;
            dataGridView3.DataSource = weightsHidden;
            dataGridView4.DataSource = weightsOutput;

            switch (comboBox1.Text)
            {
            case "ln|cosx1| + tgx2 + ctgx3":
            {
                errors.Columns.Add("iteration");
                errors.Columns.Add("function");
                errors.Columns.Add("error");
                errors.Columns.Add("output[d1]");
                errors.Columns.Add("output[d2]");

                double sum = 0.0;
                for (int i = 0; i < dt.Rows.Count; i++)
                {
                    desired[i][0] = Math.Sin(input[i][0]) + Math.Sin(input[i][1]) - Math.Sin(input[i][2]);     /* Math.Log(Math.Abs(Math.Cos(input[i][0]))) + Math.Tan(input[i][1]) + 1/Math.Tan(input[i][2]);/*Math.Cos(input[i][0]) + Math.Tan(input[i][1]) + 1 / Math.Tan(input[i][2]);*/
                    sum          += desired[i][0];
                }

                function.Columns.Add("i");
                function.Columns.Add("x1");
                function.Columns.Add("x2");
                function.Columns.Add("x3");
                function.Columns.Add("d1");
                function.Columns.Add("d2");
                function.Columns.Add("average");

                for (int i = 0; i < desired.GetUpperBound(0) + 1; i++)
                {
                    DataRow row = function.NewRow();
                    row["i"]  = i;
                    row["x1"] = input[i][0];
                    row["x2"] = input[i][1];
                    row["x3"] = input[i][2];
                    row["d1"] = desired[i][0];
                    function.Rows.Add(row);
                }

                double[] output = new double[2];

                // Навчання
                int      example = 1;
                int      h       = 0;
                double[] value   = new double[3] {
                    4, 5, 4
                };
                Random rdn = new Random();
                do
                {
                    error = 0.0;
                    input.Reverse();

                    for (int j = 0; j < dt.Rows.Count; j++)
                    {
                        error += bpn.Train(ref input[j], ref desired[j], TrainingRate, Momentum);
                    }
                    if (h % 100 == 0)
                    {
                        bpn.Run(ref value, out output);
                        DataRow row = errors.NewRow();
                        row["iteration"]  = h;
                        row["function"]   = example;
                        row["error"]      = error / 20;
                        row["output[d1]"] = output[0];
                        //row["output[d2]"] = output[1];
                        errors.Rows.Add(row);
                    }
                    h++;
                    if (h == 200000)
                    {
                        break;
                    }
                } while ((error / 20) > 0.00127);

                // Виведення скоригованих ваг прихованого шару
                hidden = bpn.GetWeights(0);
                weightsHidden.Columns.Add("Початковий/Прихований");

                for (int i = 0; i < hidden[0].Count(); i++)
                {
                    weightsHidden.Columns.Add(Convert.ToString(i));
                }

                for (int i = 0; i < hidden.GetUpperBound(0) + 1; i++)
                {
                    DataRow row = weightsHidden.NewRow();
                    row["Початковий/Прихований"] = i;
                    for (int j = 1; j < weightsHidden.Columns.Count; j++)
                    {
                        row[j] = hidden[i][j - 1];
                    }
                    weightsHidden.Rows.Add(row);
                }

                // Виведення скоригованих ваг вихідного шару
                outputWeights = bpn.GetWeights(1);
                weightsOutput.Columns.Add("Прихований/Вихідний");

                for (int i = 0; i < outputWeights[0].Count(); i++)
                {
                    weightsOutput.Columns.Add(Convert.ToString(i));
                }

                for (int i = 0; i < outputWeights.GetUpperBound(0) + 1; i++)
                {
                    DataRow row = weightsOutput.NewRow();
                    row["Прихований/Вихідний"] = i;
                    for (int j = 1; j < weightsOutput.Columns.Count; j++)
                    {
                        row[j] = outputWeights[i][j - 1];
                    }
                    weightsOutput.Rows.Add(row);
                }


                break;
            }
            }
        }