Wir sammeln Stichproben von Lern- / Verifizierungsdaten für maschinelles Lernen.
Bilddaten von "handschriftlichen Zahlen" von 0 bis 9. Wird für maschinelles Lernen verwendet, z. B. "Handschriftliche Zahlen mit KI identifizieren und klassifizieren". http://yann.lecun.com/exdb/mnist/ Sie können es kostenlos von herunterladen.
Wenn Sie die gz-Datei entpacken, wird sie zu einer Binärdatei wie der folgenden.
t10k-images.idx3-ubyte
Obwohl es sich um Bilddaten handelt, liegt sie nicht in einem Format wie .jpg vor Es kann nicht in der Vorschau angezeigt werden.
Wenn Sie beispielsweise Python-Code schreiben und ihn mit numpy oder PIL in png ausgeben, können Sie ihn als normale Bilddatei anzeigen.
Wenn wget und unzip noch nicht enthalten sind, installieren Sie sie. Für Ubuntu:
apt-get install -y wget
apt-get install unzip
Laden Sie zuerst gz mit wget herunter.
wget http://yann.lecun.com/exdb/mnist/train-labels-idx1-ubyte.gz
wget http://yann.lecun.com/exdb/mnist/train-images-idx3-ubyte.gz
Dann entpacken.
gunzip train-images-idx3-ubyte.gz
gunzip train-labels-idx1-ubyte.gz
Dann
-rw-r--r--. 1 root root 47040016 Jul 21 2000 train-images-idx3-ubyte
-rw-r--r--. 1 root root 60008 Jul 21 2000 train-labels-idx1-ubyte
Wird ausgegeben. Dann schreiben Sie den Python-Code.
vi test.py
import tensorflow as tf
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense, Conv2D, Flatten, Dropout, MaxPooling2D
from tensorflow.keras.preprocessing.image import ImageDataGenerator
from tensorflow.keras.datasets import mnist
import os
import numpy as np
import matplotlib.pyplot as plt
import struct
from PIL import Image
trainImagesFile = open('./train-images-idx3-ubyte','rb')
trainLabelsFile = open('./train-labels-idx1-ubyte','rb')
f = trainImagesFile
magic_number = f.read( 4 )
magic_number = struct.unpack('>i', magic_number)[0]
number_of_images = f.read( 4 )
number_of_images = struct.unpack('>i', number_of_images)[0]
number_of_rows = f.read( 4 )
number_of_rows = struct.unpack('>i', number_of_rows)[0]
number_of_columns = f.read( 4 )
number_of_columns = struct.unpack('>i', number_of_columns)[0]
bytes_per_image = number_of_rows * number_of_columns
raw_img = f.read(bytes_per_image)
format = '%dB' % bytes_per_image
lin_img = struct.unpack(format, raw_img)
np_ary = np.asarray(lin_img).astype('uint8')
np_ary = np.reshape(np_ary, (28,28),order='C')
pil_img = Image.fromarray(np_ary)
pil_img.save("output.png ")
python test.py
output.png
Bilddaten zum Lernen train-images-idx3-ubyte Die Struktur von ist wie folgt.
http://yann.lecun.com/exdb/mnist/
TRAINING SET IMAGE FILE (train-images-idx3-ubyte):
[offset] [type] [value] [description]
0000 32 bit integer 0x00000803(2051) magic number
0004 32 bit integer 60000 number of images
0008 32 bit integer 28 number of rows
0012 32 bit integer 28 number of columns
0016 unsigned byte ?? pixel
0017 unsigned byte ?? pixel
........
xxxx unsigned byte ?? pixel
Demnach wird der Offset nacheinander gelesen, während um 4 verschoben wird.
magic_number = f.read( 4 )
Das Ergebnis ist 2051.
number_of_images = f.read( 4 )
Das Ergebnis ist 60000.
number_of_rows = f.read( 4 )
Das Ergebnis ist 28.
number_of_columns = f.read( 4 )
Das Ergebnis ist 28.
Wenn Sie den Wert wirklich sehen wollen
print('--------------------')
print('magic_number');
print(magic_number);
print('--------------------')
print('number_of_images');
print(number_of_images);
print('--------------------')
print('number_of_rows');
print(number_of_rows);
print('--------------------')
print('number_of_columns');
print(number_of_columns);
Sie können dies überprüfen, indem Sie Folgendes ausgeben.
--------------------
magic_number
2051
--------------------
number_of_images
60000
--------------------
number_of_rows
28
--------------------
number_of_columns
28
Und
[offset] [type] [value] [description]
0016 unsigned byte ?? pixel
Da dies der Fall ist, wird das Bild nach dem Versatz 16 eingefügt
bytes_per_image = number_of_rows * number_of_columns
raw_img = f.read(bytes_per_image)
Kann gelesen werden als. Danach stürzte ich mich in Numpy und speicherte es im PNG-Format.
Wenn Sie den PNG-Ausgabeprozess wie unten gezeigt in einer Schleife drehen, können Sie kontinuierlich Bilder erstellen. Wenn Sie danach 10 Blätter ausgeben möchten, können Sie die Anzahl der Schleifen nach Belieben angeben, z. B. Bereich (10) :.
for num in range(10):
raw_img = f.read(bytes_per_image)
format = '%dB' % bytes_per_image
lin_img = struct.unpack(format, raw_img)
np_ary = np.asarray(lin_img).astype('uint8')
np_ary = np.reshape(np_ary, (28,28),order='C')
pil_img = Image.fromarray(np_ary)
pil_img.save("output" + str(num) + ".png ")
Das Ausgabeergebnis ist unten.
Wenn np_ary, ein numpy-Array, von print () angezeigt wird, lauten die Array-Daten wie folgt.
[ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0]
[ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0]
[ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0]
[ 0 0 0 0 0 0 0 0 0 0 0 0 3 18 18 18 126 136 175 26 166 255 247 127 0 0 0 0]
[ 0 0 0 0 0 0 0 0 30 36 94 154 170 253 253 253 253 253 225 172 253 242 195 64 0 0 0 0]
[ 0 0 0 0 0 0 0 49 238 253 253 253 253 253 253 253 253 251 93 82 82 56 39 0 0 0 0 0]
[ 0 0 0 0 0 0 0 18 219 253 253 253 253 253 198 182 247 241 0 0 0 0 0 0 0 0 0 0]
[ 0 0 0 0 0 0 0 0 80 156 107 253 253 205 11 0 43 154 0 0 0 0 0 0 0 0 0 0]
[ 0 0 0 0 0 0 0 0 0 14 1 154 253 90 0 0 0 0 0 0 0 0 0 0 0 0 0 0]
[ 0 0 0 0 0 0 0 0 0 0 0 139 253 190 2 0 0 0 0 0 0 0 0 0 0 0 0 0]
[ 0 0 0 0 0 0 0 0 0 0 0 11 190 253 70 0 0 0 0 0 0 0 0 0 0 0 0 0]
[ 0 0 0 0 0 0 0 0 0 0 0 0 35 241 225 160 108 1 0 0 0 0 0 0 0 0 0 0]
[ 0 0 0 0 0 0 0 0 0 0 0 0 0 81 240 253 253 119 25 0 0 0 0 0 0 0 0 0]
[ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 45 186 253 253 150 27 0 0 0 0 0 0 0 0]
[ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 16 93 252 253 187 0 0 0 0 0 0 0 0]
[ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 249 253 249 64 0 0 0 0 0 0 0]
[ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 46 130 183 253 253 207 2 0 0 0 0 0 0 0]
[ 0 0 0 0 0 0 0 0 0 0 0 0 39 148 229 253 253 253 250 182 0 0 0 0 0 0 0 0]
[ 0 0 0 0 0 0 0 0 0 0 24 114 221 253 253 253 253 201 78 0 0 0 0 0 0 0 0 0]
[ 0 0 0 0 0 0 0 0 23 66 213 253 253 253 253 198 81 2 0 0 0 0 0 0 0 0 0 0]
[ 0 0 0 0 0 0 18 171 219 253 253 253 253 195 80 9 0 0 0 0 0 0 0 0 0 0 0 0]
[ 0 0 0 0 55 172 226 253 253 253 253 244 133 11 0 0 0 0 0 0 0 0 0 0 0 0 0 0]
[ 0 0 0 0 136 253 253 253 212 135 132 16 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0]
[ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0]
[ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0]
[ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0]
Es ist ersichtlich, dass dies die Position jedes Pixels ist, aus dem die Bilddatei und ihre Farbinformationen bestehen.
Die obige Implementierung bestand darin, Bilddaten (Bilder) in PNG zu konvertieren. Darüber hinaus müssen auch die Etikettendaten (Etiketten) überprüft werden. Die Implementierung dafür ist wie folgt.
import tensorflow as tf
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense, Conv2D, Flatten, Dropout, MaxPooling2D
from tensorflow.keras.preprocessing.image import ImageDataGenerator
from tensorflow.keras.datasets import mnist
import os
import numpy as np
import matplotlib.pyplot as plt
import struct
from PIL import Image
trainImagesFile = open('./train-images-idx3-ubyte','rb')
trainLabelsFile = open('./train-labels-idx1-ubyte','rb')
f = trainLabelsFile
magic_number = f.read( 4 )
magic_number = struct.unpack('>i', magic_number)[0]
number_of_images = f.read( 4 )
number_of_images = struct.unpack('>i', number_of_images)[0]
print("--------------------")
print("magic_number")
print(magic_number)
print("--------------------")
print("number_of_image")
print(number_of_images)
print("--------------------")
label_byte = f.read( 1 )
label_int = int.from_bytes(label_byte, byteorder='big')
print(label_int)
--------------------
magic_number
2049
--------------------
number_of_image
60000
--------------------
5
Die Struktur der Etikettendaten ist wie folgt.
train-labels-idx1-ubyte
TRAINING SET LABEL FILE (train-labels-idx1-ubyte):
[offset] [type] [value] [description]
0000 32 bit integer 0x00000801(2049) magic number (MSB first)
0004 32 bit integer 60000 number of items
0008 unsigned byte ?? label
0009 unsigned byte ?? label
........
xxxx unsigned byte ?? label
The labels values are 0 to 9.
Mit anderen Worten, wenn Sie den Versatz 8 und höher nacheinander lesen, können Sie das Etikett lesen. Wenn Sie es in einer Schleife implementieren möchten, folgen Sie unten.
for num in range(10):
label_byte = f.read( 1 )
label_int = int.from_bytes(label_byte, byteorder='big')
print(label_int)
Das Ausgabeergebnis ist unten.
5
0
4
1
9
2
1
3
1
4
Vergleichen Sie mit dem Ausgabeergebnis von Images.
Jedes PNG-Bild zeigt korrekt "welche Nummer?" Mit einem Etikett an.
Recommended Posts