堆栈溢出多层感知器
stack overflow multi layer 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;
}
它给出的异常是:多层感知器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-阅读其他答案后:使用堆!使用指针代替,但是你需要注意你的内存管理!
祝好运
相关文章:
- 'short int'持有的值溢出,但"自动"不会溢出?
- 使用动态分配的数组会导致代码分析发出虚假的C6386缓冲区溢出警告
- 大于65535的C++数组[size]引发不一致的溢出
- 为什么我在leetcode上收到AddressSanitizer:地址0x602000000058上的堆缓冲区溢出错误
- C++中无符号字符溢出
- 在 leetcode 上提交解决方案时出现堆栈缓冲区溢出错误
- 我的 int main() 中出现堆栈溢出错误
- 整数溢出,最大值为 pow(10,19)
- 获取隐式转换溢出从无符号到已签名的警告
- 使用 strcat 获取缓冲区溢出错误
- LeetCode 1:两和 - 地址清理器:堆缓冲区溢出地址
- 给定一个类型,如何派生一个泛型更广泛的类型(例如,用于溢出安全求和)?
- C++ 对象数组堆栈溢出
- 使用提升::lexical_cast捕获溢出
- C++ Unordered_set功能中的溢出
- 自定义排序函数中的堆溢出
- std::list 中的迭代器感知对象
- 使用向量的缓冲区溢出
- 堆栈溢出多层感知器
- c++中栈溢出和分段错误的危险