мой код C ++ намного медленнее, чем код JavaScript - PullRequest
3 голосов
/ 18 мая 2019

У меня есть проект, который использует те же данные, которые в моем коде c ++ требуют 17 секунд для обучения 100 данных, в то время как в коде JavaScript этого проекта

https://github.com/CodingTrain/Toy-Neural-Network-JS он работает только около 10 секунддля обучения 2400данных, пожалуйста, кто-нибудь, помогите мне, что не так, и мне нужно завершить мой проект для моей диссертации бакалавра.

я уже собрал 2 проекта, один из которых (это) является той же нейронной сети в C ++ из этого JavaScriptкод (вроде), но все равно дает те же результаты

NeuralNetwork::NeuralNetwork(int a,int b,int c)
{
    this->numInput = a;
    this->numHidden = b;
    this->numOutput = c;
    std::vector<double> vec(a, 0.1);
    for (int i = 0; i < b; ++i) {
        this->weightIH.push_back(vec);
    }
    std::vector<double> vec2(b, 0.1);
    for (int i = 0; i < c; ++i) {
        this->weightHO.push_back(vec2);
    }

}


NeuralNetwork::~NeuralNetwork()
{
}

std::vector<double> NeuralNetwork::tambahbias(std::vector<double> a) {
    int size = a.size();
    for (int i = 0; i < size; ++i) {
        a[i] = a[i] + 1;
    }

    return a;
}

std::vector<double> NeuralNetwork::activate(std::vector<double> a) {
    int size = a.size();
    for (int i = 0; i < size; ++i) {
        a[i] = a[i] / (1 + abs(a[i]));
    }
    return a;
}

std::vector<double> NeuralNetwork::derivation(std::vector<double> a) {
    int size = a.size();
    for (int i = 0; i < size; ++i) {
        a[i] = a[i] * (1 - a[i]);
    }
    return a;
}

std::vector<double> NeuralNetwork::hitungError(std::vector<double> a, std::vector<double> b) {
    int size = a.size();
    for (int i = 0; i < size; ++i) {
        a[i] = b[i] - a[i];
    }

    return a;
}


    void NeuralNetwork::train(std::vector<double> a, std::vector<double> target) {
        std::vector<double> hidden(numHidden);
        for (int i = 0; i < numHidden; ++i) {
            for (int j = 0; j < numInput; ++j) {
                hidden[i] += a[j] * weightIH[i][j];
            }
        }
        hidden = tambahbias(hidden);
        hidden = activate(hidden);
        std::vector<double> output(numOutput);
        for (int i = 0; i < numOutput; ++i) {
            for (int j = 0; j < numHidden; ++j) {
                output[i] += hidden[j] * weightHO[i][j];
            }
        }
        output = tambahbias(output);
        output = activate(output);
        std::vector<double> errorO(numOutput);
        errorO = hitungError(output, target);
        std::vector<double> gradO(numOutput);
        gradO = derivation(output);
        for (int i = 0; i < numOutput; ++i) {
            gradO[i] = gradO[i] * errorO[i] * 0.1;
        }
        for (int i = 0; i < numOutput; ++i) {
            for (int j = 0; j < numHidden; ++j) {
                weightHO[i][j] += (gradO[i] * hidden[j]);
            }
        }
        std::vector<double> gradH(numHidden);
        std::vector<double> derH(numHidden);
        derH = derivation(hidden);
        for (int i = 0; i < numHidden; ++i) {
            for (int j = 0; j < numOutput; ++j) {
                gradH[i] = gradO[j] * weightHO[j][i];
            }
            gradH[i] = gradH[i] * derH[i] * 0.1;
        }
        for (int i = 0; i < numHidden; ++i) {
            for (int j = 0; j < numInput; ++j) {
                weightIH[i][j] += (gradH[i] * a[j]);
            }
        }


    }

Ответы [ 2 ]

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

Оказывается, я просто идиот, который не знает об отладке / выпуске, заставьте эту программу выпустить просто решить проблему, спасибо всем за вашу помощь

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

Вы копируете все свои std::vector s в функции:

void NeuralNetwork::train(std::vector<double> a, std::vector<double> target) 

вместо этого используйте ссылки:

void NeuralNetwork::train(const std::vector<double>& a, const std::vector<double>& target)

Копирование вектора - операция O(n) в обоих пространствахи время, используя ссылку, равно O(1) в обоих.

A const std::vector ссылка не может быть изменена, когда вы копируете вектор снова и снова после его изменения:

std::vector<double> NeuralNetwork::derivation(std::vector<double> a)

вместо этого используйте неконстантную ссылку:

void NeuralNetwork::derivation(std::vector<double>& a)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...