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
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.
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.
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é.)
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.)
--Introduction Python3 http://www.oreilly.co.jp/books/9784873117386/