簡體   English   中英

我在 MNIST 數據集中讀錯了什么?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM