【问题标题】:my c++ code is a lot slower than javascript code我的 c++ 代码比 javascript 代码慢很多
【发布时间】:2019-10-05 10:32:10
【问题描述】:

我有一个使用相同数据的项目,在我的 c++ 代码中需要 17 秒来训练 100 个数据,同时在这个项目的 javascript 代码中

https://github.com/CodingTrain/Toy-Neural-Network-JS 它只运行大约 10 秒来训练 2400 个数据 请有人帮我解决问题,我需要完成我的本科论文项目。

我已经构建了 2 个项目,其中一个(这个)是来自那个 javascript 代码(有点)的 c++ 中相同的神经网络,但仍然给出相同的结果

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]);
            }
        }


    }

【问题讨论】:

  • 您是如何进行基准测试的,您在编译代码、调试/发布编译时设置了哪些编译器优化级别?在为您的代码给出简明解释之前,有许多问题需要澄清。
  • 我可以看看你是怎么编译这个的吗?
  • 我认为最大的问题是你没有使用向量和矩阵,这比使用std::vector 快​​得多。请参阅您可以使用的一些库的链接:stackoverflow.com/questions/1380371/…
  • Id 考虑使用修复数组来避免为向量重新分配内存,并确保通过 ref 传递参数。根据您使用的是 c++17 还是打开了 rvo,从函数返回向量可能代价高昂。我说要加快速度的两个主要方面是确保您使用的是 c++17 并为您的编译器启用了完整级别的优化。
  • 另外,在类似算法中从 Debug 切换到 Release 配置时,我体验了高达 1000 倍的速度。

标签: javascript c++ performance visual-c++ neural-network


【解决方案1】:

您将所有std::vectors 复制到函数中:

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)

const std::vector 引用无法修改,当您在修改后再次将向量复制进出时:

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

改用非常量引用:

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

【讨论】:

  • 字面上没有区别
  • 它必须优化到使用引用,您应该将它们留在代码中以明确发生这种情况。
【解决方案2】:

原来我只是个白痴,不懂调试/发布,把这个程序发布出来只是为了解决问题,谢谢大家的帮助

【讨论】:

  • 啊,是的。您没有将如何作为问题的一部分包含您编译代码的内容。有人会指出您的应用程序没有让编译器执行优化。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-08-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-08-29
相关资源
最近更新 更多