Tout d'abord, après avoir expliqué les spécifications des données d'images numériques manuscrites MNIST, elles sont vectorisées et affichées / enregistrées sous forme d'image [code Java](https :: //github.com/kinmojr/MNIST_Java) est expliqué.
Il s'agit d'un ensemble de données d'images numériques manuscrites de 0 à 9 publiées sur le net. La taille de chaque image est de 28 pixels carrés et la couleur est une échelle de gris de 255 gradations. Il est souvent utilisé pour l'apprentissage et l'évaluation de l'apprentissage automatique.
Cette section décrit les spécifications des données numériques manuscrites MNIST.
Il y a 60 000 données d'image de 0 à 9 et des données d'étiquette correctes utilisées pour la formation (apprentissage).
train-images-idx3-ubyte.gz Les données d'image d'entraînement sont stockées dans un format binaire unique.
décalage | Type de données | valeur | La description |
---|---|---|---|
0 | Entier 32 bits | 2051 | nombre magique(MSB First) |
4 | Entier 32 bits | 60000 | Nombre d'images |
8 | Entier 32 bits | 28 | Nombre de pixels verticaux dans l'image |
12 | Entier 32 bits | 28 | Nombre de pixels à côté de l'image |
16 | Octets non signés | 0 à 255 | Valeur en niveaux de gris du pixel de la 1ère ligne et de la 1ère colonne de la 1ère image |
17 | Octets non signés | 0 à 255 | Valeur en niveaux de gris du pixel dans la 1ère ligne et la 2ème colonne de la 1ère image |
・ ・ ・ | Octets non signés | 0 à 255 | Valeur en niveaux de gris du pixel de la 28e ligne et de la 28e colonne de la 60 000e image |
train-labels-idx1-ubyte.gz L'étiquette correcte des données d'entraînement est stockée dans un format binaire unique.
décalage | Type de données | valeur | La description |
---|---|---|---|
0 | Entier 32 bits | 2049 | nombre magique(MSB First) |
4 | Entier 32 bits | 60000 | Nombre d'images |
8 | Octets non signés | 0-9 | Libellé correct pour la première image |
9 | Octets non signés | 0-9 | Libellé correct pour la deuxième image |
・ ・ ・ | Octets non signés | 0-9 | Libellé correct pour la 60 000e image |
Il y a 10 000 données d'image de 0 à 9 et des données d'étiquette correctes utilisées pour le test (évaluation).
t10k-images-idx3-ubyte.gz Les données d'image de test sont stockées dans un format binaire unique.
décalage | Type de données | valeur | La description |
---|---|---|---|
0 | Entier 32 bits | 2051 | nombre magique(MSB First) |
4 | Entier 32 bits | 10000 | Nombre d'images |
8 | Entier 32 bits | 28 | Nombre de pixels verticaux dans l'image |
12 | Entier 32 bits | 28 | Nombre de pixels à côté de l'image |
16 | Octets non signés | 0 à 255 | Valeur en niveaux de gris du pixel de la 1ère ligne et de la 1ère colonne de la 1ère image |
17 | Octets non signés | 0 à 255 | Valeur en niveaux de gris du pixel dans la 1ère ligne et la 2ème colonne de la 1ère image |
・ ・ ・ | Octets non signés | 0 à 255 | Valeur en niveaux de gris des pixels de la 28e ligne et de la 28e colonne de la 10 000e image |
t10k-labels-idx1-ubyte.gz L'étiquette correcte des données de test est stockée dans un format binaire unique.
décalage | Type de données | valeur | La description |
---|---|---|---|
0 | Entier 32 bits | 2049 | nombre magique(MSB First) |
4 | Entier 32 bits | 10000 | Nombre d'images |
8 | Octets non signés | 0-9 | Libellé correct pour la première image |
9 | Octets non signés | 0-9 | Libellé correct pour la deuxième image |
・ ・ ・ | Octets non signés | 0-9 | Libellé correct pour la 10 000e image |
Code source sur GitHub Voir README.md pour une utilisation facile.
Lisez les données à l'aide de DataInputStream. Utilisez readInt pour lire le nombre magique, le nombre d'images, le nombre de pixels verticaux de l'image et le nombre de pixels horizontaux de l'image. Le nombre de dimensions est 28 * 28 = 784. Lire les données d'image dans readUnsignedByte dans les entités de tableau 2D de type double. La première dimension est l'index d'image et la deuxième dimension est l'index de dimension. La valeur est divisée par 255,0 pour la normaliser pour une utilisation dans l'apprentissage automatique.
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;
}
}
}
Lisez les données à l'aide de DataInputStream. Lisez le nombre magique et le nombre d'images avec readInt. Lisez l'étiquette de réponse correcte avec readUnsignedByte dans les étiquettes de tableau de type 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();
}
}
Spécifiez l'index de l'image comme argument pour afficher le contour de l'image sous forme de texte sur la console.
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();
}
}
Restaurez les données d'image vectorisées pour créer une BufferedImage. La valeur est normalisée, multipliez-la par 255,0 pour la ramener à sa valeur d'origine en niveaux de gris.
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;
}
La BufferedImage chargée par makeImage est affichée dans la boîte de dialogue.
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);
}
Enregistrez la BufferedImage chargée par makeImage dans un fichier gif.
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