[PYTHON] Affichage des inférences et des résultats avec Tensorflow + matplotlib

1.Tout d'abord

J'ai pu évaluer le modèle avec Tensorflow, PyTorch et Chainer, mais ne serait-il pas possible d'afficher uniquement les graphiques de précision et de perte aux personnes qui ne sont pas familiarisées avec le Deep Learning? En outre, cette image est la bonne réponse rapidement! Ceci est une erreur! Il y aura des scènes où vous serez heureux de voir ça. Afin de réaliser un tel souhait, je voudrais réaliser avec Matplotlib que le résultat du jugement sera affiché sur plusieurs images côte à côte.

"--- Un garçon heureux. Ton souhait se réalisera enfin." ezgif-5-fd49eded978e.gif

De plus, cette fois, nous utiliserons Tensorflow comme exemple, mais la partie d'affichage de l'image peut être n'importe quel framework.

2. Mise en œuvre et explication

À titre d'exemple, j'ai préparé un modèle qui a entraîné MNIST à l'aide de Tensorflow. Cette fois, 40 images seront utilisées.

validation.py


from matplotlib import pyplot as plt
import numpy as np
import tensorflow as tf

#Réglage du nombre d'images d'affichage
row = 4
col = 10

#Chargement des données
mnist = tf.keras.datasets.mnist
(_, _), (x_test, y_test) = mnist.load_data()
x_test = np.asarray(x_test[0:row*col])
y_test = np.asarray(y_test[0:row*col])

#Chargement du modèle
path = 'mnist.h5' #Chemin du modèle formé
model = tf.keras.models.load_model(path)

#inférence
x_test_flat = x_test.reshape(-1, 784) / 255.0
result = model.predict(x_test_flat)

#Alignement d'image
plt.figure(figsize=(5, 5))
image_array = []
for i, image in enumerate(x_test):
    image_array.append(plt.subplot(row, col, i + 1))
    plt.axis('off')
    plt.imshow(image, cmap='gray')
plt.pause(0.1)

#Placement des étiquettes
for j, image in enumerate(x_test):
    bg_color = 'skyblue' if y_test[j] == np.argmax(result[j]) else 'red'
    image_array[j].text(0, 0, np.argmax(result[j]), color='black', backgroundcolor=bg_color)
    plt.pause(0.1)

#Enregistrer l'image entière
plt.savefig('judge_result.png')

À propos du raisonnement

Il est écrit sur divers sites jusqu'au point d'apprentissage / d'évaluation et de sortie d'un graphique du taux de reconnaissance. Cependant, il est étonnamment rare qu'il existe une description de la déduction de quelque chose avec le modèle appris. (Bien que ce soit ma propre expérience ...)

x_test_flat = x_test.reshape(-1, 784) / 255.0
result = model.predict(x_test_flat)

tensorflow.keras.models a une méthode appelée predire (), qui est utilisée pour l'inférence. Transmettez à cette méthode un tableau d'images que vous souhaitez déduire. Puisque l'entrée du modèle est unidimensionnelle, je l'ai converti en un tableau unidimensionnel avec reshape (-1, 784). Puisque nous traitons 40 feuilles à la fois cette fois, nous passerons un tableau de (40, 784), mais même lors du traitement d'une seule feuille, nous devons le passer comme (1, 784).

Dans Chainer, il est possible (devrait) être déduit en écrivant result = model.predictor (test_x) .data [0].

À propos de l'affichage de l'image

Avec matplotlib, vous pouvez écrire de manière orientée objet.

plt.figure(figsize=(5, 5))
image_array = []
for i, image in enumerate(x_test):
    image_array.append(plt.subplot(row, col, i + 1))
    plt.axis('off')
    plt.imshow(image, cmap='gray')
plt.pause(0.05)

