我在 MNIST 数据集中读错了什么?

What am I doing wrong reading in the MNIST data set?

我正在尝试将手写数字的 MNIST 数据集用于一个项目,并且我正在尝试将每张图片读取为 28 x 28 二维整数数组,范围为 1-255,对应于每张图片的灰度颜色像素。我从他们的网站 (http://yann.lecun.com/exdb/mnist/) 下载了培训文件 (train-images-idx3-ubyte.gz),但在实际处理该文件时遇到了问题。它将文件格式描述为 16 个字节的 header 信息,后跟无符号字节,每个字节包含一个像素,组织 row-wise。详情请见网站。

在我的代码中,我尝试将文件读入一个字节数组(当我 运行 它时,它与指定的文件大小相同:9,912,422 字节)。然后,我从第 17 个字节开始,以跳过 header,并补偿 java 试图使该字节成为一个有符号整数,将 128 添加到所有负负数的绝对值(他们的第一位是一个)。为了查看这是否有效,我尝试使用我知道有效的绘图面板 class 打印它,但我只看到静态的,像素根本没有图案。我在处理文件时做错了什么? 谢谢!

 File file=new File("train-images-idx3-ubyte.gz");
 long size = file.length(); 
 System.out.println(size);        
 byte[] contents=new byte[(int)size];
 FileInputStream in = new FileInputStream(file);
 in.read(contents);
 in.close();
 DrawingPanel panel = new DrawingPanel(400, 400);
 Graphics g = panel.getGraphics(); 
 int xloc = 0;
 int yloc = 0;                         
 for(int jj = 0; jj < 28; jj++)
 {
    for(int ii = 0; ii < 28; ii++)
    {
       int x = (int) contents[17+jj*28+ii];
       if(x < 0)
       {
          x = (x * (0-1)) + 128;
       }
       System.out.print(x + " ");
       int color = (255 - x);
       g.setColor(new Color(x,x,x));
       g.fillRect(xloc,yloc,10,10);
           xloc += 10;
    }
    System.out.println();
    yloc+= 10;
    xloc = 0;
 }

对于以后遇到这个问题的人,评论是对的,你必须先解压 gz 文件,但是,我调查了一下,它看起来真的很复杂。

虽然我正在研究这个问题,但我发现可以通过快速 google 搜索在线轻松获得数据的 csv,因此除非您喜欢自己提取文件,否则我建议您使用它!

解压缩数据后,您的代码在我的网站上运行良好,但只有在这些更改之后

  • if(x<0) x+=128; // 修复有符号整数

  • if(x>255) x=255; //限制任何高值

  • int 颜色 = (255 - x);

  • g.setColor(新颜色(颜色,颜色,颜色)); // 而不是 x,x,x