我正在尝试使用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)。
我在编程方面经验很少,但我认为这是一个记忆问题,因为当我减少神经元或输入的数量时它会起作用。有什么方法可以让它与这么多神经元和输入一起工作吗?
答案 0 :(得分:2)
这一行
InpNeuron InputLayer[INPNEUR];
在堆栈上分配大量内存,比默认情况下更多。您应该使用std::vector
代替:
std::vector<InpNeuron> InputLayer(INPNEUR);
从堆中安全地分配必要的内存。
答案 1 :(得分:0)
您的“堆栈分配的数据结构”太大了。请阅读Stack Overflow causes和difference 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-阅读其他答案后:使用堆!改为使用指针,但需要注意内存管理!
祝你好运