我正在嘗試使用手寫數字的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;
}
您可能需要一個特殊的庫才能正確讀取GZIP文件q.v. [這裏](https://stackoverflow.com/questions/35789253/how-to-read-from-gzipinputstream)作爲開始。 –
我認爲你的意思是先解壓縮文件,然後讀取未壓縮的文件。 –