2017-07-27 89 views
0

我正在尝试使用手写数字的MNIST数据集作为项目,并且我试图读取每个图像中的28到28个二维数组,每个像素的灰度颜色对应于1-255。我从他们的网站(http://yann.lecun.com/exdb/mnist/)下载了培训文件(train-images-idx3-ubyte.gz),并且在实际处理该文件时遇到了麻烦。它将文件格式描述为16个字节的标题信息,后面是无符号位,每个位都有一个像素,按行组织。查看网站了解更多详情。我在做什么错误读取MNIST数据集?

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

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; 
} 
+0

您可能需要一个特殊的库才能正确读取GZIP文件q.v. [这里](https://stackoverflow.com/questions/35789253/how-to-read-from-gzipinputstream)作为开始。 –

+0

我认为你的意思是先解压缩文件,然后读取未压缩的文件。 –

回答

0

对于任何人碰到这个问题即将在未来的评论是正确的,你必须先解压缩GZ文件,但是,我看着这个和它看起来很复杂。

虽然我正在研究这个,但是我发现csv的数据很容易通过快速谷歌搜索在线获得,所以除非你喜欢自己解压缩文件,否则我会推荐使用它!