Vektorisieren und bildgeben Sie handgeschriebene numerische MNIST-Bilddaten mit Java

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.

Was ist ein handgeschriebener numerischer MNIST-Bilddatensatz?

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.

Datenspezifikationen

In diesem Abschnitt werden die Spezifikationen der handgeschriebenen numerischen MNIST-Daten beschrieben.

Trainingsdatensatz

Es gibt 60.000 Bilddaten von 0 bis 9 und korrekte Etikettendaten, die für das Training (Lernen) verwendet werden.

Bilddaten für das Training

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

Korrigieren Sie die Antwortetikettendaten für das Training

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

Datensatz testen

Es gibt 10.000 Bilddaten von 0 bis 9 und korrekte Etikettendaten, die für den Test verwendet wurden (Auswertung).

Bilddaten testen

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

Richtiges Antwortetikett für den Test

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

Vektorisierung und Bildgebung durch Java

Quellcode auf GitHub Eine einfache Verwendung finden Sie unter README.md.

Bilddaten lesen

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;
            }
        }
    }

Etikettendaten lesen

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();
        }
    }

Bildschirm

Anzeige im Text

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();
        }
    }

Erstellen Sie BufferedImage

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;
    }

Im Dialog anzeigen

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);
    }

In Bilddatei speichern

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

Vektorisieren und bildgeben Sie handgeschriebene numerische MNIST-Bilddaten mit Java
Java-Programmierung (Variablen und Daten)
Importieren Sie Excel-Daten mit Java 2
Importieren Sie Excel-Daten mit Java
Importieren Sie Excel-Daten mit Java 3
Java Excel Insertion und Bildextraktion
Firestore-Daten in RecyclerView [Java] anzeigen
Beispiel für Codierung und Decodierung in Java
Grundlegende Datentypen und Referenztypen (Java)
StringBuffer- und StringBuilder-Klasse in Java
Verstehe gleich und hashCode in Java
Java-Basisdatentypen und Referenztypen
Hallo Welt in Java und Gradle
Erstellen Sie Binärdaten variabler Länge in Java
Unterschied zwischen final und Immutable in Java
Java Excel-Einstellungen Hintergrundfarbe und Hintergrundbild
Unterschied zwischen Arrylist und verknüpfter Liste in Java
Programmieren Sie PDF-Kopf- und Fußzeilen in Java
Lernen Sie Flyweight-Muster und ConcurrentHashMap in Java
Die Richtung von Java in "C ++ Design and Evolution"
Von Java nach C und von C nach Java in Android Studio
Lesen und Schreiben von GZIP-Dateien in Java
Unterschied zwischen int und Integer in Java
Diskriminierung von Enum in Java 7 und höher
Ich habe die Daten der Reise (Tagebuchanwendung) in Java erhalten und versucht, sie # 001 zu visualisieren
In Bezug auf transiente Modifikatoren und Serialisierung in Java
Erkennen Sie ähnliche Videos in Java und OpenCV Version 2
Informationen zu Java-Datentypen (insbesondere primitiven Typen) und Literalen
Parallele und parallele Verarbeitung in verschiedenen Sprachen (Java Edition)
Unterschied zwischen next () und nextLine () in Java Scanner
Unterschiede beim Schreiben von Java-, C # - und Javascript-Klassen
[Verarbeitung × Java] Datentyp und objektorientierte Programmierung
Erfassen und speichern Sie die Selen-Installation in Java
Erkennen Sie ähnliche Videos in Java und OpenCV Version 3
Hinzufügen, Lesen und Löschen von Excel-Kommentaren mit Java
Überprüfen Sie das statische und öffentliche Verhalten in Java-Methoden
[Java] Verstehe in 10 Minuten! Assoziatives Array und HashMap
Organisiertes Memo im Kopf (Java - Datentyp)
Unterscheiden Sie in Java zwischen positiven und negativen Zahlen
Java fügt Wasserzeichen in Word-Dokumenten hinzu und entfernt sie
Erkennen Sie ähnliche Videos in Java und OpenCV Version 1
Repräsentiert "nächster Tag" und "vorheriger Tag" in Java / Android
Fragen in Java-Ausnahmebehandlung werfen und versuchen-fangen
Laden Sie Notizen in Java auf S3 hoch und laden Sie sie herunter
Verschlüsseln / Entschlüsseln mit AES256 in PHP und Java
Generieren Sie OffsetDateTime aus Clock und LocalDateTime in Java
[Android-Entwicklung] Holen Sie sich mit Java Bilder vom Server und legen Sie sie in ImageView fest! !!