在C++中用反向传播实现隐层神经网络的最佳数据结构是什么

What are the optimal data structures for implementing a hidden layer neural network with backpropagation in C++?

本文关键字:神经网络 最佳 是什么 数据结构 实现 C++ 传播      更新时间:2024-09-27

如果这看起来像是重复的帖子,我很抱歉,但我想知道在C++中实现和存储一个具有权重和偏差以及反向传播的简单隐层神经网络的最佳数据结构是什么。

在我的脑海里,我在想以下几点:

  • 链表
  • 指针数组

这两个似乎在很大程度上等同于我。我也经常看到人们使用3D阵列/向量来存储权重和偏差,但这对我来说似乎是浪费,因为你要么被限制在每层节点数量相同的神经网络中,要么在你的3D阵列中为不存在的节点连接存储了很多零项。

我看到的一个选项是这样做的:节点有一个线性数组,所有边有一个。草图:

struct Node {
std::size_t edgeBegin;
std::size_t edgeEnd;
};
struct Edge {
std::size_t to;
float weight;
};
struct Layer {
std::size_t layerBegin;
std::size_t layerEnd;
};
struct Network {
std::vector<Node> nodes;
std::vector<Edge> edges;
std::array<Layer,3> layers;
};

在填充这个结构之后,它可能看起来像这样:

nodes:  [n0, n1, n2, n3, n4, n5, n6, n7]
layers: [(0, 2), (2, 5), (5, 8)]
-> input layer has two nodes, hidden has three, output layer has three

其中每个节点指向边中的一个部分,保持该特定节点的边。

通过这样做,您很有可能缓存到本地如果正确设置了网络初始化,您只需要请求两次动态内存。

这假设网络不会改变(即,在使用网络时创建新节点,并且没有创建新边(。