Java 我在MNIST数据集中的读取错误是什么?
我试图在一个项目中使用手写数字的MNIST数据集,我试图读取1-255的28×28整数2D数组中的每个图片,对应于每个像素的灰度颜色。我从他们的网站()下载了培训文件(train-images-idx3-ubyte.gz),实际处理这个文件时遇到了问题。它将文件格式描述为16个字节的头信息,后跟无符号位,每个位包含一个像素,按行组织。有关更多详细信息,请访问网站 在我的代码中,我尝试将文件读入一个字节数组(当我运行它时,它与指定的文件大小相同:9912422字节)。然后我从第17个字节开始,以跳过标题,并补偿java试图使该字节成为一个有符号整数,将所有负数的绝对值加128(它们的第一位是1)。为了看看这是否有效,我试着使用一个绘图面板类来打印它,我知道这个类是有效的,我只看到静态的,像素上根本没有图案。我处理这个文件有什么不对? 谢谢Java 我在MNIST数据集中的读取错误是什么?,java,file-io,mnist,Java,File Io,Mnist,我试图在一个项目中使用手写数字的MNIST数据集,我试图读取1-255的28×28整数2D数组中的每个图片,对应于每个像素的灰度颜色。我从他们的网站()下载了培训文件(train-images-idx3-ubyte.gz),实际处理这个文件时遇到了问题。它将文件格式描述为16个字节的头信息,后跟无符号位,每个位包含一个像素,按行组织。有关更多详细信息,请访问网站 在我的代码中,我尝试将文件读入一个字节数组(当我运行它时,它与指定的文件大小相同:9912422字节)。然后我从第17个字节开始,以跳
File File=new文件(“train-images-idx3-ubyte.gz”);
long size=file.length();
系统输出打印项次(尺寸);
字节[]内容=新字节[(int)大小];
FileInputStream in=新的FileInputStream(文件);
阅读(内容);
in.close();
DrawingPanel=新的DrawingPanel(400400);
Graphics g=panel.getGraphics();
int-xloc=0;
int-yloc=0;
对于(intjj=0;jj<28;jj++)
{
对于(int ii=0;ii<28;ii++)
{
int x=(int)内容[17+jj*28+ii];
if(x<0)
{
x=(x*(0-1))+128;
}
系统输出打印(x+“”);
int color=(255-x);
g、 setColor(新颜色(x,x,x));
g、 fillRect(xloc,yloc,10,10);
xloc+=10;
}
System.out.println();
yloc+=10;
xloc=0;
}
对于将来遇到这个问题的人来说,评论是对的,你必须先解压缩gz文件,然而,我研究了这个问题,它看起来非常复杂
虽然我正在研究这个问题,但我发现,通过快速的谷歌搜索,csv数据在网上很容易获得,所以除非你们喜欢自己提取文件,否则我建议你们使用这个 一旦解压了数据,您的代码就可以在我的网站上很好地运行,但只有在这些更改之后
- 如果(x255)x=255//将任何高值设为上限
- int color=(255-x)
- g、 设置颜色(新颜色(颜色、颜色、颜色));//而不是x,x,x
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;
}