gpt4 book ai didi

javascript - 我的 C++ 代码比 JavaScript 代码慢很多

转载 作者:太空狗 更新时间:2023-10-29 23:10:38 26 4
gpt4 key购买 nike

我有一个使用相同数据的项目,在我的 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 复制到函数中:

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

改用引用:

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

复制 vector 在空间和时间上都是O(n) 操作,使用引用在两者上都是O(1)

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

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

改用非常量引用:

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

关于javascript - 我的 C++ 代码比 JavaScript 代码慢很多,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56197475/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com