我在 MNIST 数据集中读错了什么?
What am I doing wrong reading in the MNIST data set?
我正在尝试将手写数字的 MNIST 数据集用于一个项目,并且我正在尝试将每张图片读取为 28 x 28 二维整数数组,范围为 1-255,对应于每张图片的灰度颜色像素。我从他们的网站 (http://yann.lecun.com/exdb/mnist/) 下载了培训文件 (train-images-idx3-ubyte.gz),但在实际处理该文件时遇到了问题。它将文件格式描述为 16 个字节的 header 信息,后跟无符号字节,每个字节包含一个像素,组织 row-wise。详情请见网站。
在我的代码中,我尝试将文件读入一个字节数组(当我 运行 它时,它与指定的文件大小相同:9,912,422 字节)。然后,我从第 17 个字节开始,以跳过 header,并补偿 java 试图使该字节成为一个有符号整数,将 128 添加到所有负负数的绝对值(他们的第一位是一个)。为了查看这是否有效,我尝试使用我知道有效的绘图面板 class 打印它,但我只看到静态的,像素根本没有图案。我在处理文件时做错了什么?
谢谢!
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 文件,但是,我调查了一下,它看起来真的很复杂。
虽然我正在研究这个问题,但我发现可以通过快速 google 搜索在线轻松获得数据的 csv,因此除非您喜欢自己提取文件,否则我建议您使用它!
解压缩数据后,您的代码在我的网站上运行良好,但只有在这些更改之后
if(x<0) x+=128; // 修复有符号整数
if(x>255) x=255; //限制任何高值
int 颜色 = (255 - x);
g.setColor(新颜色(颜色,颜色,颜色)); // 而不是 x,x,x
我正在尝试将手写数字的 MNIST 数据集用于一个项目,并且我正在尝试将每张图片读取为 28 x 28 二维整数数组,范围为 1-255,对应于每张图片的灰度颜色像素。我从他们的网站 (http://yann.lecun.com/exdb/mnist/) 下载了培训文件 (train-images-idx3-ubyte.gz),但在实际处理该文件时遇到了问题。它将文件格式描述为 16 个字节的 header 信息,后跟无符号字节,每个字节包含一个像素,组织 row-wise。详情请见网站。
在我的代码中,我尝试将文件读入一个字节数组(当我 运行 它时,它与指定的文件大小相同:9,912,422 字节)。然后,我从第 17 个字节开始,以跳过 header,并补偿 java 试图使该字节成为一个有符号整数,将 128 添加到所有负负数的绝对值(他们的第一位是一个)。为了查看这是否有效,我尝试使用我知道有效的绘图面板 class 打印它,但我只看到静态的,像素根本没有图案。我在处理文件时做错了什么? 谢谢!
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 文件,但是,我调查了一下,它看起来真的很复杂。
虽然我正在研究这个问题,但我发现可以通过快速 google 搜索在线轻松获得数据的 csv,因此除非您喜欢自己提取文件,否则我建议您使用它!
解压缩数据后,您的代码在我的网站上运行良好,但只有在这些更改之后
if(x<0) x+=128; // 修复有符号整数
if(x>255) x=255; //限制任何高值
int 颜色 = (255 - x);
g.setColor(新颜色(颜色,颜色,颜色)); // 而不是 x,x,x