Dans la première instruction for, utilisez plt.subplot pour organiser les images. plt.subplot est un élément enfant de figure. Passez (vertical, horizontal, nombre) comme argument. Le nombre qui représente le nombre est compté à partir de 1. (Notez que ce n'est pas de 0) D'abord, affichez toutes les images, puis ajoutez des étiquettes aux éléments enfants, alors ajoutons ʻappend () pour que vous puissiez les utiliser. (Si vous voulez juste l'afficher, vous n'avez pas besoin de le mettre dans le tableau, mais je veux ajouter une étiquette plus tard, donc cette fois je vais le faire comme ça.) De plus, puisqu'il s'agit cette fois d'une image et non d'un graphique, l'affichage des coordonnées est désactivé avec plt.axis ('off'). Lorsque vous avez terminé de préparer les images à organiser en une fois, affichez les images avec plt.pause (). Si vous le définissez sur plt.show (), le processus s'arrêtera là, alors j'utilise plt.pause ()`.

for j, image in enumerate(x_test):
    bg_color = 'skyblue' if y_test[j] == np.argmax(result[j]) else 'red'
    image_array[j].text(0, 0, np.argmax(result[j]), color='black', backgroundcolor=bg_color)
    plt.pause(0.05)

La seconde instruction for ajoute des étiquettes aux éléments de ʻimage_arrayun par un. Ajoutez le résultat de l'inférence à l'image avec ʻimage_array [j] .text (0, 0, np.argmax (result [j]). Si le résultat de l'inférence np.argmax (result [j]) et le libellé de réponse correct y_test [j] correspondent, l'arrière-plan est bleu, et s'ils ne correspondent pas, l'arrière-plan est rouge. Affichez l'étiquette à l'écran avec plt.pause (). L'argument est le temps pour afficher l'image, et changer cette valeur changera la vitesse de mise à jour de l'affichage. Veuillez noter que c'est la vitesse de mise à jour de "display", pas la vitesse de traitement du modèle.

3. Résumé

J'ai créé cette fois, mais je voulais l'utiliser dans la présentation de l'expérience étudiante, mais je n'ai pas pu l'implémenter à ce moment-là ... C'est facile à penser maintenant, mais cela peut être difficile selon le stade d'apprentissage. J'espère qu'il atteint les personnes qui viennent de commencer le Deep Learning ou qui ont suivi des cours de programmation mais qui ne l'aiment pas et ne le comprennent pas très bien.

Recommended Posts

Affichage des inférences et des résultats avec Tensorflow + matplotlib
Afficher le graphique japonais avec VS Code + matplotlib
Afficher les marqueurs au-dessus de la bordure avec matplotlib
[Mémo Jupyter Notebook] Afficher les kanji avec matplotlib
Animation avec matplotlib
Japonais avec matplotlib
Animation avec matplotlib
histogramme avec matplotlib
Faire une animation avec matplotlib
Zundokokiyoshi avec TensorFlow
Casser des blocs avec Tensorflow
Je souhaite afficher plusieurs images avec matplotlib.
Comment afficher des images en continu avec matplotlib Memo
Graphique 2 axes avec Matplotlib
Lecture de données avec TensorFlow
Prévisions de courses de bateaux avec TensorFlow
Carte thermique par Python + matplotlib
Graphique de bande avec matplotlib
Apprenez avec Chemo Informatics Matplotlib
Dessin en temps réel avec matplotlib
Différentes barres de couleurs avec Matplotlib
Graphique 3D avec matplotlib
Afficher le graphique lors de la modification des paramètres avec PySimpleGUI + Matplotlib
Affichage de la barre des tâches avec tqdm
Essayez la régression avec TensorFlow
Ajustez les axes avec matplotlib
[Python] Lisez le fichier csv et affichez la figure avec matplotlib
Traduire Premiers pas avec TensorFlow
Graphique des données Excel avec matplotlib (1)
Essayez l'apprentissage en profondeur avec TensorFlow
Affichage japonais de matplotlib, seaborn
Fonction sinueuse approximative avec TensorFlow
Essayez d'utiliser matplotlib avec PyCharm
Méthode de dessin graphique avec matplotlib
Graphique des données Excel avec matplotlib (2)
Prévision du cours de l'action avec tensorflow
Bar plot empilable avec matplotlib
Affichage graphique en temps réel par matplotlib
[Python] Estimation bayésienne avec Pyro
Sélectionnez les couleurs en dégradé avec matplotlib
Animer plusieurs graphiques avec matplotlib
Essayez TensorFlow MNIST avec RNN
TensorFlow 2.X & TensorRT est la première étape pour accélérer l'inférence
Deux façons d'afficher plusieurs graphiques dans une seule image avec matplotlib