如何提高神经网络的性能?

时间:2018-02-01 03:39:43

标签: c++ visual-studio performance neural-network evolutionary-algorithm

我正在实施基本的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分钟。较小的问题需要数十万。

有哪些方法可以降低这个数字?

1 个答案:

答案 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倍。