0

首先,我对 DOD 的这个概念很陌生,虽然对它很陌生,但从程序员的角度来看,我发现它真的很令人兴奋。

不久前,我为自己制作了一个多层感知器作为 OO 项目,并且由于我现在正在学习 DOD,所以我认为使用这种范例来制作它会很好。

struct Neuron
{
    double bias;
    double error;
};

struct Layer
{
    Neuron* neurons;
    double* output;
    double** connections;
    unsigned numberNeurons;
};

struct Network
{
    unsigned numberInput;
    double* input;
    std::vector<Layer*> hidden;
    Layer*  output;
};

我知道它可能不是(而且几乎肯定不是)最好的格式,但我试图将我在不同图层数组中使用得更多的东西分开。但是数组的存储方式确实让我很感兴趣,因为它们应该作为一个结构堆叠在一起,以便更快地读取内存(或者我错过了什么?)。如果我没记错的话, new[] 将数组分配在内存中的某个位置,并且只存储指向该位置的指针,而结构中的静态数组将在其空间内分配。

基于此,我想到了制作层(和网络)模板结构:

template<unsigned n_neurons, unsigned n_connections>
struct Layer
{
    Neuron neurons[n_neurons];
    double output[n_neurons];
    double connections[n_neurons][n_connections];
    static const unsigned numberNeurons = n_neurons;
};

但是,如果 Layer 变成了这样的东西,是否有任何方法可以制作具有任意数量隐藏层的 Network 可变参数模板?还是我对静态数组的理解是错误的?创建此类数组(和访问时间)之间有什么区别吗?我的钥匙在哪里?

4

1 回答 1

0

虽然使用 C 风格的数组Layer意味着它们将在struct是否会提高性能的范围内进行分配,这取决于您访问数据的方式,并且通常在您开始遇到性能问题之前您不想过多担心优化。这就是为什么我想知道你为什么不使用std::vector它会对性能造成很小的影响,而且你不必跟踪大小或担心分配。否则很难对性能进行概括,它将是特定于应用程序的,您应该根据基准确定最佳方法。

至于为此示例使用 avariadic template应该Network可以让您很好地了解如何使其工作:

template<unsigned n_neurons, unsigned n_connections>
struct Network
{
    unsigned numberInput;
    double* input;
    std::vector<Layer<n_neurons,n_connections>*> hidden;
    Layer<n_neurons,n_connections>*  output;

    template <typename... Args>
    void helper( Layer<n_neurons,n_connections>* layer) 
    {
       std::cout << "final helper" << std::endl ;
       std::cout << layer->numberNeurons << std::endl ;
    }

    template <typename... Args>
    void helper( Layer<n_neurons,n_connections>* layer, Args... args) 
    {
       std::cout << "helper" << std::endl ;
       std::cout << layer->numberNeurons << std::endl ;
       helper( args... ) ;
    }

    template <typename... Args>
    Network(Args... args)
    {
       std::cout << "Network ctor()" << std::endl ;
       helper( args... ) ;
    }
};

int main()
{
   Network<10,5> N1( new Layer<10,5>(), new Layer<10,5>(), new Layer<10,5>() ) ;
}
于 2013-04-12T16:33:41.977 回答