我正在构建一个简单的神经网络,我有两个主要的分类:NeuralNetwork和Level。我没有神经元,因为它是一个简单的前馈,一个级别中的所有单元共享相同的激活功能。
我以这种方式组织了我的关卡:
类NeuralNetwork有一个级别向量(不是指针,值。),用于快速访问它们,类Level的每个对象都有一个指向前一级和下一级的指针,一些矩阵和东西。
更一般的问题是: 组织为像Level这样的双链表的类的复制/移动构造函数/赋值运算符应该做什么?
按照下一个和后一个指针复制整个结构,并返回刚刚复制的对象的istance。
复制单个级别,将指针下一个\ prec复制到nullptr,返回单个级别,仅包含矩阵的副本ecc ..
删除复制构造函数/赋值运算符。
答案 0 :(得分:1)
你的课程取决于你。话虽如此,人们通常会希望链接列表等通用容器可以复制。
在设计此类课程时,更常见的是,请问自己以下内容:
如果不清楚复制此课程的含义,请不要将其复制。如果复制此课程并不具有意义,请不要将其复制。如果人们会惊讶地看到课程被复制(想想unique_ptr),不要在没有认真思考的情况下使其复制。这些并不是一个很难的规则,这些只是一些思路,可以帮助你找出合适的东西。
如果你不打算制作一些可复制的东西,删除相关的操作符确实有意义(如果没有别的话,这就作为文档)。
如果你确实让你的课堂可以复制,那么你可以根据自己的实施方式来决定。您可以创建在写入时复制的共享实例,您可以急切地复制,您可以随心所欲地执行任何操作;这一切都取决于你的用户(包括你)将会发生什么,以及每个用户的权衡取舍。
答案 1 :(得分:0)
“类NeuralNetwork有一个级别向量(不是指针,值。),用于快速访问它们,类Level的每个对象都有一个指向prec和下一级的指针”
这有点无意义。上一层为*(this-1)
,下一层为*(this+1)
。那是因为vector连续存储其元素。当然,知道是上一层还是下一层是一个小小的挑战,但这个问题不会出现。由于您直接设置了值,因此输入图层是一个特殊图层。所有下一层都可以安全地从前一层拉出输入,因此没有层需要将其输入推送到下一层。
训练有点困难,因为你有一个反向传播阶段,需要双向行走。但是,在这里您可以控制输入和所需的输出,因此您明确使用layers.front()
和layers.back()
,绝不会超越它们。
现在,当您复制整个矢量时,每个图层都是一个副本,并且有一个新的this
,但由于新矢量再次连续,因此邻居的*(this-1)
/ *(this+1)
规则仍然坚持。