2017-07-27 88 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的數據很容易通過快速谷歌搜索在線獲得,所以除非你喜歡自己解壓縮文件,否則我會推薦使用它!