【发布时间】:2018-12-13 17:28:42
【问题描述】:
我正在尝试使用 C++ 学习神经网络,并找到了有关数字识别的教程,但是当我运行代码时,我收到一条错误消息,提示“调试断言失败,向量下标超出范围”。显然问题出在loadTraining 函数中,但不知道如何修改它以消除错误。
void loadTraining(const char *filename, vector<vector<double>> &input, vector<vector<double>> &output)
{
int trainingSize = 946;
input.resize(trainingSize);
output.resize(trainingSize);
ifstream file(filename);
if(file)
{
string line;
int n;
for (int i=0 ; i<trainingSize ; i++) // load 946 examples
{
for (int h=0 ; h<32 ; h++) // 'images' are 32*32 pixels
{
getline(file, line);
for (int w=0 ; w<32 ; w++)
{
input[i].push_back(atoi(line.substr(w,1).c_str()));
}
}
getline(file, line);
output[i].resize(10); // output is a vector of size 10
n = atoi(line.substr(0,1).c_str());
output[i][n] = 1; // set index that represent the number to 1, other are automatically 0 because of the resize()
}
}
file.close();
}
该文件由 32*32 的二进制数字数组组成。 This is one training exmple.
我正在使用 Visual Studio 2013。
【问题讨论】:
-
getline和atoi可能会失败,您确定它们不会失败吗? -
您可以在发生这种情况的特定时间中断,并使用调试器找出根本原因。事实上,这不适合 Stack Overflow。由于
i看起来不错,我怀疑n有问题(即大于或等于十,或负数)。 -
substr(...).c_str()返回一个指向死临时子字符串的悬空指针。 -
"该文件由 32*32 个二进制数字数组组成" 那么为什么在读取它们时使用字符串转整数函数?您的意思是“文件由 32 行组成,每行 32 位”?
-
你能告诉我们其中一个文件的内容吗?
标签: c++ neural-network pattern-recognition