Как обучить Перцептрон, чтобы узнать, используя функцию стоимости - PullRequest
0 голосов
/ 04 апреля 2019

У меня есть восприятие, которое читает файл для данных, и мне нужно обучить и обновить веса, чтобы получить значение, которое находится ближе всего к нижней части кривой, с использованием функции логистической сигмоиды.Мне нужно выяснить, как реализовать функцию стоимости так, чтобы скорость уменьшалась, пока не будет дано самое точное значение.

        List<string> robot = new List<string>();
        using (StreamReader sr = File.OpenText(path))
        {
            string line;
            while ((line = sr.ReadLine()) != null)
            {
                robot.Add(line);
            }
        }

        List<float> Inputs = new List<float>();


        for (int i = 0; i < robot.Count; i++)
        {
            var text = robot[i].Split(',').ToArray();
            string V1 = text[2];
            Inputs.Add(float.Parse(V1));

        }

        float max = Inputs.Max();
        float min = Inputs.Min();

        for (int i = 0; i < Inputs[i]; i++)
        {
            Inputs[i] = ((Inputs[i] - min) / (max - min));
        }

        for (int i = -2; i < Inputs.Count - 2; i++)
        {
            Program p = new Program(3);
            float result;

            if (i == -2)
            {
                float[] point = { 0, 0, Inputs[0] };
                result = p.Feed(point);
            }
            else if (i == -1)
            {
                float[] point = { 0, Inputs[0], Inputs[1] };
                result = p.Feed(point);
            }
            else
            {
                float[] point = { Inputs[i], Inputs[i + 1], Inputs[i + 2] };
                result = p.Feed(point);
            }

            Console.WriteLine(result);
        }

    }

    Program(int n)
    {
        weights = new float[n];

        for (int i = 0; i < weights.Length; i++)
        {
            weights[i] = (float)RandomNumberBetween(-0.5, 0.5);
        }
    }

    float Feed(float[] inputs)
    {
        int bias = 1;

        float sum = 0;
        for (int i = 0; i < weights.Length; i++)
        {
            sum += inputs[i] * weights[i] + bias * (float)RandomNumberBetween(-0.5, 0.5);
        }
        return Activate(sum);
    }

    float Activate(float sum)
    {
        if (sum > 0) return 1;
        else return 0;
    }

    float Sigmoid(float sum)
    {
        return (float)(1.0 / (1.0 + Math.Pow(Math.E, -sum)));
    }

    void Train(float[] inputs, int desired)
    {
        float guess = Feed(inputs);
        float error = desired - guess;
        for (int i = 0; i < weights.Length; i++)
        {
            weights[i] += c * error * inputs[i];
        }
    }
}

Мне нужно реализовать функцию стоимости, которая будет проходить через данные, обновлять весапока он не достигнет как можно ближе к нижней части кривой.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...