[PYTHON] Fordern Sie die Bildklassifizierung mit TensorFlow2 + Keras 3 heraus ~ Visualisieren Sie MNIST-Daten ~

Einführung

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.

xtrain3.png

Datennormalisierung

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.

Anzeige vorerst

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')

xtrain0_1.png

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).

xtrain0_1g.png

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".

Side-by-Side-Ausgabe von handgeschriebenen Bildern für bestimmte Nummern

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.

xtrain1.png

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).

Formatieren und Anzeigen

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.

xtrain3.png

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

Graustufenwert-Histogramm

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. ]

hist.png

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.

nächstes Mal

Recommended Posts

Fordern Sie die Bildklassifizierung mit TensorFlow2 + Keras 3 heraus ~ Visualisieren Sie MNIST-Daten ~
Fordern Sie die Bildklassifizierung mit TensorFlow2 + Keras 4 heraus. ~ Lassen Sie uns mit dem trainierten Modell ~ vorhersagen
Fordern Sie die Bildklassifizierung mit TensorFlow2 + Keras 9 heraus. Lernen, Speichern und Laden von Modellen
Fordern Sie die Bildklassifizierung mit TensorFlow2 + Keras CNN 1 heraus ~ Bewegen Sie sich vorerst ~
MNIST (DCNN) mit Keras (TensorFlow-Backend)
Fordern Sie die Bildklassifizierung mit TensorFlow2 + Keras heraus. 6-Versuchen Sie, die von Ihnen erstellten Bilder vorzuverarbeiten und zu klassifizieren.
Fordern Sie die Bildklassifizierung mit TensorFlow2 + Keras 2 heraus ~ Schauen wir uns die Eingabedaten genauer an ~
Fordern Sie die Bildklassifizierung durch TensorFlow2 + Keras 1-Move vorerst heraus.
Fordern Sie die Bildklassifizierung durch TensorFlow2 + Keras 5 heraus ~ Beobachten Sie Bilder, die nicht klassifiziert werden können ~
Fordern Sie die Bildklassifizierung mit TensorFlow2 + Keras heraus. 7 - Grundlegendes zu Layertypen und Aktivierungsfunktionen -
MNIST-Bildklassifizierung (handschriftliche Nummer) mit mehrschichtigem Perzeptron
Bilderkennung mit Keras
Daten mit TensorFlow lesen
Identifizieren Sie den Namen aus dem Blumenbild mit Keras (Tensorfluss)
Versuchen Sie TensorFlow MNIST mit RNN
Bilderkennung mit Keras + OpenCV
Bildklassifizierung mit selbst erstelltem neuronalen Netzwerk von Keras und PyTorch
[TensorFlow] [Keras] Aufbau eines neuronalen Netzwerks mit Keras
Bildklassifizierung mit Weitwinkel-Fundusbilddatensatz
Versuchen Sie Daten parallel zu Distributed TensorFlow
Bildklassifizierung mit Keras-Von der Vorverarbeitung zum Klassifizierungstest-
Lernen Sie mit TensorFlow Y = 2X verteilte Daten
Ich habe versucht, AutoEncoder mit TensorFlow zu visualisieren
Vergleichen Sie rohen TensorFlow mit tf.contrib.learn und Keras
Kochobjekterkennung durch Yolo + Bildklassifizierung
Fügen Sie unter Beibehaltung der Modellstruktur der Bildklassifizierung (mnist) einen Autoencoder hinzu, um die Genauigkeit von Ende zu Ende zu verbessern. [Tensorflow, Keras, Mnist, Autoencder]
Visualisieren Sie Korona-Infektionsdaten in Tokio mit matplotlib
Ich habe versucht, GAN (mnist) mit Keras zu bewegen
Generieren und veröffentlichen Sie Dummy-Bilddaten mit Django
Visualisieren Sie Yugioh-Kartendaten mit Python - Yugiou Data Science 1. EDA Edition
Das MNIST-Tutorial von TensorFlow wurde mit der Bildeingabe kompatibel gemacht
Fordern Sie die Textklassifizierung von Naive Bayes mit sklearn heraus
Visualisieren Sie Daten interaktiv mit TreasureData, Pandas und Jupyter.
Folium: Visualisieren Sie Daten auf einer Karte mit Python
Richter Yosakoi Naruko nach Bildklassifikation von Tensorflow.
Probieren Sie Theano mit Kaggles MNIST-Daten ~ Logistic Return ~ aus
Zeigen Sie das Bild nach der Datenerweiterung mit Pytorch an