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."
De plus, cette fois, nous utiliserons Tensorflow comme exemple, mais la partie d'affichage de l'image peut être n'importe quel framework.
À 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')
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]
.
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.
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