我正在实施基本的NeuroEvolution计划。我正在尝试的数据集是"封面类型"数据集。该组有15,120条记录,56条输入(林地斑块的数字数据)和1条输出(封面类型)。按照建议,我使用150个隐藏的神经元。适应度函数尝试遍历所有15,120条记录以计算错误,并使用该错误计算适合度。方法如下所示。
double getFitness() {
double error = 0.0;
// for every record in the dataset.
for (int record = 0; record < targets.size(); record++) {
// evaluate output vector for this record of inputs.
vector<double> outputs = eval(inputs[record]);
// for every value in those records.
for (int value = 0; value < outputs.size(); value++) {
// add to error the difference.
error += abs(outputs[value] - targets[record][value]);
}
}
return 1 - (error / targets.size());
}
&#34;输入&#34;和&#34;目标&#34;是从CSV文件读入的二维向量。整个程序在运行时使用~40 MB的内存。那不是问题。该程序从父网络变异,两者都被评估为适应性,并且最适合的是保持变异。在整个过程中,getFitness()函数占用的时间最多。该程序是用Windows 10中的Visual Studio 2017(在2.6GHz i7上)编写的。
使用21%的CPU评估一个网络的健康状态需要大约7分钟。较小的问题需要数十万。
有哪些方法可以降低这个数字?
答案 0 :(得分:0)
该程序实现了(显然)显着使用向量,无法使用OpenCL或CUDA直接卸载到GPU而无需进行重大修改。这使得OpenMP成为最可行的选择。只需2行代码即可“添加并行”。此外,必须将Visual Studio设置为使用OpenMP(项目 - &gt;属性 - &gt; C / C ++ - &gt;语言 - &gt; Open MP支持)。
#include <omp.h>
#include <numeric>
// libraries, variables, functions, etc...
double getFitness() {
double err = 0.0;
vector<double> error;
error.resize(inputs.size());
// for every record in the dataset.
#pragma omp parallel for
for (int record = 0; record < targets.size(); record++) {
// evaluate output vector for this record of inputs.
vector<double> outputs = eval(inputs[record]);
// for every value in those records.
for (int value = 0; value < outputs.size(); value++) {
// add to error the difference.
error[record] = abs(outputs[value] - targets[record][value]);
}
}
err = accumulate(error.begin(), error.end(), 0);
return 1 - (err / targets.size());
}
在上面的代码中,OMP应该为每个记录创建一个线程。但是,除非您在云实例上运行它,否则会占用您的CPU。预计四核CPU的性能将提高约4倍。