2017-07-27 9 views
0

私はプロジェクトに手書き数字のMNISTデータセットを使用しようとしていますが、各ピクセルのグレースケールカラーに対応する1から255の28の2次元配列から28の各ピクチャを読み込もうとしています。ウェブサイト(http://yann.lecun.com/exdb/mnist/)のトレーニングファイル(train-images-idx3-ubyte.gz)をダウンロードしましたが、このファイルを実際に処理する際に問題があります。これは、16バイトのヘッダー情報としてファイル形式を記述し、その後に符号なしビットが続き、各ビットは1ピクセルを保持し、行単位で構成されます。詳細はウェブサイトを参照してください。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ファイルを正しく読み取るには、特別なライブラリが必要な場合があります。 [here](https://stackoverflow.com/questions/35789253/how-to-read-from-gzipinputstream)を開始します。 –

+0

私はあなたが最初にファイルを解凍し、次に解凍したファイルを読み込むことを意図していると思います。 –

答えて

0

は、将来的にこの問題に出くわす誰のために、コメントは正しかった、あなたが最初のGZファイルを解凍しなければならないのは、しかし、私はこれに見て、それは本当に複雑に見えました。

私はそれを検討していましたが、データのcsvが簡単にGoogle検索でオンラインで利用できることを発見しました。

関連する問題