Jouez-vous à Pokémon? Je l'ai acheté pour la première fois en 10 ans ~~ Je l'ai obtenu du Père Noël. Dans le but d'être une force forte, nous prévoyons de rester à la maison et de sélectionner avec soin pendant les vacances de fin d'année et du Nouvel An. Je me demandais si Advent Calendar pouvait faire quelque chose avec Pokemon Neta, alors j'ai essayé ** une méthode qui montre la base pour juger un modèle d'apprentissage en profondeur ** qui m'intéresse récemment, en utilisant ** Pokemon Three Family Classification comme exemple **. Vu.
L'apprentissage en profondeur commence à être mis en œuvre dans la société dans divers domaines, mais il a tendance à être une boîte noire sur la base de laquelle le modèle prend des décisions. Ces dernières années, des recherches sur «l'explication» et «l'interprétable» des modèles sont en cours.
Par conséquent, cette fois, j'aimerais essayer la méthode Quantitative Testing with Concept Activation Vectors (TCAV) adoptée dans ICML 2018.
Dérivation de CAV en apprenant un classificateur linéaire entre une image conceptuelle et un contre-exemple aléatoire et en obtenant un vecteur orthogonal à la frontière de décision. (Il est plus rapide de voir la figure ci-dessous).
Le ** «concept» ** que le modèle apprend peut être quantifié sous une forme ** interprétable par l'homme **. Exemple: apprentissage du "motif rayé" à partir du "motif à points" dans la classification "shimauma" Vous pouvez également voir l'apprentissage dans n'importe quelle couche, de sorte que vous pouvez voir comment les caractéristiques grossières / fines sont capturées dans les couches peu profondes / profondes.
Comprendre le ** biais ** de l'ensemble de données Exemple: Dans la classe "Tablier", le concept de "femme" est lié, dans la classe "Ballon de rugby", le concept de "blanc" est lié --Peut être utilisé comme trieur d'images (peut être trié en fonction de la similitude avec les images conceptuelles)
Cette fois, mon objectif est de déplacer TCAV, donc j'en ai fait une tâche simple. Créez un classificateur Pokemon Three Family.
Les images suivantes ont été collectées à l'aide de icrawler. Je vais mettre le code.
import os
from icrawler.builtin import GoogleImageCrawler
save_dir = '../datasets/hibany'
os.makedirs(save_dir, exist_ok=True)
query = 'Scorbunny'
max_num = 200
google_crawler = GoogleImageCrawler(storage={'root_dir': save_dir})
google_crawler.crawl(keyword=query, max_num=max_num)
Seul un traitement minimal.
Les images ont été collectées comme ça. (Au fait, j'ai été une décision rapide pour Hibani. J'adore le type de flamme)
Scorbunny | Messon | Sarnori |
---|---|---|
156 feuilles | 147 feuilles | 182 feuilles |
Les Pokémon suivants autres que les trois familles, les images de personnages et les illustrations surdéformées étaient également confondus, ils sont donc exclus par inspection visuelle. ~~ Kibana San Cool ~~
C'est un simple CNN.
Comme le nombre d'images des données de test est petit (environ 15 feuilles), la précision des données de test flotte, mais nous avons créé un modèle de classification avec une précision qui sera suffisante pour la vérification TCAV.
Vous aurez besoin d'un fichier **. Pb ** pour calculer le CAV, donc enregistrez le modèle au format .pb. Ensuite, préparez-vous à voir ce que le modèle apprend.
Suivez les étapes ci-dessous pour vous préparer. (Le code que j'ai utilisé cette fois-ci est sur ici. J'écrirai correctement le README plus tard ...)
L'image suivante est préparée pour l'image d'exemple standard. Nous avons préparé plusieurs couleurs en partant de l'hypothèse que nous classerions les trois familles en regardant les couleurs. (Bien que cela fonctionne avec 10 à 20 feuilles, il est préférable d'avoir environ 50 à 200 feuilles)
** Exemple d'image d'exemple **
blanc | rouge | Bleu | Jaune | vert | noir |
---|---|---|---|---|---|
22 feuilles | 20 feuilles | 15 feuilles | 18 feuilles | 21 feuilles | 17 feuilles |
J'exclus ceux qui ont trop de couleurs
** Exemple d'image négatif ** Tout ce qui ne rentre dans aucun des exemples ci-dessus est souhaitable. (Dans ce cas, il est difficile de dire qu'il ne correspond à aucune couleur.) Cette fois, j'ai pris au hasard des images de Caltech256.
La structure du répertoire des images collectées jusqu'à présent est la suivante. Tous les ensembles d'images conceptuelles doivent être des sous-répertoires.
├── datasets
│ ├── for_tcav #Jeu de données pour TCAV
│ │ ├── black
│ │ ├── blue
│ │ ├── green
│ │ ├── hibany
│ │ ├── messon
│ │ ├── random500_0
│ │ ├── random500_1
│ │ ├── random500_2
│ │ ├── random500_3
│ │ ├── random500_4
│ │ ├── random500_5
│ │ ├── red
│ │ ├── sarunori
│ │ ├── white
│ │ └── yellow
│ └── splited #Ensemble de données pour la création de modèles de classification d'images
│ ├── test
│ │ ├── hibany
│ │ ├── messon
│ │ └── sarunori
│ ├── train
│ │ ├── hibany
│ │ ├── messon
│ │ └── sarunori
│ └── validation
│ ├── hibany
│ ├── messon
│ └── sarunori
Je vais d'abord le cloner.
git clone [email protected]:tensorflow/tcav.git
Ici, nous allons créer un wrapper pour transmettre les informations du modèle à TCAV. Ajoutez cette classe à tcav / model.py.
class SimepleCNNWrapper_public(PublicImageModelWrapper):
def __init__(self, sess, model_saved_path, labels_path):
self.image_value_range = (0, 1)
image_shape_v3 = [256, 256, 3]
endpoints_v3 = dict(
input='conv2d_1_input:0',
logit='activation_6/Softmax:0',
prediction='activation_6/Softmax:0',
pre_avgpool='max_pooling2d_3/MaxPool:0',
logit_weight='activation_6/Softmax:0',
logit_bias='dense_1/bias:0',
)
self.sess = sess
super(SimepleCNNWrapper_public, self).__init__(sess,
model_saved_path,
labels_path,
image_shape_v3,
endpoints_v3,
scope='import')
self.model_name = 'SimepleCNNWrapper_public'
Maintenant, vous êtes prêt à partir. Voyons le résultat immédiatement.
Jetons un coup d'œil aux concepts (les couleurs cette fois) qui sont importants dans chaque classe. Les concepts non marqués d'un * sont importants.
Classe Hibani | Classe Messon | Classe Sarnori |
---|---|---|
Rouge / jaune / blanc | rouge(!?) | vert |
Je pense que Hibani et Sarnori sont comme ça. Le messon est un mystère, il est donc important de le considérer. Si vous changez le nombre d'essais ou le nombre d'images conceptuelles / images cibles pendant l'expérience, les résultats changeront considérablement, donc je pense qu'il est nécessaire d'envisager un peu plus. Cela semble valoir la peine d'essayer diverses choses car cela semble changer en fonction de la façon dont vous choisissez l'image conceptuelle.
J'ai essayé une méthode pour montrer la base de jugement du modèle de réseau neuronal. C'était facile pour les humains à interpréter, et le résultat était ** "intuitivement comme ça" **. Cette fois, j'ai choisi la couleur comme image conceptuelle car elle est classée comme une famille à trois familles, mais il est difficile de préparer l'image conceptuelle. .. Vous devez effectuer diverses préparations, mais vous n'avez pas besoin de réapprendre le modèle, et si vous essayez une fois la série d'étapes et que vous vous y habituez, vous pouvez l'utiliser facilement. Veuillez essayer par tous les moyens essayez!
Recommended Posts