package org.ea.javacnn.readers;
import java.io.FileInputStream;
import java.nio.ByteBuffer;
import java.nio.ByteOrder;
import java.nio.IntBuffer;
import java.util.Arrays;
import java.util.zip.GZIPInputStream;
public class MnistReader implements Reader {
private String labelFile;
private String imageFile;
private FileInputStream labelIO;
private FileInputStream imageIO;
private int labelSize;
private int imageSize;
private int imageX;
private int imageY;
private int readInt(FileInputStream is) throws Exception {
byte[] int32Full = new byte[4];
is.read(int32Full);
ByteBuffer wrapped = ByteBuffer.wrap(int32Full);
return wrapped.getInt();
}
@Override
public int size() {
return imageSize;
}
public MnistReader(String labelFile, String imageFile) {
try {
this.labelFile = labelFile;
this.imageFile = imageFile;
labelIO = new FileInputStream(labelFile);
imageIO = new FileInputStream(imageFile);
if(readInt(labelIO) != 2049) throw new Exception("Label file header missing");
if(readInt(imageIO) != 2051) throw new Exception("Image file header missing");
labelSize = readInt(labelIO);
imageSize = readInt(imageIO);
if(labelSize != imageSize) throw new Exception("Labels and images don't match in number.");
imageY = readInt(imageIO);
imageX = readInt(imageIO);
System.out.println("LSZ " +labelSize + " ISZ " + imageSize + " Y " + imageY + " X " + imageX);
} catch (Exception e) {
e.printStackTrace();
}
}
@Override
public int getMaxvalue() {
return 255;
}
public int numOfClasses() {
return 10;
}
@Override
public void reset() {
try {
labelIO.close();
imageIO.close();
labelIO = new FileInputStream(labelFile);
imageIO = new FileInputStream(imageFile);
readInt(labelIO);
readInt(labelIO);
readInt(imageIO);
readInt(imageIO);
readInt(imageIO);
readInt(imageIO);
} catch (Exception e) {
e.printStackTrace();
}
}
@Override
public int readNextLabel() {
try {
return labelIO.read();
} catch (Exception e) {
e.printStackTrace();
}
return -1;
}
@Override
public int[] readNextImage() throws Exception {
int size = imageX * imageY;
byte[] imageArray = new byte[size];
Arrays.fill(imageArray, (byte)0);
imageIO.read(imageArray, 0, size);
int[] imageInts = new int[size];
for(int i=0; i
Ads help maintain this website.