堆栈溢出多层感知器

stack overflow multi layer perceptron

本文关键字:感知 栈溢出 堆栈      更新时间:2023-10-16

我正在尝试使用visual studio 2013在c++中构建一个多层感知器网络。首先,我为第一层的中子创建了一个结构,但当我运行时,它会给我一个堆栈溢出错误。这是我的代码:

#include "stdafx.h"
#include <iostream>
#include <math.h>
#include <fstream>
#include <vector>
// Number of Neurons
#define INPUTS 784
#define INPNEUR 784
#define HIDNEUR 500
#define OUTNEUR 10
struct inpneuron {
int number;
double weights[INPUTS];
double bias;
double inputs[INPUTS];
double output;
double delta;
};
typedef struct inpneuron InpNeuron;
using namespace std;
int _tmain(int argc, _TCHAR* argv[])
{
int i, j, x[INPUTS];
InpNeuron InputLayer[INPNEUR];
system("PAUSE");
return 0;
}

它给出的异常是:多层感知器MNIST.exe中0x00302CB7处的未处理异常:0xC00000FD:堆栈溢出(参数:0x00000000,0x00522000)。

我几乎没有编程经验,但我认为这是一个内存问题,因为当我减少神经元或输入的数量时,它就起作用了。有什么方法可以让它与这么多的神经元和输入一起工作吗?

此行

 InpNeuron InputLayer[INPNEUR];

在堆栈上分配了大量内存,超过了默认情况下的可用内存。您应该使用std::vector

 std::vector<InpNeuron> InputLayer(INPNEUR);

以便从堆中安全地分配必要的内存。

您的"堆栈分配的数据结构"太大了。请阅读有关堆栈溢出的原因以及堆栈和堆之间的差异。

然后尝试:

int _tmain(int argc, _TCHAR* argv[])
{
   int i, j, x[INPUTS];
   InpNeuron * InputLayer = new InpNeuron[INPNEUR];
   system("PAUSE");
   delete[] InputLayer;
   return 0;
}

这将使您了解堆栈和堆分配之间的基本区别但是在你吸收了这一点并读了一点之后,你需要阅读std::vector以及避免原始指针内存管理的方法。。。因为这些是在C++中更安全的工作方式。

您的程序似乎太大,无法放入堆栈。几个建议:

1-转到linux,它在堆栈大小上给了你更多的自由。

2-使用浮球而不是双打,它们需要更少的资源,并且会给你足够的训练准确性。

3-既然你不太擅长编程,也许你可以使用一些已经创建的库,比如Caffe?你可以很容易地在Caffe上实现你自己的网络,也可以在那里使用他们预先实现的MNIST网络;他们实现了LeNet和许多其他著名网络。

4-阅读其他答案后:使用堆!使用指针代替,但是你需要注意你的内存管理!

祝好运