[PYTHON] Astuces de fourniture de données utilisant deque dans l'apprentissage automatique

Lorsque vous traitez un grand nombre de fichiers image dans une tâche d'apprentissage automatique, il est courant de répertorier les noms de fichiers et de lire les images de manière séquentielle dans le processus d'apprentissage. Cependant, en raison de la relation entre le nombre d'échantillons préparés et la taille du mini-lot dans le processus d'apprentissage, des fractions sont inévitablement générées dans la seconde moitié de l'apprentissage, et la manipulation a tendance à être compliquée.

Par exemple, si le nombre d'échantillons de données est num = 100 et la taille du mini-lot batch_size = 30

  1. Exécutez le mini-lot 3 fois et n'utilisez pas 10 échantillons.
  2. Ajustez la taille dans le mini-lot suivant (batch_size = 10).
  3. Dans la taille du mini-lot suivante, si le nombre d'échantillons (20) est insuffisant, l'échantillon utilisé une fois est réutilisé.

La méthode de est concevable. Si le nombre d'échantillons est important, l'option 1 ci-dessus convient, mais si vous souhaitez utiliser les données d'entraînement avec précaution, vous devrez sélectionner les options 2 et 3.

Ici, nous allons implémenter la méthode de l'option 3 avec deque.

Qu'est-ce que deque

L'explication est tirée de l'introduction Python3.

deque (prononcé deck) est un cue aux deux extrémités et a les fonctions de stack et de cue. Ceci est utile lorsque vous souhaitez pouvoir ajouter ou supprimer des éléments à l'une ou l'autre extrémité de la séquence.

Cette explication est illustrée ci-dessous.

deque_image.png

Cette fois, la fonction deque.rotate () a été utilisée pour "réutiliser l'échantillon de données". (Le processus de "rotation si les données sont utilisées, rotation si utilisé, ..." est exécuté.)

la mise en oeuvre

Prenons le cas où le fichier de données est développé comme suit.

$ ls deque_ex/*.jpg
deque_ex/img_0.jpg  deque_ex/img_3.jpg  deque_ex/img_6.jpg  deque_ex/img_9.jpg
deque_ex/img_1.jpg  deque_ex/img_4.jpg  deque_ex/img_7.jpg
deque_ex/img_2.jpg  deque_ex/img_5.jpg  deque_ex/img_8.jpg

Tout d'abord, faites une liste (deck) des noms de fichiers à gérer.

import glob
from collections import deque
import numpy as np

def mk_list():
    fname_list = glob.glob('*.jpg')
    sorted_fn = sorted(fname_list)
    deq_fname = deque()
    deq_fname.extend(sorted_fn)   # 'extend' is right, 
                                  # 'append' is not good.
    
    return deq_fname

Le but est d'utiliser deque.extend () au lieu de deque.append () lors de l'ajout de la liste au deck.

>>>
deque(['img_0.jpg',
       'img_1.jpg',
       'img_2.jpg',
       'img_3.jpg',
       'img_4.jpg',
       'img_5.jpg',
       'img_6.jpg',
       'img_7.jpg',
       'img_8.jpg',
       'img_9.jpg'])

La fonction qui renvoie les données de la liste de données (pour être exact, la classe deque) et le nombre de requêtes est la suivante. (Utilisez les tranches de liste et deque.rotate ().)

def feed_fn_ver0(dq, num):
    feed = list(dq)[-num:]
    dq.rotate(num)
    
    return feed

La situation dans laquelle 3 échantillons de données ont été prélevés 5 fois en utilisant ceci est la suivante.

0: ['img_7.jpg', 'img_8.jpg', 'img_9.jpg']
1: ['img_4.jpg', 'img_5.jpg', 'img_6.jpg']
2: ['img_1.jpg', 'img_2.jpg', 'img_3.jpg']
3: ['img_8.jpg', 'img_9.jpg', 'img_0.jpg']
4: ['img_5.jpg', 'img_6.jpg', 'img_7.jpg']

Nous avons pu récupérer 3 échantillons à la fin du jeu de données. Il n'y a aucun problème à l'utiliser dans un processus d'apprentissage automatique qui ne se soucie pas de la commande, mais comme «de la fin» est un peu désagréable, je l'ai corrigé en «depuis le début» et j'ai ensuite vérifié la longueur de données requise. Code.

def feed_fn_ver1(dq, num):
    '''
      dq  : data source (deque)
      num : request size (int)
    '''
    # check length
    assert num <= len(dq)
   
    feed = list(dq)[:num]
    dq.rotate(-num)

    return feed

my_list = mk_list()
for i in range(5):
    print(' Feed [', i, ']: ', feed_fn_ver1(my_list, 3))
    
>>>
 Feed [ 0 ]:  ['img_0.jpg', 'img_1.jpg', 'img_2.jpg']
 Feed [ 1 ]:  ['img_3.jpg', 'img_4.jpg', 'img_5.jpg']
 Feed [ 2 ]:  ['img_6.jpg', 'img_7.jpg', 'img_8.jpg']
 Feed [ 3 ]:  ['img_9.jpg', 'img_0.jpg', 'img_1.jpg']
 Feed [ 4 ]:  ['img_2.jpg', 'img_3.jpg', 'img_4.jpg']

Cela a bien fonctionné. Les données mélangées au hasard sont les suivantes.

def mk_list_shuffle():
    fname_list = glob.glob('*.jpg')
    np_list_fn = np.array(fname_list)
    np.random.shuffle(np_list_fn)
    deq_fname = deque()
    deq_fname.extend(list(np_list_fn))
    
    return deq_fname

my_list = mk_list_shuffle()
for i in range(5):
    print(' Feed [', i, ']: ', feed_fn_ver1(my_list, 3))

>>>
 Feed [ 0 ]:  ['img_9.jpg', 'img_7.jpg', 'img_6.jpg']
 Feed [ 1 ]:  ['img_1.jpg', 'img_8.jpg', 'img_3.jpg']
 Feed [ 2 ]:  ['img_4.jpg', 'img_0.jpg', 'img_2.jpg']
 Feed [ 3 ]:  ['img_5.jpg', 'img_9.jpg', 'img_7.jpg']
 Feed [ 4 ]:  ['img_6.jpg', 'img_1.jpg', 'img_8.jpg']

C'est un peu difficile à comprendre, mais quand on plisse les yeux, on voit que les données peuvent être fournies en circulant correctement. En utilisant cette fonction (feed_fn_ver1 ()), le processus de formation pour l'apprentissage automatique devrait être simple.

(Le code ci-dessus a été confirmé dans l'environnement de Python 2.7.11 et Python 3.5.1.)

Références (site Web)

--Introduction Python3 http://www.oreilly.co.jp/books/9784873117386/

Recommended Posts

Astuces de fourniture de données utilisant deque dans l'apprentissage automatique
Apprentissage automatique dans Delemas (acquisition de données)
Prétraitement dans l'apprentissage automatique 2 Acquisition de données
Prétraitement dans l'apprentissage automatique 4 Conversion de données
Python: prétraitement en machine learning: acquisition de données
Python: prétraitement dans l'apprentissage automatique: conversion de données
Prétraitement dans l'apprentissage automatique 1 Processus d'analyse des données
Ensemble de données pour l'apprentissage automatique
Apprentissage automatique dans Delemas (s'entraîner)
Utilisé en EDA pour l'apprentissage automatique
Prétraitement dans l'apprentissage automatique 3 Données de valeur manquante / aberrante / de déséquilibre
Automatisez les tâches de routine dans l'apprentissage automatique
Classification et régression dans l'apprentissage automatique
Python: prétraitement dans l'apprentissage automatique: présentation
Recherche de semences aléatoires dans l'apprentissage automatique
Procédure d'apprentissage automatique de base: ② Préparer les données
Développement d'applications à l'aide d'Azure Machine Learning
Comment collecter des données d'apprentissage automatique
[Tutoriel] Créez un extracteur d'expressions unique en 30 minutes à l'aide de l'apprentissage automatique
Prévision du cours des actions à l'aide de l'apprentissage automatique (scikit-learn)
[Apprentissage automatique] Classification des sujets LDA à l'aide de scikit-learn
Sklearn de données déséquilibrées avec apprentissage automatique k-NN
[python] Techniques souvent utilisées dans l'apprentissage automatique
[Apprentissage automatique] Prédiction FX à l'aide de l'arbre de décision
Modèle de reconnaissance d'image utilisant l'apprentissage profond en 2016
Obtenez des données Youtube en Python à l'aide de l'API Youtube Data
Apprentissage automatique
J'ai essayé de classer les accords de guitare en temps réel en utilisant l'apprentissage automatique
[Apprentissage automatique] Apprentissage supervisé utilisant l'estimation de la densité du noyau
[Python] Première analyse de données / apprentissage automatique (Kaggle)
Prévision du cours des actions à l'aide de l'apprentissage automatique (édition de retour)
[Python] Enregistrement des résultats d'apprentissage (modèles) dans l'apprentissage automatique
Python: prétraitement en machine learning: gestion des données manquantes / aberrantes / déséquilibrées
SELECT des données à l'aide de la bibliothèque cliente avec BigQuery
[Apprentissage automatique] Analyse de régression à l'aide de scicit learn
Comment créer un ensemble de données d'image de visage utilisé dans l'apprentissage automatique (1: Acquérir des images de candidats à l'aide du service API Web)
Un mémorandum de méthode souvent utilisé dans l'apprentissage automatique utilisant scikit-learn (pour les débutants)
Une histoire sur l'apprentissage automatique simple avec TensorFlow
Divulgation complète des méthodes utilisées dans l'apprentissage automatique
[Apprentissage automatique] Apprentissage supervisé utilisant l'estimation de la densité du noyau Partie 2
[Python] Analyse de données, pratique du machine learning (Kaggle) -Prétraitement des données-
[Apprentissage automatique] Apprentissage supervisé utilisant l'estimation de la densité du noyau Partie 3
Division des données de formation en apprentissage automatique et apprentissage / prédiction / vérification
Résumé des fonctions d'évaluation utilisées dans l'apprentissage automatique
Touchons une partie de l'apprentissage automatique avec Python
J'ai commencé l'apprentissage automatique avec le prétraitement des données Python
Prévision du cours de l'action à l'aide du Deep Learning [acquisition de données]
Essayez d'utiliser le bloc-notes Jupyter à partir d'Azure Machine Learning
Histoire de l'analyse de données par apprentissage automatique
[Pour les débutants] Introduction à la vectorisation dans l'apprentissage automatique
[Apprentissage automatique] Extraire des mots similaires mécaniquement en utilisant WordNet
Raisonnement causal utilisant l'apprentissage automatique (organisation des méthodes de raisonnement causal)
Comment diviser les données de formation en machine learning en variables objectives et autres dans Pandas
[Memo] Apprentissage automatique
Classification de l'apprentissage automatique
Exemple d'apprentissage automatique
Ce que j'ai appris sur l'IA / l'apprentissage automatique avec Python (1)
Créer un bot de collecte de données en Python à l'aide de Selenium
Créez un environnement interactif pour l'apprentissage automatique avec Python