堆栈溢出多层感知器

时间:2015-03-22 12:24:02

标签: c++ neural-network stack-overflow perceptron

我正在尝试使用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;
}

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

我在编程方面经验很少,但我认为这是一个记忆问题,因为当我减少神经元或输入的数量时它会起作用。有什么方法可以让它与这么多神经元和输入一起工作吗?

3 个答案:

答案 0 :(得分:2)

这一行

 InpNeuron InputLayer[INPNEUR];

在堆栈上分配大量内存,比默认情况下更多。您应该使用std::vector代替:

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

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

答案 1 :(得分:0)

您的“堆栈分配的数据结构”太大了。请阅读Stack Overflow causesdifference between the stack and the heap

然后尝试:

int _tmain(int argc, _TCHAR* argv[])
{
   int i, j, x[INPUTS];

   InpNeuron * InputLayer = new InpNeuron[INPNEUR];

   system("PAUSE");

   delete[] InputLayer;
   return 0;
}

这将使您了解堆栈和堆分配完成之间差异的基本“a-ha”。 但是在你吸收了点并阅读了一下之后,你需要阅读有关std :: vector以及避免原始指针内存管理的方法...因为这些是更安全的C ++工作方式

答案 2 :(得分:0)

你的程序似乎太大而无法放入堆栈。 一些建议:

1-移动到linux,它为你提供了更大的堆栈大小自由。

2-使用浮动而不是双打,它们需要的资源更少,并且可以为你提供足够的训练准确度。

3-由于您不熟悉编程,也许您可​​以使用一些已创建的库,如Caffe?您可以非常轻松地在Caffe上实现自己的网络,或者在那里使用一些预先实现的网络用于MNIST;他们实施了LeNet和许多其他着名的网络。

4-阅读其他答案后:使用堆!改为使用指针,但需要注意内存管理!

祝你好运