Dies ist ein Studienmemo (3.) zur Bildklassifizierung (Google Colaboratory-Umgebung) mit TensorFlow2 + Keras. Das Thema ist die Klassifizierung von handgeschriebenen numerischen Bildern (MNIST), die ein Standardelement ist.
Letztes Mal hat MNIST-Daten erfasst und die Struktur und den Inhalt der Daten bestätigt. Die Eingabedaten, die den Bilddaten handgeschriebener Zahlen entsprachen, waren ** 28 × 28 Pixel 256-Stufen-Graustufen **. Der Typ dieser Daten ist ein zweidimensionales Array von "numpy.ndarray", und ich habe es geschafft, den Inhalt (Bild) zu erhalten, indem ich "print" so wie es ist gemacht habe, diesmal jedoch mit matplotlib wie folgt Ich möchte es ordentlich anzeigen.
Die MNIST-Daten verwendeten ganzzahlige Werte von 0 bis 255, um eine Graustufe mit 256 Schritten darzustellen (eine Graustufe mit Weiß zu 0 und Schwarz zu 255) (Einzelheiten siehe letztes Mal) (https: /). /qiita.com/code0327/items/2c969ca4675d5a3691ef#_reference-e5aaa86657d6319bbb0d)). Im Beispielcode für die Bildklassifizierung mit TensorFlow (siehe [Tutorial] auf der offiziellen Website (https://www.tensorflow.org/tutorials/quickstart/beginner)) für die Bequemlichkeit des maschinellen Lernens 0,0 ** Normalisierung ** wird so angewendet, dass sie im Bereich von ~ 1,0 liegt.
import tensorflow as tf
mnist = tf.keras.datasets.mnist
(x_train, y_train), (x_test, y_test) = mnist.load_data()
x_train, x_test = x_train / 255.0, x_test / 255.0 #Normalisierungsprozess
Von hier an möchte ich mit Daten fortfahren, die auf 0,0 bis 1,0 normalisiert sind.
Ich möchte das erste "x_train [0]" der Eingabedaten für das Training als Graustufenbild ausgeben. Diese Daten sind ein Bild, das "5" darstellt, wie es in den korrekten Antwortdaten "y_train [0]" gespeichert ist.
python
import matplotlib.pyplot as plt
plt.figure(dpi=96)
plt.imshow(x_train[0],interpolation='nearest',vmin=0.,vmax=1.,cmap='Greys')
Abhängig von der Ausführungsumgebung kann "interpolation =" next "" weggelassen werden (es ist in Ordnung, es in Google Colab wegzulassen. Wenn Sie es in einer anderen Umgebung ausführen und die Ausgabe verschwommen wird, geben Sie diese Option an).
Außerdem kann "vmin = 0, Vmax = 1" weggelassen werden, wenn der Minimalwert des internen Elements der relevanten Daten "x_train [?]" 0,0 ist und der Maximalwert 1,0 ("cmap =") beträgt. Greys weist Weiß 0,0 und Schwarz 1,0 zu. Andernfalls, wenn Sie beispielsweise ** helle Zeichen ** ausdrücken und der Maximalwert des internen Elements von x_train [?]
0,7 beträgt, werden Sie leichte Zeichen fühlen, sofern Sie diese Option nicht angeben. Es wird nicht reflektiert.
Sie können die für die Ausgabe verwendete ** Farbkarte ** ändern, indem Sie den Wert des Schlüsselwortarguments cmap
ändern. Sie können die Liste der als Voreinstellungen bereitgestellten Farbkarten in matplotlib Reference überprüfen. Wenn Sie beispielsweise "cmap =" Greens "" setzen, lautet die Ausgabe wie folgt (0.0 ist ebenfalls hellgrün).
Sie können auch die Farbkarte anpassen. Informationen zur spezifischen Methode finden Sie unter "Ich möchte eine wunderschön angepasste Wärmekarte der Korrelationsmatrix ausgeben. Matplotlib ed. @ Qiita".
Wenn Sie überprüfen möchten, wie handschriftliche Daten für eine bestimmte Nummer vorhanden sind (z. B. "7"), können Sie diese mit dem folgenden Code ausgeben.
python
import numpy as np
import matplotlib.pyplot as plt
x_subset = x_train[ y_train == 7 ] # (1)
fig, ax = plt.subplots(nrows=8, ncols=8, figsize=(5, 5), dpi=120)
for i, ax in enumerate( np.ravel(ax) ):
ax.imshow(x_subset[i],interpolation='nearest',vmin=0.,vmax=1.,cmap='Greys')
ax.tick_params(axis='both', which='both', left=False,
labelleft=False, bottom=False, labelbottom=False) # (2)
Das Ausführungsergebnis ist wie folgt. Wenn Sie einen anderen Wert als 7 ausgeben möchten, ändern Sie den Wert von "y_train == 7" in (1) des obigen Codes. Das ax.tick_params (...)
in (2) dient zum Löschen der X- und Y-Achsenskalen.
Wenn Sie sich die Liste ansehen, können Sie sehen, dass selbst unter diesen 64 Blättern ** mindestens einige wie "1" ** aussehen (dh sie sind enthalten). , Richtige Antwortrate 1.0000 ist extrem schwierig).
Ich fand heraus, dass die Eingabedaten mit einem sehr kurzen Code abgebildet und ausgegeben werden können.
Was ist hier der Wert des Elements in welcher Zeile und Spalte der einzelnen Eingabedaten wie folgt? Ich werde es so ändern, dass ich bis zu bestätigen kann. Die roten Buchstaben oben links sind die Werte der entsprechenden korrekten Antwortdaten.
python
import numpy as np
import matplotlib.pyplot as plt
import matplotlib.patheffects as pe
import matplotlib.transforms as ts
i = 2 #Index der anzuzeigenden Daten
plt.figure(dpi=120)
plt.imshow(x_train[i],interpolation='nearest',vmin=0.,vmax=1.,cmap='Greys')
h, w = 28, 28
plt.xlim(-0.5,w-0.5) #Zeichenbereich in Richtung der X-Achse
plt.ylim(h-0.5,-0.5) #In Richtung der Y-Achse ...
#
plt.tick_params(axis='both', which='major',
left=False, labelleft=False,
bottom=False, labelbottom=False)
plt.tick_params(axis='both', which='minor',
left=False, labelleft=True,
top=False, labeltop=True,
bottom=False, labelbottom=False)
#Gittereinstellung für jede Achse
plt.gca().set_xticks(np.arange(0.5, w-0.5,1)) #Gitter in 1-Punkt-Einheiten
plt.gca().set_yticks(np.arange(0.5, h-0.5,1))
plt.grid( color='tab:green', linewidth=1, alpha=0.5)
#Beschriftungseinstellung für jede Achse
plt.gca().set_xticks(np.arange(0, w),minor=True)
plt.gca().set_xticklabels(np.arange(0, w),minor=True, fontsize=5)
plt.gca().set_yticks(np.arange(0, h),minor=True)
plt.gca().set_yticklabels(np.arange(0, h),minor=True, fontsize=5)
#Feineinstellung der Etikettenposition
offset = ts.ScaledTranslation(0, -0.07, plt.gcf().dpi_scale_trans)
for label in plt.gca().xaxis.get_minorticklabels() :
label.set_transform(label.get_transform() + offset)
offset = ts.ScaledTranslation(0.03, 0, plt.gcf().dpi_scale_trans)
for label in plt.gca().yaxis.get_minorticklabels() :
label.set_transform(label.get_transform() + offset)
#Die richtigen Antwortdaten werden oben links angezeigt (weißer Rand).
t = plt.text(1, 1, f'{y_train[i]}', verticalalignment='top', fontsize=20, color='tab:red')
t.set_path_effects([pe.Stroke(linewidth=5, foreground='white'), pe.Normal()])
plt.colorbar( pad=0.01 ) #Farbbalkenanzeige rechts
Die Eingabedaten bestehen aus $ 28 \ times 28 = 784 $ Elementen, die jeweils Werte von 0,0 bis 1,0 enthalten, und ich möchte ein Histogramm der Verteilung erstellen.
python
import numpy as np
import matplotlib.pyplot as plt
i = 0 #Index der anzuzeigenden Daten
h = plt.hist(np.ravel(x_train[i]), bins=10, color='black')
plt.xticks(np.linspace(0,1,11))
print(h[0]) #Ausführungsergebnis-> [639. 11. 6. 11. 6. 9. 11. 12. 11. 68.]
print(h[1]) #Ausführungsergebnis-> [0. 0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9 1. ]
Der Rückgabewert von plt.hist (...)
enthält die Häufigkeit jeder Klasse. Im obigen Beispiel sehen Sie, dass es 639 Pixel mit Werten im Bereich von $ 0.0 \ le v <0.1 $ gibt. Nur ganz rechts liegt der Bereich bei $ 0,9 \ le v \ le 1,0 $, einschließlich Daten mit einem Wert von genau 1,0.
Wenn Sie tatsächlich "print (h [0] .sum ())" ausführen, erhalten Sie "784.0", und Sie können sehen, dass die Elemente mit einem Wert von genau 1,0 ebenfalls ordnungsgemäß gezählt werden.
Recommended Posts