2012-10-21 160 views
2

我读了以下问题:如何使用C++读取MNIST数据集?

How to read MNIST data in C++?

并有用于读取数据库MNIST一些C++代码。在尝试之后,我发现它一直运行良好,直到它开始读取数据的地方。

这是下面的代码:

for(int i=0;i<number_of_images;++i) 
     { 
     for(int r=0;r<n_rows;++r) 
     { 
      for(int c=0;c<n_cols;++c) 
      { 
       unsigned char temp=0; 
       file.read((char*)&temp,sizeof(temp)); 
       //cout<<(int)temp<<" "; //printing the pixel in integer format 

      } 
     } 
    } 

我试图打印出变量“温度”的整数值,但是我没有得到的像素正确的号码(全部为零)。 我不知道有什么问题,每个像素需要一个字节的空间,然后我把它转换为一个int,它不起作用。为什么会发生?预先感谢您

+0

只是一个更新,代码是完全正常的。我不确定为什么昨天晚上我检查时它不工作,但是今天我醒来后,我试着再次运行它,输出结果是正确的。也许昨天在我的电脑上出现了某种冲突,并且简单的重新启动就解决了这个问题?我不确定,但是在研究了这些文件的格式之后,我无法简单理解为什么这些代码不起作用,这对我来说没有任何意义,这正是我重新运行它的原因。谢天谢地,现在一切都好! – ksm001

回答

2

当使用MNIST数据集时,我遇到了和您一样的问题。我可以阅读标签,但训练和测试集的图像大多是假的;训练集几乎全部用175填充,并且测试集几乎全部用0填充(除了前6个图像)。重新启动没有解决问题,我无法确定为什么文件读取不能正常工作。

对于有这个问题的人,我会建议使用位于http://cis.jhu.edu/~sachin/digit/digit.html的数据文件。数据已经按照编号进行组织(不需要标签/图像关联),并且像素值的数组依次被简单地编码。知道每个数组是28x28并且每个数字有1000个图像,您可以轻松编写代码来输入像素值的单个图像数组。

+1

如果有人正在寻找简单的.csv文件,我在我的网站上发布了火车和测试集,你可以在这里找到他们(http://pjreddie.com/projects/mnist-in-csv/)。希望他们有用! – pjreddie

5

我有同样的问题,前几个字节的数据很好,然后其余的是填充0。事实证明,文件流在第一次遇到字节0x01A时失败。对此问题进行修复正在发生变化:

ifstream file ("data"); 

ifstream file ("data", std::ios::binary);