[英]What am I doing wrong reading in the MNIST data set?
我正在嘗試將手寫數字的 MNIST 數據集用於項目,並且我試圖將每張圖片讀取為 28 x 28 2D 整數數組,從 1 到 255,對應於每個像素的灰度顏色。 我從他們的網站 ( http://yann.lecun.com/exdb/mnist/ ) 下載了訓練文件 (train-images-idx3-ubyte.gz),但在實際處理此文件時遇到了麻煩。 它將文件格式描述為 16 字節的標題信息,后跟無符號字節,每個字節包含一個像素,按行組織。 有關更多詳細信息,請參閱網站。
在我的代碼中,我嘗試將文件讀入一個字節數組(當我運行它時,它與指定的文件大小相同: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;
}
對於將來遇到這個問題的任何人,評論是正確的,您必須先解壓縮 gz 文件,但是,我調查了這個,它看起來非常復雜。
雖然我正在研究這個問題,但我發現通過快速的谷歌搜索可以很容易地在線獲得數據的 csv,所以除非你喜歡自己提取文件,否則我建議使用它!
解壓縮數據后,您的代碼在我的網站上運行良好,但只有在這些更改之后
如果(x<0)x+=128; // 修正有符號整數
如果(x>255)x=255; //限制任何高值
整數顏色 = (255 - x);
g.setColor(new Color(color,color,color)); // 而不是 x,x,x
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.