Nachdem die Spezifikationen von handgeschriebenen numerischen MNIST-Bilddaten erläutert wurden, wird es zunächst vektorisiert und als Bild [Java-Code] angezeigt / gespeichert (https :: //github.com/kinmojr/MNIST_Java) wird erklärt.
Es ist ein handgeschriebener numerischer Bilddatensatz von 0 bis 9, der im Internet veröffentlicht wird. Die Größe jedes Bildes beträgt 28 Pixel im Quadrat, und die Farbe ist eine Graustufe von 255 Abstufungen. Es wird häufig zum Lernen und Bewerten von maschinellem Lernen verwendet.
In diesem Abschnitt werden die Spezifikationen der handgeschriebenen numerischen MNIST-Daten beschrieben.
Es gibt 60.000 Bilddaten von 0 bis 9 und korrekte Etikettendaten, die für das Training (Lernen) verwendet werden.
train-images-idx3-ubyte.gz Trainingsbilddaten werden in einem eindeutigen Binärformat gespeichert.
Versatz | Datentyp | Wert | Erläuterung |
---|---|---|---|
0 | 32-Bit-Ganzzahl | 2051 | magische Zahl(MSB First) |
4 | 32-Bit-Ganzzahl | 60000 | Anzahl der Bilder |
8 | 32-Bit-Ganzzahl | 28 | Anzahl der vertikalen Pixel im Bild |
12 | 32-Bit-Ganzzahl | 28 | Anzahl der Pixel neben dem Bild |
16 | Vorzeichenlose Bytes | 0 bis 255 | Graustufenwert des Pixels in der 1. Zeile und 1. Spalte des 1. Bildes |
17 | Vorzeichenlose Bytes | 0 bis 255 | Graustufenwert der Pixel der ersten Zeile und der zweiten Spalte des ersten Bildes |
・ ・ ・ | Vorzeichenlose Bytes | 0 bis 255 | Graustufenwert des Pixels in der 28. Zeile und 28. Spalte des 60.000sten Bildes |
train-labels-idx1-ubyte.gz Die korrekte Bezeichnung der Trainingsdaten wird in einem eindeutigen Binärformat gespeichert.
Versatz | Datentyp | Wert | Erläuterung |
---|---|---|---|
0 | 32-Bit-Ganzzahl | 2049 | magische Zahl(MSB First) |
4 | 32-Bit-Ganzzahl | 60000 | Anzahl der Bilder |
8 | Vorzeichenlose Bytes | 0-9 | Richtige Beschriftung für das erste Bild |
9 | Vorzeichenlose Bytes | 0-9 | Richtige Beschriftung für das zweite Bild |
・ ・ ・ | Vorzeichenlose Bytes | 0-9 | Richtige Beschriftung für das 60.000ste Bild |
Es gibt 10.000 Bilddaten von 0 bis 9 und korrekte Etikettendaten, die für den Test verwendet wurden (Auswertung).
t10k-images-idx3-ubyte.gz Die Testbilddaten werden in einem eindeutigen Binärformat gespeichert.
Versatz | Datentyp | Wert | Erläuterung |
---|---|---|---|
0 | 32-Bit-Ganzzahl | 2051 | magische Zahl(MSB First) |
4 | 32-Bit-Ganzzahl | 10000 | Anzahl der Bilder |
8 | 32-Bit-Ganzzahl | 28 | Anzahl der vertikalen Pixel im Bild |
12 | 32-Bit-Ganzzahl | 28 | Anzahl der Pixel neben dem Bild |
16 | Vorzeichenlose Bytes | 0 bis 255 | Graustufenwert des Pixels in der 1. Zeile und 1. Spalte des 1. Bildes |
17 | Vorzeichenlose Bytes | 0 bis 255 | Graustufenwert der Pixel der ersten Zeile und der zweiten Spalte des ersten Bildes |
・ ・ ・ | Vorzeichenlose Bytes | 0 bis 255 | Graustufenwert der Pixel in der 28. Zeile und 28. Spalte des 10.000sten Bildes |
t10k-labels-idx1-ubyte.gz Die korrekte Bezeichnung der Testdaten wird in einem eindeutigen Binärformat gespeichert.
Versatz | Datentyp | Wert | Erläuterung |
---|---|---|---|
0 | 32-Bit-Ganzzahl | 2049 | magische Zahl(MSB First) |
4 | 32-Bit-Ganzzahl | 10000 | Anzahl der Bilder |
8 | Vorzeichenlose Bytes | 0-9 | Richtige Beschriftung für das erste Bild |
9 | Vorzeichenlose Bytes | 0-9 | Richtige Beschriftung für das zweite Bild |
・ ・ ・ | Vorzeichenlose Bytes | 0-9 | Korrigieren Sie die Beschriftung für das 10.000ste Bild |
Quellcode auf GitHub Eine einfache Verwendung finden Sie unter README.md.
Lesen Sie Daten mit DataInputStream. Verwenden Sie readInt, um die magische Zahl, die Anzahl der Bilder, die Anzahl der vertikalen Pixel des Bildes und die Anzahl der horizontalen Pixel des Bildes zu lesen. Die Anzahl der Dimensionen beträgt 28 * 28 = 784. Lesen Sie Bilddaten in doppelten 2D-Array-Funktionen in readUnsignedByte. Die erste Dimension ist der Bildindex und die zweite Dimension ist der Dimensionsindex. Der Wert wird durch 255,0 geteilt, um ihn für die Verwendung beim maschinellen Lernen zu normalisieren.
ImageDataSet.java
private void loadFeatures() throws IOException {
System.out.println("Loading feature data from " + fileName + " ...");
DataInputStream is = new DataInputStream(new GZIPInputStream(new FileInputStream(Const.BASE_PATH + fileName)));
is.readInt();
numImages = is.readInt();
numDimensions = is.readInt() * is.readInt();
features = new double[numImages][numDimensions];
for (int i = 0; i < numImages; i++) {
for (int j = 0; j < numDimensions; j++) {
features[i][j] = (double) is.readUnsignedByte() / 255.0;
}
}
}
Lesen Sie Daten mit DataInputStream. Lesen Sie die magische Zahl und die Anzahl der Bilder mit readInt. Lesen Sie die richtige Antwortbezeichnung mit readUnsignedByte in den Arraybezeichnungen vom Typ int.
LabelDataSet.java
private void loadLabels() throws IOException {
System.out.println("Loading label data from " + fileName + " ...");
DataInputStream is = new DataInputStream(new GZIPInputStream(new FileInputStream(Const.BASE_PATH + fileName)));
is.readInt();
numLabels = is.readInt();
labels = new int[numLabels];
for (int i = 0; i < numLabels; i++) {
labels[i] = is.readUnsignedByte();
}
}
Geben Sie den Index des Bildes als Argument an, um den Umriss des Bildes im Text auf der Konsole anzuzeigen.
ImageViewer.java
public void showImageAsText(int index) {
System.out.println("Label: " + labels[index]);
for (int i = 0; i < 28; i++) {
for (int j = 0; j < 28; j++) {
double value = images[index][i * 28 + j];
if (value > 0.0) {
System.out.print("**");
} else {
System.out.print(" ");
}
}
System.out.println();
}
}
Stellen Sie die vektorisierten Bilddaten wieder her, um ein BufferedImage zu erstellen. Der Wert ist normalisiert. Multiplizieren Sie ihn daher mit 255,0, um den ursprünglichen Graustufenwert wiederherzustellen.
ImageViewer.java
private BufferedImage makeImage(int index) {
BufferedImage image =
new BufferedImage(28, 28, BufferedImage.TYPE_INT_RGB);
for (int i = 0; i < 28; i++) {
for (int j = 0; j < 28; j++) {
int value = (int) (images[index][i * 28 + j] * 255.0);
image.setRGB(j, i, 0xff000000 | value << 16 | value << 8 | value);
}
}
return image;
}
Das von makeImage geladene BufferedImage wird im Dialogfeld angezeigt.
ImageViewer.java
public void showImage(int index) {
BufferedImage image = makeImage(index);
Icon icon = new ImageIcon(image);
JOptionPane.showMessageDialog(null, labels[index], "MnistImageViewer", JOptionPane.PLAIN_MESSAGE, icon);
}
Speichern Sie das von makeImage geladene BufferedImage in einer GIF-Datei.
ImageViewer.java
public void saveImage(String dir, String prefix, int index) throws IOException {
BufferedImage image = makeImage(index);
File file = new File(dir + "/" + prefix + "_" + String.format("%05d", index) + "_" + labels[index] + ".gif");
if (file.exists()) file.delete();
ImageIO.write(image, "gif", file);
}
Recommended Posts