Как веса должны быть оптимизированы с помощью алгоритма градиентного спуска, чтобы работать? - PullRequest
0 голосов
/ 15 мая 2019

У меня есть нейронная сеть в визуальной студии.для функции потерь я использую базовую функцию стоимости (pred-target) ** 2, а после окончания эпохи я оптимизирую функции параметров впоследствии, но алгоритм не работает.

Независимо от того, чтоВ моей конфигурации сети прогнозы не записываются (это один и тот же выход для всех входов), а функция потерь не оптимизирована.Он остается неизменным на протяжении всех эпох.

void calc_lyr(int x, int y, int idx, float target) // thus function calculates the neuron value based on the previous layer
{
    if (x == -1 || y == 0) // if its the first layer, get the data from input nodes
    {
        for (int i = 0; i < neurons[y]; i++)
        {
            float sum = 0;

            for (int j = 0; j < inputTypes.Count; j++)
            {
                sum += weights[x+1][j][i] * training_test[idx][j];
            }
            sum = relu(sum);
            vals[y+1][i] = sum;

        }
    }
    else
    {
        for(int i = 0; i < neurons[y]; i++)
        {
            float sum = 0;

            for(int j = 0; j < neurons[x]; j++)
            {
                sum += weights[x+1][j][i] * vals[x+1][j] + biases[y][i];
            }
            sum = relu(sum);
            vals[y+1][i] = sum;
        }
    }
}

void train()
{
    log("Proces de antrenare inceput ----------------- " + DateTime.Now.ToString());

    vals = new List<List<float>>();
    weights = new List<List<List<float>>>();
    biases = new List<List<float>>();

    Random randB = new Random(DateTime.Now.Millisecond);
    Random randW = new Random(DateTime.Now.Millisecond);

    for (int i = 0; i <= nrLayers; i++)
    {
        progressEpochs.Value =(int)(((float)i * (float)nrLayers) / 100.0f);

        vals.Add(new List<float>());

        weights.Add(new List<List<float>>());
        if (i == 0)
        {
            for (int j = 0; j < inputTypes.Count; j++)
            {
                vals[i].Add(0);
            }
        }
        else
        {
            biases.Add(new List<float>());

            for (int j = 0; j < neurons[i-1]; j++)
            {
                vals[i].Add(0);

                float valB = (float)randB.NextDouble();
                biases[i-1].Add(valB - ((int)valB));
            }
        }
    }

    float valLB = (float)randB.NextDouble();

    biases.Add(new List<float>());
    biases[nrLayers].Add(valLB - ((int)valLB));


    for (int i = 0; i <= nrLayers; i++)
    {
        if (i == 0)
        {
            for (int j = 0; j < inputTypes.Count; j++)
            {
                weights[i].Add(new List<float>());

                for (int x = 0; x < neurons[i]; x++)
                {
                    float valW = (float)randW.NextDouble();
                    weights[i][j].Add(valW);
                }
            }
        }
        else if (i == nrLayers)
        {
            for (int j = 0; j < neurons[i-1]; j++) {
                weights[i].Add(new List<float>());
                weights[i][j].Add(0);
            }
        }
        else
        {
            for (int j = 0; j < neurons[i - 1]; j++)
            {
                weights[i].Add(new List<float>());

                for (int x = 0; x < neurons[i]; x++)
                {
                    float valW = (float)randW.NextDouble();
                    weights[i][j].Add(valW);
                }
            }
        }
    }


    Random rand = new Random(DateTime.Now.Millisecond);
    log("\n\n");
    for (int i = 0; i < epochs; i++)
    {
        log("Epoch " + (i + 1).ToString() + " inceput ---> " + DateTime.Now.ToString());
        int idx = rand.Next() % training_test.Count;

        float target = outputsPossible.IndexOf(training_labels[idx]);

        for (int j = 0; j < nrLayers; j++)
        {
            calc_lyr(j - 1, j, idx, target);
        }

        float total_val = 0;

        for(int x = 0; x < neurons[nrLayers - 1]; x++)
        {
            float val = relu(weights[nrLayers][x][0] * vals[nrLayers][x] + biases[nrLayers][0]);
            total_val += val;
        }

        total_val = sigmoid(total_val);

        float cost_res = cost(total_val, target);

        log("Epoch " + (i+1).ToString() + " terminat ----- " + DateTime.Now.ToString() + "\n");
        log("Eroare epoch ---> " + (cost_res<1?"0":"") + cost_res.ToString("##.##") + "\n\n\n");

        float cost_der = cost_d(total_val, target);

        for (int a = 0; a < weights.Count; a++)
        {
            for (int b = 0; b < weights[a].Count; b++)
            {
                for (int c = 0; c < weights[a][b].Count; c++)
                {
                    weights[a][b][c]-=cost_der*learning_rate * sigmoid_d(weights[a][b][c]);
                }
            }
        }

        for (int a = 0; a < nrLayers; a++)
        {
            for (int b = 0; b < neurons[a]; b++)
            {
                biases[a][b] -= cost_der * learning_rate;
            }
        }

    }
    hasTrained = true;
    testBut.Enabled = hasTrained;
    MessageBox.Show("Antrenament complet!");

    SavePrompt sp = new SavePrompt();
    sp.Show();
}

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

1 Ответ

0 голосов
/ 26 мая 2019

Я решил это с помощью AForge.NET: ссылка

...